吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 16478|回复: 39
收起左侧

[原创] 手脱RLPack伪装upx

[复制链接]
小生我怕怕 发表于 2008-11-28 01:32
【文章标题】: 手脱RLPack伪装upx
【文章作者】: 小生我怕怕
【作者邮箱】: 4586631@qq.com
【作者主页】: http://www.52pojie.cn
【作者QQ号】: 4586631
【软件名称】: 决策天机080105
【软件大小】: 1.05M
【下载地址】: 自己搜索下载
【加壳方式】: 加密壳
【保护方式】: RLPack伪装upx
【编写语言】: delphi
【使用工具】: OD lordPE importRCE
【操作平台】: XP
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
007DB68A >  60              pushad                               //OD载入
007DB68B    BE 00908B00     mov esi,8B9000                       //我们很熟悉的UPX入口映射我们的眼前
007DB690    8DBE 0080B4FF   lea edi,dword ptr ds:[esi+FFB48000]  //自然联想到我们的ESP定律啦,在上面一句执行ESP定律
007DB696    57              push edi                             //或者直接hr esp
007DB697    83CD FF         or ebp,FFFFFFFF
007DB69A    EB 3A           jmp short WishGJ.007DB6D6
007DB69C    90              nop
--------------------------------------------------------------------------------
007DB6D8    90              nop                                  //执行ESP定律后停在这里
007DB6D9    60              pushad                               //这里就是RLPack壳的入口啦
007DB6DA    E8 00000000     call WishGJ.007DB6DF                 //同样我们在这里执行ESP定律,或者直接he esp
007DB6DF    8B2C24          mov ebp,dword ptr ss:[esp]           //记住先取消第一次的硬件断点
007DB6E2    83C4 04         add esp,4
007DB6E5    E8 500D0000     call WishGJ.007DC43A
007DB6EA    E8 740D0000     call WishGJ.007DC463
007DB6EF    E8 960C0000     call WishGJ.007DC38A
007DB6F4    8DB5 73260000   lea esi,dword ptr ss:[ebp+2673]
--------------------------------------------------------------------------------
007DB91D  - E9 F6E4DFFF     jmp WishGJ.005D9E18                  //超级大跳转,直接跳去我们的OEP啦
007DB922    83BD 231B0000 0>cmp dword ptr ss:[ebp+1B23],0        //我们单步一步走
007DB929    74 16           je short WishGJ.007DB941
007DB92B    2B85 1B1B0000   sub eax,dword ptr ss:[ebp+1B1B]
007DB931    034424 4C       add eax,dword ptr ss:[esp+4C]
007DB935    50              push eax
--------------------------------------------------------------------------------
005D9E18    55              push ebp                              //呵呵标准的OEP入口
005D9E19    8BEC            mov ebp,esp                           //我们运行importRCE看看我们的IAT指针
005D9E1B    83C4 F0         add esp,-10
005D9E1E    53              push ebx
005D9E1F    B8 18955D00     mov eax,WishGJ.005D9518
005D9E24    E8 FFD4E2FF     call WishGJ.00407328
005D9E29    8B1D 40EC5D00   mov ebx,dword ptr ds:[5DEC40]            ; WishGJ.005DFC38
005D9E2F    E8 9899E9FF     call WishGJ.004737CC
005D9E34    E8 8793E9FF     call WishGJ.004731C0
--------------------------------------------------------------------------------
分析进程...
模块已载入: c:\windows\system32\ntdll.dll
模块已载入: c:\windows\system32\kernel32.dll
模块已载入: c:\windows\system32\user32.dll
模块已载入: c:\windows\system32\gdi32.dll
模块已载入: c:\windows\system32\imm32.dll
模块已载入: c:\windows\system32\advapi32.dll
模块已载入: c:\windows\system32\rpcrt4.dll
模块已载入: c:\windows\system32\secur32.dll
模块已载入: c:\windows\system32\lpk.dll
模块已载入: c:\windows\system32\usp10.dll
模块已载入: c:\windows\system32\msvcrt.dll
模块已载入: c:\windows\system32\oleaut32.dll
模块已载入: c:\windows\system32\ole32.dll
模块已载入: c:\windows\system32\version.dll
模块已载入: c:\windows\system32\comctl32.dll
模块已载入: c:\windows\system32\shell32.dll
模块已载入: c:\windows\system32\shlwapi.dll
模块已载入: c:\windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
模块已载入: c:\windows\system32\comdlg32.dll
模块已载入: c:\windows\system32\winmm.dll
获取关联模块完成.
镜像基址:00400000 大小:003E21D4
原始 IAT RVA 发现于: 001E32B8 位于块 RVA: 00001000 大小:002D1000
IAT 读取成功.
---------------------------------------------------------------------------------------------------------------------------
当前输入表:
10 (十进制:16) 个有效模块 (已添加: +10 (十进制:+16))
228 (十进制:552) 个输入函数. (已添加: +228 (十进制:+552))                    //还有163个无效指针
(A3 (十进制:163) 个未解决的指针) (已添加: +A3 (十进制:+163))                 //我们选中我们的第一个无效指针
---------------------------------------------------------------------------------------------------------------------------
FThunk: 001E31B8        NbFunc: 0000002F                                     //由于指针过多,这里我只复制少数部分                        
0        001E31B8        ?        0000        00DC0000                      //这里就是我们的IAT加密的开始,我们复制地址001E31B8   
0        001E31BC        ?        0000        00DC0017
0        001E31C0        ?        0000        00DC002E
0        001E31C4        ?        0000        00DC0045
0        001E31C8        ?        0000        00DC005C
0        001E31CC        ?        0000        00DC0073
0        001E31D0        ?        0000        00DC008A
0        001E31D4        ?        0000        00DC00A1
0        001E31D8        ?        0000        00DC00B8
--------------------------------------------------------------------------------
看一下我们程序的基址是多少
内存映射,项目 21
地址=00400000
大小=00001000 (4096.)
物主=WishGJ   00400000 (自身)
区段=
包含=PE header
类型=Imag 01001040
访问=RWE
初始访问=RWE

