首页
社区
课程
招聘
[原创]伪aspack脱壳
发表于: 2014-10-4 21:59 5585

[原创]伪aspack脱壳

2014-10-4 21:59
5585
大家好,本人刚遇到一个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:在临时专版发了个同样的贴,麻烦版主把那个贴删了。谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 100
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢分享!
2014-10-5 11:59
0
雪    币: 205
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢 精彩内容
2014-10-9 16:06
0
雪    币: 277
活跃值: (312)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
4
vb 的程序或者dll oep附近的某些二进制字符是固定的 可以先直接运行一下 在code段找到这里,然后硬断点 然后重新运行 然后就直接断下来了
2015-1-9 11:12
0
游客
登录 | 注册 方可回帖
返回
//