标签:
系统 : Windows xp
程序 : 某游戏客户端
要求 : 脱去压缩壳
使用工具 : OD & PEID & LordPE & Import REC
被感染客户端中的是Ramint蠕虫病毒,感染速度非常快,危害相当大。建议在虚拟机环境下进行逆向分析。
相关资料:
Ramnit(W32.Ramnit)的初始形态是蠕虫病毒,首次出现于2010年,激进的自繁殖策略使其得到迅速传播。一旦入侵计算机,该病毒就会找出本地硬盘和移动硬盘上所有的EXE、DLL、HTM和HTML文件,通过自身副本感染这些文件。
本文参考了这篇帖子的12L回复:
会有一个新段位 rmnet的sfx段
取现在EP地址-(【EP+328】得到的偏移数)= 原始OEP
动态劫持脱壳
EP处直接粘贴该二进制
60 E8 00 00 00 00 5D 83 ED 06 2B AD 28 03 00 00 89 6C 24 1C 61 FF E0
静态脱壳
先提取rmnet区段数据。然后取得 EP+328数据用ep减即可。。。然后删除rmnet区段。
客户端入口点在病毒区段,其内容为:
00622000 > 60 pushad
00622001 E8 00000000 call 00622006
00622006 5D pop ebp
00622007 8BC5 mov eax, ebp
00622009 81ED 326F0120 sub ebp, 20016F32
0062200F 2B85 50720120 sub eax, dword ptr [ebp+20017250]
00622015 8985 4C720120 mov dword ptr [ebp+2001724C], eax
0062201B B0 00 mov al, 0
0062201D 8685 9E740120 xchg byte ptr [ebp+2001749E], al
00622023 3C 01 cmp al, 1
00622025 0F85 DE020000 jnz 00622309
按照帖子回复所说静态修改代码,其内容变为:
00622000 > 60 pushad
00622001 E8 00000000 call 00622006
00622006 5D pop ebp
00622007 83ED 06 sub ebp, 6
0062200A 2BAD 28030000 sub ebp, dword ptr [ebp+328]
00622010 896C24 1C mov dword ptr [esp+1C], ebp
00622014 61 popad
00622015 FFE0 jmp eax
以上指令找出了oep的位置,并直接跳转进入oep。也就是说,根本不用分析病毒行为,我们直接绕过它就可以。
脱壳时,运行到客户端真正的oep再完整转存内存映像,并在重建输入表的时候选择正确的oep,那么病毒代码就并不会执行。
紧接上部,jmp eax之后来到了程序的upx壳部分:
0060D080 60 pushad
0060D081 BE 00505700 mov esi, 00575000
0060D086 8DBE 00C0E8FF lea edi, dword ptr [esi+FFE8C000]
0060D08C 57 push edi
0060D08D 83CD FF or ebp, FFFFFFFF
0060D090 EB 10 jmp short 0060D0A2
0060D092 90 nop
0060D093 90 nop
0060D094 90 nop
0060D095 90 nop
0060D096 90 nop
0060D097 90 nop
0060D098 8A06 mov al, byte ptr [esi]
0060D09A 46 inc esi
0060D09B 8807 mov byte ptr [edi], al
0060D09D 47 inc edi
0060D09E 01DB add ebx, ebx
0060D0A0 75 07 jnz short 0060D0A9
0060D0A2 8B1E mov ebx, dword ptr [esi]
单步执行pushad之后,esp指向0012FFA4 ,键入命令hr 12FFA4下硬件断点,F9运行程序断在此处:
0060D207 8D4424 80 lea eax, dword ptr [esp-80]
0060D20B 6A 00 push 0
0060D20D 39C4 cmp esp, eax
0060D20F ^ 75 FA jnz short 0060D20B
0060D211 83EC 80 sub esp, -80
0060D214 - E9 93D9EFFF jmp 0050ABAC
直接在60D214出下断,跟入真正的oep:
0050ABAC 55 push ebp
0050ABAD 8BEC mov ebp, esp
0050ABAF 6A FF push -1
0050ABB1 68 90C35100 push 0051C390
0050ABB6 68 60D65000 push 0050D660
0050ABBB 64:A1 00000000 mov eax, dword ptr fs:[0]
0050ABC1 50 push eax
0050ABC2 64:8925 0000000>mov dword ptr fs:[0], esp
0050ABC9 83EC 58 sub esp, 58
0050ABCC 53 push ebx
0050ABCD 56 push esi
0050ABCE 57 push edi
0050ABCF 8965 E8 mov dword ptr [ebp-18], esp
0050ABD2 FF15 A8B15100 call dword ptr [51B1A8] ; kernel32.GetVersion
此时单击菜单Debug->hardware breakpoints删除之前设置的硬件断点。
打开LordPE选择客户端程序并单击右键选择“完整转存”。
保存dump文件之后,再打开输入表重建工具Import REC附加到客户端程序。
填写OEP为“10ABAC”,依次单击“自动查找IAT”、“获取输入表”,最后,单击“修复转存文件”,选中之前的dump文件,则脱壳成功。
标签:
原文地址:http://www.cnblogs.com/ZRBYYXDM/p/5470686.html