那么我们IAT加米的地址就应该是
00400000+001E31B8=005E31B8
--------------------------------------------------------------------------------
007DB68A >  60              pushad                                 //从新载入程序
007DB68B    BE 00908B00     mov esi,8B9000                         //在命令行输入D 005E31B8
007DB690    8DBE 0080B4FF   lea edi,dword ptr ds:[esi+FFB48000]   
007DB696    57              push edi
007DB697    83CD FF         or ebp,FFFFFFFF
--------------------------------------------------------------------------------
005E31B8  00000000                                                 //直接在这里右键--断点--硬件访问断点--Dword
005E31BC  00000000                                                 //下好硬件断点,我们shift+f9运行程序
005E31C0  00000000
005E31C4  00000000
005E31C8  00000000
005E31CC  00000000
--------------------------------------------------------------------------------
007DB899    83C7 04         add edi,4                             //程序停在了这里
007DB89C    8B85 6B260000   mov eax,dword ptr ss:[ebp+266B]       //而此时我们的第一个指针已经被加密啦
007DB8A2    EB 01           jmp short WishGJ.007DB8A5             //好我们不管啦,开始单步跟
007DB8A4    40              inc eax
007DB8A5    8038 00         cmp byte ptr ds:[eax],0
--------------------------------------------------------------------------------
005E31B8  00DC0000                                                //这里就是我们的第一句加密
005E31BC  00000000                                                //开始跟吧,在跟的时候注意寄存器窗口变化
005E31C0  00000000
005E31C4  00000000
--------------------------------------------------------------------------------
007DB89C    8B85 6B260000   mov eax,dword ptr ss:[ebp+266B]     ; 把IAT放入我们的加密地址
007DB8A2    EB 01           jmp short WishGJ.007DB8A5
007DB8A4    40              inc eax                             ; 逐一读取EAX的字母
007DB8A5    8038 00         cmp byte ptr ds:[eax],0             ; 计算读取了多少位
007DB8A8  ^ 75 FA           jnz short WishGJ.007DB8A4           ; 当读完IAT指针位数就不跳
007DB8AA    40              inc eax                             ; 在次为IAT加1
007DB8AB    E8 A8150000     call WishGJ.007DCE58                ; 加密CALL,我们跟进吧
-------------------------加密CALL------------------------------------------
007DCE58    60              pushad
007DCE59    8B85 80200000   mov eax,dword ptr ss:[ebp+2080]     ; 取我们的下一句IAT,放入EAX
007DCE5F    8B9D 67260000   mov ebx,dword ptr ss:[ebp+2667]     ; 取我们的下一句IAT的地址,放入EBX
007DCE65    0BC0            or eax,eax                          ; “或”EAX相加
007DCE67    75 07           jnz short WishGJ.007DCE70
007DCE69    C747 FC 0000000>mov dword ptr ds:[edi-4],0
007DCE70    3B9D 3B1B0000   cmp ebx,dword ptr ss:[ebp+1B3B]     ; 比较我们的IAT指针地址是否存在EBX
007DCE76    75 0C           jnz short WishGJ.007DCE84           ; 如果IAT地址存在EBX则不跳
007DCE78    3947 FC         cmp dword ptr ds:[edi-4],eax        ; 比较EAX是否为下一句加密的地址
007DCE7B    76 07           jbe short WishGJ.007DCE84           ; EAX是下一句IAT加密地址则跳
007DCE7D    C747 FC 0000000>mov dword ptr ds:[edi-4],0
007DCE84    61              popad
007DCE85    C3              retn                                ; 返回加密的结果
--------------------------------------------------------------------------------
007DB8B0    8985 6B260000    mov dword ptr ss:[ebp+266B],eax     ; 放入第二句真实的IAT
007DB8B6    66:8178 02 0080  cmp word ptr ds:[eax+2],8000
007DB8BC  ^ 74 87            je short WishGJ.007DB845            ; 比较是否需要在次加密下一句指针,不需要则跳
007DB8BE    8038 00          cmp byte ptr ds:[eax],0             ; 比较是否需要加密下一句指针,需要则跳
007DB8C1  ^ 75 82            jnz short WishGJ.007DB845           ; 向上跳继续循环加密
--------------------------------------------------------------------------------
007DB845    8B85 6B260000    mov eax,dword ptr ss:[ebp+266B]
007DB84B    8B00             mov eax,dword ptr ds:[eax]
007DB84D    A9 00000080      test eax,80000000
007DB852    74 1A            je short WishGJ.007DB86E
007DB854    35 00000080      xor eax,80000000
007DB859    50               push eax
007DB85A    8985 2F1B0000    mov dword ptr ss:[ebp+1B2F],eax
007DB860    8B85 6B260000    mov eax,dword ptr ss:[ebp+266B]
007DB866    C700 20202000    mov dword ptr ds:[eax],202020
007DB86C    EB 06            jmp short WishGJ.007DB874
007DB86E    FFB5 6B260000    push dword ptr ss:[ebp+266B]        ; 把IAT指针压栈
007DB874    FFB5 67260000    push dword ptr ss:[ebp+2667]        ; 把IAT地址压栈
007DB87A    FF95 FF0A0000    call dword ptr ss:[ebp+AFF]         ; 取我们的特殊函数
007DB880    85C0             test eax,eax                        ; 把构造出的IAT指针在EAX比较
007DB882    0F84 F7090000    je WishGJ.007DC27F                  ; 比较是否需要加密,加密则不跳
007DB888    E8 F9150000      call WishGJ.007DCE86                ; 加密CALL我们跟进吧
-------------------------加密CALL------------------------------------------
007DCE86    60               pushad
007DCE87    83BD 80200000 00 cmp dword ptr ss:[ebp+2080],0       ; 比较上面的我们的IAT的地址
007DCE8E    75 24            jnz short WishGJ.007DCEB4           ; 这里跳则跳向下面执行加密
007DCE90    60               pushad                              ; 把上面的JNZ改NOP
007DCE91    6A 40            push 40
007DCE93    68 00100000      push 1000
007DCE98    8B85 371B0000    mov eax,dword ptr ss:[ebp+1B37]
007DCE9E    6BC0 16          imul eax,eax,16
007DCEA1    83C0 64          add eax,64
007DCEA4    50               push eax
007DCEA5    6A 00            push 0
007DCEA7    FF95 030B0000    call dword ptr ss:[ebp+B03]
007DCEAD    8985 80200000    mov dword ptr ss:[ebp+2080],eax
007DCEB3    61               popad
007DCEB4    8BBD 67260000    mov edi,dword ptr ss:[ebp+2667]
007DCEBA    3BBD 3B1B0000    cmp edi,dword ptr ss:[ebp+1B3B]     ; 比较EDI是否为我们IAT地址
007DCEC0    0F85 82000000    jnz WishGJ.007DCF48                 ; 是则跳,不是则取反
007DCEC6    8BF8             mov edi,eax                         ; 这里不跳我们指针加密,所以要把这个JNZ改JMP
--------------------------------------------------------------------------------
007DB89C    8B85 6B260000    mov eax,dword ptr ss:[ebp+266B]     ; 把IAT放入我们的加密地址
007DB8A2    EB 01            jmp short WishGJ.007DB8A5
007DB8A4    40               inc eax                             ; 逐一读取EAX的字母
007DB8A5    8038 00          cmp byte ptr ds:[eax],0             ; 计算读取了多少位
007DB8A8  ^ 75 FA            jnz short WishGJ.007DB8A4           ; 当读完IAT指针位数就不跳
007DB8AA    40               inc eax                             ; 在次为IAT加1
007DB8AB    E8 A8150000      call WishGJ.007DCE58                ; 加密CALL,我们跟进吧
007DB8B0    8985 6B260000    mov dword ptr ss:[ebp+266B],eax     ; 放入第二句真实的IAT
-------------------------加密CALL------------------------------------------
007DCE59    8B85 80200000    mov eax,dword ptr ss:[ebp+2080]     ; 取我们的下一句IAT,放入EAX
007DCE5F    8B9D 67260000    mov ebx,dword ptr ss:[ebp+2667]     ; 取我们的下一句IAT的地址,放入EBX
007DCE65    0BC0             or eax,eax                          ; “或”EAX相加
007DCE67    75 07            jnz short WishGJ.007DCE70           
007DCE69    C747 FC 00000000 mov dword ptr ds:[edi-4],0         
007DCE70    3B9D 3B1B0000    cmp ebx,dword ptr ss:[ebp+1B3B]     ; 比较我们的IAT指针地址是否存在EBX
007DCE76    75 0C            jnz short WishGJ.007DCE84           ; 如果假IAT地址存在EBX则不跳
007DCE78    3947 FC          cmp dword ptr ds:[edi-4],eax        ; 比较EAX是否为下一句加密的地址
007DCE7B    76 07            jbe short WishGJ.007DCE84           ; EAX是下一句IAT加密地址则跳
007DCE7D    C747 FC 00000000 mov dword ptr ds:[edi-4],0          ; 上面的JBE跳则执行加密,所以我们需要把他NOP掉
--------------------------------------------------------------------------------
007DB8C3   /EB 01            jmp short WishGJ.007DB8C6             //F4运行到这里看一下,我们的其他IAT全部出来啦
007DB8C5   |46               inc esi                               //而我们的第一句还是加密的怎么办
007DB8C6   \803E 00          cmp byte ptr ds:[esi],0               //我们把我们需要修改的地址记下
007DB8C9  ^ 75 FA            jnz short WishGJ.007DB8C5
007DB8CB    46               inc esi
007DB8CC    40               inc eax
007DB8CD    8B38             mov edi,dword ptr ds:[eax]
--------------------------------------------------------------------------------
007DCE8E-----------这句改NOP
007DCEC0-----------这句改JMP
007DCE7B-----------这句改JMP
从新载入程序,开始脱壳
--------------------------------------------------------------------------------
007DB68A >  60               pushad                               //重新载入程序后
007DB68B    BE 00908B00      mov esi,8B9000                       //这里执行ESP定律
007DB690    8DBE 0080B4FF    lea edi,dword ptr ds:[esi+FFB48000]
007DB696    57               push edi
007DB697    83CD FF          or ebp,FFFFFFFF
007DB69A    EB 3A            jmp short WishGJ.007DB6D6
--------------------------------------------------------------------------------
007DB6D8    90               nop                                  //取消第一个硬件断点
007DB6D9    60               pushad                               //单步F8走
007DB6DA    E8 00000000      call WishGJ.007DB6DF                 //在这里执行ESP定律
007DB6DF    8B2C24           mov ebp,dword ptr ss:[esp]           //CTRL+G把我们需要修改的地址全部改好
007DB6E2    83C4 04          add esp,4                            //改好后我们F9运行程序
007DB6E5    E8 500D0000      call WishGJ.007DC43A
007DB6EA    E8 740D0000      call WishGJ.007DC463
--------------------------------------------------------------------------------
007DB91D  - E9 F6E4DFFF      jmp WishGJ.005D9E18                  //单步一步就到OEP啦
007DB922    83BD 231B0000 00 cmp dword ptr ss:[ebp+1B23],0
007DB929    74 16            je short WishGJ.007DB941
007DB92B    2B85 1B1B0000    sub eax,dword ptr ss:[ebp+1B1B]
007DB931    034424 4C        add eax,dword ptr ss:[esp+4C]
007DB935    50               push eax
007DB936    8B4424 50        mov eax,dword ptr ss:[esp+50]
--------------------------------------------------------------------------------
005D9E18    55               push ebp                            //运行lordPE把程序dump,在运行importRCE修复下就可以啦
005D9E19    8BEC             mov ebp,esp                         //修复时会发现没有无效指针啦,证明我们的magic jump是对的
005D9E1B    83C4 F0          add esp,-10
005D9E1E    53               push ebx
005D9E1F    B8 18955D00      mov eax,WishGJ.005D9518
005D9E24    E8 FFD4E2FF      call WishGJ.00407328
005D9E29    8B1D 40EC5D00    mov ebx,dword ptr ds:[5DEC40]       ; WishGJ.005DFC38
005D9E2F    E8 9899E9FF      call WishGJ.004737CC
005D9E34    E8 8793E9FF      call WishGJ.004731C0
--------------------------------------------------------------------------------
【经验总结】
第一次写这样的脱文,两个字太累,说实在的分析这个壳不累,但是写脱文太累
所以决定以后在不象这样写啦,太累啦,写得不好请大家不要见笑
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于小生我怕怕, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年11月28日 0:28:04

