首页
社区
课程
招聘
RlPack Stolen Code处理
发表于: 2009-6-25 14:50 4982

RlPack Stolen Code处理

2009-6-25 14:50
4982
昨天刚考完试,还有几天就准备回家了,平时都是看大牛们的文章,今天小莱也来写一篇!
中午有个网友传了一个软件给我,才300多KB,当时我以为很好搞定,没想到一搞才晓得其中的难度。
花了几个小时,当然其中也包括一些运气才把壳给搞定了,特将此点小小东西给大家分享一下,
写得不好的地方望大家多多见谅!
  首先用PEID查壳得:ASPack 2.12 -> Alexey Solodovnikov  其实是RlPack
直接OD载入
00401000 >  >pushad            //EP,很明显的RlPack壳
00401001    >call DarkShel.00401009              //单步到这儿,下hr ESP
00401006  - >jmp 459D14F6
0040100B    >push ebp
0040100C    >retn
0040100D    >call DarkShel.00401013
00401012    >jmp short DarkShel.00401071
00401014    >mov ebx, -13
00401019    >add ebx, ebp
0040101B    >sub ebx, 4000
00401021    >popad
00401022  - >jmp DarkShel.004C483D

  F9后中断到这儿
00401021    >popad
00401022  - >jmp DarkShel.004C483D


再次F9中断到下面这个地方
004C483D    >pushad
004C483E    >call DarkShel.004C4843
004C4843    >add esp, 4
004C4846    >mov ebp, ss:[esp-4]
004C484A    >call DarkShel.004C4ADA
004C484F    >call DarkShel.004C6CC8
004C4854    >call DarkShel.004C8BE1
004C4859    >cmp dword ptr ss:[esp+28], 1
004C485E    >jnz short DarkShel.004C486C

大家看到这儿,又有一个pushad,于是又用ESP定律,再次F9,情况不妙,如图

  居然还有反调试,看来不一般啊!
 Ctrl+F12重新来过,我们下bp GetModuleHandleA+5(+5主要是为了避免壳的检测) Shift+f9运行4次之,中我们看堆堆栈,如下:
0012FF74   004C4843  RETURN to DarkShel.004C4843 from DarkShel.004C4843
0012FF78   004C7E2C  RETURN to DarkShel.004C7E2C
0012FF7C   003C0000  ASCII "MFC42.DLL"
0012FF80   00000028
0012FF84   004C9C2C  DarkShel.004C9C2C
0012FF88   004C4843  RETURN to DarkShel.004C4843 from DarkShel.004C4843
0012FF8C   0012FFA0
0012FF90   004C4B5A  DarkShel.004C4B5A
0012FF94   7C92E4F4  ntdll.KiFastSystemCallRet


 此时取消断点,alt+f9返回
004C7E2C    0>or eax, eax
004C7E2E    0>jnz DarkShel.004C7F15
004C7E34    5>push esi
004C7E35    E>call DarkShel.004C6A50
004C7E3A    5>push esi
004C7E3B    F>call ss:[ebp+409]
004C7E41    5>pop esi
004C7E42    0>or eax, eax
004C7E44    0>jnz DarkShel.004C7F15
004C7E4A    5>push esi
004C7E4B    F>call ss:[ebp+3F5]
004C7E51    0>or eax, eax
004C7E53    0>jnz DarkShel.004C7F15
004C7E59    6>pushad
004C7E5A    6>push 104
004C7E5F    F>push dword ptr ss:[ebp+4C58]
004C7E65    8>cmp dword ptr ss:[ebp+477E], 0
004C7E6C    7>je short DarkShel.004C7E76

到这儿之后我们就可以单步了,因为此时的一些检测基本没有了,可以放心的单步往下边走
由于这儿代码有点长,我就不全部贴出来了!单步来到这儿:
004C4AA9    >call ss:[ebp+405]
004C4AAF    >call DarkShel.004C6D84
004C4AB4    >call DarkShel.004C7F85
004C4AB9    >call DarkShel.004C569D
004C4ABE    >call DarkShel.004C5548
004C4AC3    >cmp dword ptr ss:[ebp+4C94], 0
004C4ACA    >je short DarkShel.004C4AD3
004C4ACC    >jmp DarkShel.004C5AE1
004C4AD1    >jmp short DarkShel.004C4AD4
004C4AD3    >popad
004C4AD4  - >jmp DarkShel.00411166   //这儿就跳向我们的OEP了


直接在004C4AD4处F2下断点,然后shift+f9运行,中断到到004C4AD4之后,单步跟过去
00411166    >nop
00411167    >nop
00411168    >nop
00411169    >nop
0041116A    >nop
0041116B    >nop
0041116C    >nop
0041116D    >nop
0041116E    >nop
0041116F    >nop
00411170    >nop
00411171    >nop
00411172    >nop
00411173    >nop
00411174    >nop
00411175    >nop
00411176    >nop
00411177    >nop
00411178    >nop
00411179    >nop
0041117A    >nop
0041117B    >nop
0041117C    >nop
0041117D    >nop
0041117E    >nop
0041117F    >nop
00411180    >nop
00411181    >nop
00411182    >nop
00411183    >nop
00411184    >nop
00411185    >nop
00411186    >nop
00411187    >nop
00411188    >nop
00411189    >nop
0041118A    >nop
0041118B    >nop
0041118C    >nop
0041118D    >nop
0041118E    >nop
0041118F    >nop
00411190    >nop
00411191    >nop
00411192    >nop
00411193    >nop
00411194    >nop
00411195    >nop
00411196    >nop
00411197    >nop
00411198    >nop
00411199    >nop
0041119A    >or dword ptr ds:[41BAC4], FFFFFFFF
004111A1    >or dword ptr ds:[41BAC8], FFFFFFFF
004111A8    >call ds:[4145AC]                         ; msvcrt.__p__fmode
004111AE    >mov ecx, ds:[41BAB8]
004111B4    >mov ds:[eax], ecx
004111B6    >call ds:[4145A8]                         ; msvcrt.__p__commode


  我靠!!!偷了这么多代码,像这样偷这么多的代码,我还是头一次遇见,看下面是MFC的程序,当时我真的以为没有办法修复了,想着都跟到这儿了,
