飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4551|回复: 10

[原创] 伪ASPACK脱壳

[复制链接]
  • TA的每日心情
    擦汗
    2022-12-5 14:15
  • 签到天数: 34 天

    [LV.5]常住居民I

    发表于 2014-10-4 11:37:14 | 显示全部楼层 |阅读模式
    本帖最后由 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:[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:D:

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


    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-5-9 10:29
  • 签到天数: 72 天

    [LV.6]常住居民II

    发表于 2014-10-4 15:16:51 | 显示全部楼层
    好脱文,支持
    谢谢分享~
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-8-14 00:08
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2014-10-4 20:40:38 | 显示全部楼层
    谢谢分享,学习。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-4 14:31
  • 签到天数: 73 天

    [LV.6]常住居民II

    发表于 2014-10-5 08:36:33 | 显示全部楼层
    难道是Rlpack?
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2022-12-5 14:15
  • 签到天数: 34 天

    [LV.5]常住居民I

     楼主| 发表于 2014-10-5 08:43:59 | 显示全部楼层

    rlpack能用ESP定律弄下来吧?
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2019-10-23 16:17
  • 签到天数: 295 天

    [LV.8]以坛为家I

    发表于 2014-10-7 00:03:57 | 显示全部楼层
    收藏一个                                                     
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-2 16:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-10-7 12:50:18 | 显示全部楼层
    可以考虑一下双层壳的存在吖
    PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2022-12-5 14:15
  • 签到天数: 34 天

    [LV.5]常住居民I

     楼主| 发表于 2014-10-8 08:48:22 | 显示全部楼层
    F8LEFT 发表于 2014-10-7 12:50
    可以考虑一下双层壳的存在吖

    第二层不知道什么壳..
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-5-9 01:01
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2014-10-13 08:09:37 | 显示全部楼层
    第一个POPad下的跳转明显不是跳向OEP的
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2014-11-2 01:55:33 | 显示全部楼层
    我觉的PYG应该发展一些中坚力量,合力做一些大项目
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表