大家好,本人刚遇到一个DLL,PEID查是ASPACK 2.12,但是这个是个伪装壳,大家可以试试,ESP定律断不下来,基本上确定这不是ASPACK,大家如果知道是什么壳的话可告知一下,小弟不胜感激。不多说,直接脱文
110F1001 > 60 pushad
110F1002 E8 03000000 call HelperIn.110F100A
110F1007 - E9 EB045D45 jmp 566C14F7
110F100C 55 push ebp
110F100D C3 retn
pushad + call,很像ASPACK吧,接下来更像.
经过单步,我发现下GetModuleHandleA 可到很快到aspack壳的结尾,从API断点返回:
019F207A 8985 DC304400 mov dword ptr ss:[ebp+0x4430DC],eax ; kernel32.77230000
019F2080 8BF8 mov edi,eax
019F2082 8D9D ED304400 lea ebx,dword ptr ss:[ebp+0x4430ED]
019F2088 53 push ebx
019F2089 50 push eax
019F208A FF95 E8314400 call dword ptr ss:[ebp+0x4431E8]
019F2090 8985 79294400 mov dword ptr ss:[ebp+0x442979],eax
019F2096 8D9D FA304400 lea ebx,dword ptr ss:[ebp+0x4430FA]
019F209C 53 push ebx
019F209D 57 push edi
019F209E FF95 E8314400 call dword ptr ss:[ebp+0x4431E8]
不过大家注意,反回时不一定是19xxxxx这样的地址,因为这里是virtualAlloc分配的空间的
接着F8一直往下走,直到
019F20FB FF95 7D294400 call dword ptr ss:[ebp+0x44297D]
019F2101 8D85 512C4400 lea eax,dword ptr ss:[ebp+0x442C51]
019F2107 50 push eax
019F2108 C3 retn
retn返回,继续F8:
019F2390 0BC9 or ecx,ecx
019F2392 74 1C je X019F23B0
019F2394 78 1A js X019F23B0
019F2396 AC lods byte ptr ds:[esi]
019F2397 3C E8 cmp al,0xE8
019F2399 74 08 je X019F23A3
019F239B 3C E9 cmp al,0xE9
019F239D 74 04 je X019F23A3
019F239F 43 inc ebx
019F23A0 49 dec ecx
019F23A1 ^ EB ED jmp X019F2390
019F23A3 291E sub dword ptr ds:[esi],ebx
这里的jmp是往上跳的,我们F4跳到下面019f23a3的位置,继续F8往下走,每遇到跳转是向上跳的话都用F4跳到下面,
直到:
019F25C1 61 popad
019F25C2 75 08 jnz X019F25CC
019F25C4 B8 01000000 mov eax,0x1
019F25C9 C2 0C00 retn 0xC
019F25CC 68 280F9E01 push 0x19E0F28
019F25D1 C3 retn
ASPACK返回的“
伪OEP”
这里跳ASPACK的走到OEP的指令是一样的,因此,一开始我还以为OEP是19E0F28这里,而且这里也可以看到有API的调用,但是这样的不是DLL的地址空间,IAT修复也就没法完成。于是在群里问了些人,有人说这不是OEP,得继续跟下去,直至到达DLL的地址空间才是,于是我想,这个用VirtualAlloc分配临时空间把代码运行到这里,一定得VirtualFree释放,于是
下个virtualFree的断点,不过这种方法比较麻烦,不能很快到OEP,有好方法的同学们可告知我一下,感谢大家。
下好断点后我一直F9运行,直到栈显示的地址接近DLL的地址空间为址(这要按很多次F9,累啊)
这时栈显示是这样的:
0012EEE0 019CB594 /CALL 到 VirtualFree 来自 019CB592
0012EEE4 01950000 |Address = 01950000
0012EEE8 00000000 |Size = 0
0012EEEC 00008000 \FreeType = MEM_RELEASE
0012EEF0 019DABE5 返回到 019DABE5 来自 019CB580
0012EEF4 11000000 HelperIn.11000000 DLL基址
0012EEF8 0012FC2C
0012EEFC 110F1834 HelperIn.110F1834
于是在按2-3次F9,栈显示
0012FB24 01A61657 /CALL 到 VirtualFree 来自 01A61652
0012FB28 01AD4000 |Address = 01AD4000
0012FB2C 00040000 |Size = 40000 (262144.)
0012FB30 00004000 \FreeType = MEM_DECOMMIT
0012FB34 01AD4000
0012FB38 01AC0000
0012FB3C 0012FB70
0012FB40 01B14000
这里是最后一个VirtualFree,就在这里返回,应该很接近真OEP了
这时我们取消断点返回,后面F8跟下去,这样就可以到真正的OEP了,这个过程中有些花指令。
直至这里:
01A4FAAB A1 58B6A501 mov eax,dword ptr ds:[0x1A5B658]
01A4FAB0 E8 5F31FCFF call 01A12C14
01A4FAB5 A1 9C2BA501 mov eax,dword ptr ds:[0x1A52B9C]
01A4FABA C600 E3 mov byte ptr ds:[eax],0xE3
01A4FABD 8BD4 mov edx,esp
01A4FABF A1 94B6A501 mov eax,dword ptr ds:[0x1A5B694]
01A4FAC4 E8 23B9FFFF call 01A4B3EC
01A4FAC9 E8 8E3CFFFF call 01A4375C ; F7进入
01A4FACE E8 61EDFFFF call 01A4E834 ; F7进入
有3个连续的CALL,这里第2个开始就要F7进入了,一直F7(方法较笨,求更好方法)
02B50106 61 popad
02B50107 - FFE0 jmp eax ; HelperIn.1100AB30
这里就是真正的OEP了,修复不说了,大家都懂,这是个VB 的DLL
不过可以搜特征码popad jmp eax 来搜,不过我想有更好的下API或下内存镜像断点的方法,请各位指教,第一次写脱文,且还是临记,大家见谅。
ps:在临时专版发了个同样的贴,麻烦版主把那个贴删了。谢谢
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!