pklong007 发表于 2014-10-4 11:37:14

伪ASPACK脱壳

本帖最后由 pklong007 于 2014-10-5 09:39 编辑

大家好,本人刚遇到一个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:,eax                ; kernel32.77230000
019F2080    8BF8            mov edi,eax
019F2082    8D9D ED304400   lea ebx,dword ptr ss:
019F2088    53            push ebx
019F2089    50            push eax
019F208A    FF95 E8314400   call dword ptr ss:
019F2090    8985 79294400   mov dword ptr ss:,eax
019F2096    8D9D FA304400   lea ebx,dword ptr ss:
019F209C    53            push ebx
019F209D    57            push edi
019F209E    FF95 E8314400   call dword ptr ss:

不过大家注意,反回时不一定是19xxxxx这样的地址,因为这里是virtualAlloc分配的空间的
接着F8一直往下走,直到
019F20FB    FF95 7D294400   call dword ptr ss:
019F2101    8D85 512C4400   lea eax,dword ptr ss:
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:
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:,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   11000000HelperIn.11000000                                 DLL基址
0012EEF8   0012FC2C
0012EEFC   110F1834HelperIn.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:
01A4FAB0    E8 5F31FCFF   call 01A12C14
01A4FAB5    A1 9C2BA501   mov eax,dword ptr ds:
01A4FABA    C600 E3         mov byte ptr ds:,0xE3
01A4FABD    8BD4            mov edx,esp
01A4FABF    A1 94B6A501   mov eax,dword ptr ds:
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:D:

不过可以搜特征码popad jmp eax 来搜,不过我想有更好的下API或下内存镜像断点的方法,请各位指教,第一次写脱文,且还是临记,大家见谅。


zxy20014 发表于 2014-10-4 15:16:51

好脱文,支持
谢谢分享~

crackvip 发表于 2014-10-4 20:40:38

谢谢分享,学习。。

冷月孤心 发表于 2014-10-5 08:36:33

难道是Rlpack?

pklong007 发表于 2014-10-5 08:43:59

冷月孤心 发表于 2014-10-5 08:36
难道是Rlpack?

rlpack能用ESP定律弄下来吧?

awow 发表于 2014-10-7 00:03:57

收藏一个                                                   

F8LEFT 发表于 2014-10-7 12:50:18

可以考虑一下双层壳的存在吖

pklong007 发表于 2014-10-8 08:48:22

F8LEFT 发表于 2014-10-7 12:50
可以考虑一下双层壳的存在吖

第二层不知道什么壳..

老海 发表于 2014-10-13 08:09:37

第一个POPad下的跳转明显不是跳向OEP的

mdisk0210 发表于 2014-11-2 01:55:33

我觉的PYG应该发展一些中坚力量,合力做一些大项目
页: [1] 2
查看完整版本: 伪ASPACK脱壳