Форум программистов, компьютерный форум, киберфорум
Van111
Войти
Регистрация
Восстановить пароль
Карта форума Блоги Сообщество Поиск Заказать работу  
Оценить эту запись

поиск адреса функции в ядре kernel32

Запись от Van111 размещена 21.05.2012 в 19:43
Обновил(-а) Van111 21.05.2012 в 21:10

Наконец то я написал этот модуль. Использовал Литературу -Путеводитель по написанию вирусов под Win32.chm и учебник Зубкова.
сначала о стеке... все переменные у меня выглядит в качестве ebp -смещение переменной ,esp я отодвинул на сотню байт тем самым создав себе хранилище данных.

Чем примечателен этот код

1 для хранения и работы с переменными используются единственный сегмент который всегда доступен для чтения и записи -сегмент стека.
2 если посидеть над этим кодом и немного перелопатить то его свободно можно использовать в инжекте процессов , подмене dll и заражении PE заголовка exe файла
функции

Search_kernel32 -находит начала kernel
ввод eax=равен адресу возврата из нашей программы
вывод - eax= начала kernel

copy_str_code_to_stack -переписывает функции из сегмента кода в сегмент стека(мой каприз)
ввод ebp , delta смещение, смещение области для записи в стеке, указатель на строку, размер строки

Get_api_table -запишет в стек три интересных поля

Get_API_func ищет функцию
ввод указатель на строку(если это не стековая строка ,то надо чуть поколдавать с указателем на строку) : примерно вот так , размер строки
Assembler
1
2
3
4
mov edi,offset name_function
sub edi,ebp
push edi
push ecx
call Get_API_func
[ASM]

и ещё если собрались исполнятся в чужом адресном пространстве то не забудьте что функции вызываются вот так

Assembler
1
2
3
mov eax,offset func
add eax,[ebp-delta_offset]
call eax
код программы
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
.386
.model  flat,stdcall
 
include windows.inc
include kernel32.inc
include user32.inc
 
 
includelib user32.lib
 
includelib kernel32.lib
 
 
 
 
 
.stack  1000h
        .const
NameProcess db   'chrome.exe',0
K_32Limit    equ                        4
nuclea_kernel    equ                8
name_function    equ            70
address_offset_functions     equ        23
address_ofset_name_function equ     27
adress_ordinal  equ             31
 
.data
temp    dd  0 
.code
code_begin:
Search_kernel32 proc 
 
Search_kernel32_1:
    cmp byte ptr ss:[ebp-K_32Limit],00h
    jz kernel_limit_end
 
    cmp word ptr cs:[esi],'ZM'
    jz kernel_search_ok
 
Search_kernel32_2:
    dec dword ptr ss:[ebp-K_32Limit]
    sub esi,10000h
    jmp Search_kernel32_1
 
kernel_search_ok:
 
    mov edi,cs:[esi+3ch]
    add edi,esi
    cmp word ptr cs:[edi],'EP'
    je kernel_search_ok_pe
 
 
kernel_limit_end:
    mov esi,0BFF70000h
 
kernel_search_ok_pe:  
 
    mov eax,esi
    ret
 
Search_kernel32 endp
 
Get_api_table proc
mov eax,ss:[ebp-nuclea_kernel]
add eax,3ch ;offset PE
 
mov eax,cs:[eax]
add eax,ss:[ebp-nuclea_kernel]; PE
add eax,78h     ;rva intresting_table
mov eax,[eax]       ;eax = intresting_table
 
add eax,1ch     
add eax,ss:[ebp-nuclea_kernel]      ;intresting memo
 
mov esi,eax ;esi = begin intresting value
 
 
lodsd 
add eax,ss:[ebp-nuclea_kernel ]
mov ss:[ebp -address_offset_functions],eax
lodsd 
add eax,ss:[ebp-nuclea_kernel]
mov ss:[ebp -address_ofset_name_function],eax
lodsd 
add eax,ss:[ebp-nuclea_kernel ]
mov ss:[ebp -adress_ordinal],eax
 
ret
 
 
 
 
 
 
Get_api_table   endp
 
copy_str_code_to_stack proc
       ;0 - return address ,ofset stack
       ;4 - ecx
       ;8 -esi
       ;12 -edi
       ;16 edx-delta
       ;20 offset stack, return address
        mov eax,ss:[esp]
        mov ebx,ss:[esp+20]
        mov ss:[esp],ebx
        mov ss:[esp+20],eax
        
        pop ebp
        pop ecx
        pop esi
        pop edi
        pop edx
        ;ds =cs ,es=ss        
        push ds
        push es
        
        push cs
        pop  ds
        
        push ss
        pop  es
        
        add esi,edx
        
        neg edi
        add edi,ebp
        
        
        rep movsb 
        pop es
        pop ds
        ret        
        
 
copy_str_code_to_stack endp
 
Get_API_func    proc
   mov eax,ss:[esp]
   mov ebx,ss:[esp+8]
   mov ss:[esp],ebx
   mov ss:[esp+8],eax
   
   pop edi
   pop edx
mov ecx,0ffffffffh; -1
;ecx = number function - 1 
Get_API_func_labe1:
inc ecx     
mov esi,dword ptr ss:[ebp-address_ofset_name_function] 
shl ecx,2
add esi,ecx  ; esi = esi + ecx * sizeof dword
shr ecx,2  ;return ecx
push esi
push ecx
 