抱着一种试一试的想法,去找了一个MFC没加壳的程序,将以下代码复制到被偷的地方去..
00401656 >/$  5>push ebp
00401657  |.  8>mov ebp, esp
00401659  |.  6>push -1
0040165B  |.  6>push MFC.004023E0
00401660  |.  6>push <jmp.&msvcrt._except_handler3>      ;  SE 处理程序安装
00401665  |.  6>mov eax, dword ptr fs:[0]
0040166B  |.  5>push eax
0040166C  |.  6>mov dword ptr fs:[0], esp
00401673  |.  8>sub esp, 68
00401676  |.  5>push ebx
00401677  |.  5>push esi
00401678  |.  5>push edi
00401679  |.  8>mov [local.6], esp
0040167C  |.  3>xor ebx, ebx
0040167E  |.  8>mov [local.1], ebx
00401681  |.  6>push 2
00401683      F>call dword ptr [<&msvcrt.__set_app_type>>;  msvcrt.__set_app_type
00401689  |.  5>pop ecx


二进制如下:
55 8B EC 6A FF 68 E0 23 40 00 68 50 16 40 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 68
53 56 57 89 65 E8 33 DB 89 5D FC 6A 02 FF 15 84 21 40 00 59

把上面二进制粘贴到被偷的地方,如下:
00411166    >push ebp                                 ; OEP
00411167    >mov ebp, esp                             ; 此时我们需要补齐下面这1、2、3处地址
00411169    >push -1
0041116B    >push DarkShel.004023E0                   ; 1
00411170    >push DarkShel.00401650                   ; 2
00411175    >mov eax, fs:[0]
0041117B    >push eax
0041117C    >mov fs:[0], esp
00411183    >sub esp, 68
00411186    >push ebx
00411187    >push esi
00411188    >push edi
00411189    >mov ss:[ebp-18], esp
0041118C    >xor ebx, ebx
0041118E    >mov ss:[ebp-4], ebx
00411191    >push 2
00411193    >call ds:[402184]                         ; 3
00411199    >pop ecx
0041119A    >or dword ptr ds:[41BAC4], FFFFFFFF
004111A1    >or dword ptr ds:[41BAC8], FFFFFFFF
004111A8    >call ds:[4145AC]                         ; msvcrt.__p__fmode


我们将堆栈内容往下拖,拖到这儿
0012FFAC   00000000
0012FFB0   0012FFE0  Pointer to next SEH record
0012FFB4   004112CA  SE handler               //第2处
0012FFB8   00416640  DarkShel.00416640    //这儿就是我们被偷的第1处



补好之后如下:
00411166    >push ebp                                 ; OEP
00411167    >mov ebp, esp                             ; 此时我们需要补齐下面这1、2、3处地址
00411169    >push -1
0041116B    >push DarkShel.00416640                   ;OK1
00411170    >push DarkShel.004112CA                   ; OK2
00411175    >mov eax, fs:[0]
0041117B    >push eax
0041117C    >mov fs:[0], esp
00411183    >sub esp, 68
00411186    >push ebx
00411187    >push esi
00411188    >push edi
00411189    >mov ss:[ebp-18], esp
0041118C    >xor ebx, ebx
0041118E    >mov ss:[ebp-4], ebx
00411191    >push 2
00411193    >call ds:[402184]                         ; 3????在哪儿呢
00411199    >pop ecx
0041119A    >or dword ptr ds:[41BAC4], FFFFFFFF
004111A1    >or dword ptr ds:[41BAC8], FFFFFFFF


这时就还有我们最后一处00411193    >call ds:[402184] 这儿了,关于这儿我找遍了堆栈和寄存器
都没有发现什么可用的信息!当时以为真的没有希望了,结果脑袋灵犀一动,去找了一个没有加壳的MFC
程序,也来到00411193    >call ds:[402184]这个位置,直接将此句代表给NOP掉,居然可以正常运行了,
当时把我开心死了...赶快也将我们还没有补好的00411193  这句给NOP掉,然后在00411166    >push ebp   
 处右键新建EIP,然后用loadPE DUMP出来,然后再打开ImportREC,选中壳进程
,在OEP处填上11166 ,然后自动获取一下,提示发现有用的IAT,再点获取IAT,幸好IAT都没有加密的,直接修复
刚刚用DUMP出来的程序,运行如图

能够正常运行了,此时心情无比激动!这里也告诉像我这样的菜鸟朋友们,在遇见一些困难的时候,先不要急着撤退,不仿先冷静的想一下,或者用你能想到的方法都来试一下,实在不行就放一断时间,待哪天心情好之后再来看一下或者会有意外的收获!

需要手动练习的朋友可以下来试一下
DarkShellNew.rar

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 212
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
呵呵,坐个沙发,写的不错,支持楼主!
2009-6-25 18:18
0
雪    币: 2110
活跃值: (21)
能力值: (RANK:260 )
在线值:
发帖
回帖
粉丝
3
嗯,有点意思。

偷窃的不是“有用”的代码。
2009-6-25 19:12
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
DDOS……
呵呵。
2009-10-18 18:00
0
雪    币: 257
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
没有加密IAT的Rlpack 1.20版,嘿嘿,学习这个方法了
2009-11-22 20:27
0
游客
登录 | 注册 方可回帖
返回
//