[ 本帖最后由 小生我怕怕 于 2008-11-30 14:02 编辑 ]

决策天机080105.rar

1.06 MB, 下载次数: 132, 下载积分: 吾爱币 -1 CB

由于脱完后文件太大,所以传未脱壳的大家玩玩

免费评分

参与人数 1威望 +2 收起 理由
zzage + 2 精品文章

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

niliu 发表于 2008-11-28 02:03
师傅  太厉害了  膜拜.!
open5858 发表于 2008-11-28 04:11
此篇文章太棒了分係超詳盡
連我這新手都看得懂
樓主真厲害,感謝學習了寶貴的一課
zxcqq8520 发表于 2008-11-28 06:55
主要是处理IAT加密的吧,我先学习了。处理这些我不会
鬼手 发表于 2008-11-28 09:28
又上了一课,谢谢了!
qifeon 发表于 2008-11-28 15:08
支持小生,写教程很辛苦的。
xyjx0044 发表于 2008-11-28 15:36
收藏一个 学习先
满不懂 发表于 2008-11-28 15:43
十分佩服小生,手脱最劳神,还记录得这么详细,收藏学习。
下雪天 发表于 2008-11-28 15:58
很牛X很强大,支持一下,现在手生了好多,但是小生的教程是真的很好很牛X。看的很明白。[s:318]
zeger 发表于 2008-11-28 19:08
非常好的脱文!!!支持一下小生!
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-23 03:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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