mov esi,cs:[esi]
add esi,ss:[ebp-nuclea_kernel]
mov ecx,edx
push edi  
repe cmpsb    
pop edi 
pop ecx
pop esi
jz Get_API_func_find_ok
jmp Get_API_func_labe1
 
Get_API_func_find_ok:
 
shl ecx,1
mov eax,ecx
add eax,[ebp-adress_ordinal ]
 
mov ebx,eax
xor eax,eax
mov ax,[ebx]
 
 
 
shl     eax,2  
add eax,ss:[ebp-address_offset_functions]
mov eax,cs:[eax] ; !!!!!!!!!!!!! eax = VA function
add eax,ss:[ebp- nuclea_kernel] ; !!!!!!!!!!!!! eax = RVA function
 
ret
Get_API_func endp
 
 
 
 
start:
 
       call    delta
 delta:
        pop     edx
        sub     edx,offset delta
      
 
    
       mov esi,ss:[esp]
        xor si,si ;nuckea_kernel
        
        mov ebp,esp
        sub esp,100h ; realoc stack
        
        mov eax,50h
        mov ss:[ebp - K_32Limit],eax; input limit
        mov     ss:[ebp-nuclea_kernel],esi
       
       ;    copy_str_code_to_stack ////////////////
        push ebp
        push edx
        push name_function  ;edi
        push offset str_name_function;esi
        push sizeof str_name_function;ecx
        call copy_str_code_to_stack
       ;    copy_str_code_to_stack ////////////////
       
       ; Search_kernel32 ///////////////// 
        mov     esi,ss:[ebp-nuclea_kernel]
        call Search_kernel32
        mov ss:[ebp - nuclea_kernel],eax
       ; Search_kernel32 ///////////////// 
      
        ; Get_api_table
        call Get_api_table
        ; Get_api_table     
        
        ;Get_Api_func
        mov edi,ebp
        sub edi,name_function
        push edi
        push sizeof str_name_function
        call Get_API_func
        
        ;Get_Api_func
        
        push 0
        push 0
        call eax
        
 
        invoke ExitProcess,0
        
        str_name_function db       'CloseHandle',0
 
 
        
        
        ;size_name_MessageBox equ $ - offset name_MessageBox  
    qwe dd  0
code_size equ $-code_begin
end start
с нетерпением жду ваших комментариев
Всего комментариев 5
Комментарии
  1. Старый комментарий
    рано или поздно ,но надеюсь в этом месяце я переделаю код и подключу его к функции написанной на с++ в результате получится что с помощью ассемблера я получу из от ядра основные функции для подключения динамических библиотек.
    Запись от Van111 размещена 21.05.2012 в 19:49 Van111 вне форума
  2. Старый комментарий
    Аватар для _lucius_
    1) Код база зависимый! Например, при получении смещения на имя функции. Ты пишешь offset str_name_function. Это же адрес, а при внедрении адреса будут другие! И здесь тоже самое: offset delta.

    2) Ты берешь с верхушки стека указатель в кернел, выравниваешь его и сканируешь в сторону младших адресов. Т.е. код зависит от балансировки стека, что не есть хорошо. Лучше используй PEB. Я уже выкладывал свой код, который вызывает MessageBox, не используя не одной API. Который был протестирован на 32 разрядных Windows 2000, 2003, XP, VISTA и на 64 разрядной Windows 7. И везде удачно работал.
    Запись от _lucius_ размещена 25.05.2012 в 09:18 _lucius_ вне форума
  3. Старый комментарий
    1 ну я тут писал пример вызова функции в чужом адресном пространстве
    mov eax,offset func
    add eax,[ebp-delta_offset]
    call eax

    2 спасибо _lucius_
    Запись от Van111 размещена 25.05.2012 в 12:11 Van111 вне форума
  4. Старый комментарий
    Аватар для _lucius_
    Цитата:
    1 ну я тут писал пример вызова функции в чужом адресном пространстве
    mov eax,offset func
    add eax,[ebp-delta_offset]
    call eax
    Вот как раз с функциями все норм. Как они у тебя в коде так и оставь. В твоем случае, в инструкции call содержится расстояние до метки, а не адрес. Я тебе про обращение к строке говорю [push offset str_name_function]. И тут у тебя тоже [push offset str_name_function] адрес. Вот тебе примерчик как реализовать обращение к строкам.
    Assembler
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
        ; получаем дельта смещение
        call $+5
        pop eax
        
        ; макропеременные, содержат расстояние от дельта смещения до указателей на стороки
        pFName1 = FName1-$+1
        pFName2 = FName2-$+1
        pDName = DName-$+1
        pMess = Mess-$+1    
     
        ; помещаем в регистры указатели на строки ["дельта смещение" + "расстояние от дельта смещения до указателей на стороки"]
        lea edx,[eax + pFName1]
        lea ecx,[eax + pFName2]
        lea esi,[eax + pDName]
        lea edi,[eax + pMess]
     
        ; .... CODE ....
     
        FName1 db 'LoadLibraryExA',0
        FName2 db 'MessageBoxA',0
        DName  db 'user32.dll',0
        Mess   db 'Hello world!',0
    Запись от _lucius_ размещена 25.05.2012 в 14:45 _lucius_ вне форума
  5. Старый комментарий
    спасибо большое
    Запись от Van111 размещена 25.05.2012 в 18:25 Van111 вне форума
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru