首页
社区
课程
招聘
[原创]《甲壳2》模拟CPU主程序脱壳
发表于: 2010-5-20 04:51 8597

[原创]《甲壳2》模拟CPU主程序脱壳

2010-5-20 04:51
8597
00401500 >/$  55            push ebp                      //OD载入
00401501  |.  8BEC          mov ebp,esp                   //开始F8跟吧
00401503  |.  53            push ebx
00401504  |.  56            push esi
00401505  |.  57            push edi
00401506  |.  BF 04304000   mov edi,甲壳2模?00403004

004015A1  |.  60            pushad
004015A2  |.  54            push esp
004015A3  |.  FF35 28304000 push dword ptr ds:[0x403028]             ;  甲壳2模?00403004
004015A9  |.  FF15 20304000 call dword ptr ds:[0x403020]      //这个CALL我们F7进入卡机代码
004015AF  |.  5F            pop edi
004015B0  |.  5E            pop esi
004015B1  |.  B8 01000000   mov eax,0x1

00E41020    55              push ebp              //来到这里超卡啦
00E41021    8BEC            mov ebp,esp           //这里需要注意啦,这里会不停的申请空间
00E41023    83EC 60         sub esp,0x60          //我们需要跟进CALL去慢慢解读
00E41026    53              push ebx
00E41027    56              push esi
00E41028    57              push edi

00E41045    8945 F0         mov dword ptr ss:[ebp-0x10],eax      //这里将申请来的内存空间传送
00E41048    837D F0 00      cmp dword ptr ss:[ebp-0x10],0x0      //比较是否申请的内存空间是否为0
00E4104C    75 1C           jnz short 00E4106A                   //这里如果内存空间为0则向下执行
00E4104E    6A 00           push 0x0
00E41050    68 A050E400     push 0xE450A0                        //如果内存空间为0就提示对话框后退出
00E41055    68 8C50E400     push 0xE4508C
00E4105A    6A 00           push 0x0
00E4105C    FF15 3450E400   call dword ptr ds:[0xE45034]             ; USER32.MessageBoxA
00E41062    6A 00           push 0x0
00E41064    FF15 1050E400   call dword ptr ds:[0xE45010]             ; kernel32.ExitProcess

00E41077    50              push eax                             
00E41078    8B4D F0         mov ecx,dword ptr ss:[ebp-0x10]
00E4107B    51              push ecx
00E4107C    E8 AF260000     call 00E43730                        //这里我们跟进去,因为这里有一个解码步骤的
00E41081    83C4 0C         add esp,0xC
00E41084    8945 EC         mov dword ptr ss:[ebp-0x14],eax
00E41087    8B45 08         mov eax,dword ptr ss:[ebp+0x8]

00E43730    55              push ebp            //跟进CALL之后停在这里
00E43731    8BEC            mov ebp,esp         //继续F8跟吧     
00E43733    83EC 58         sub esp,0x58
00E43736    53              push ebx
00E43737    56              push esi

00E437DE    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]       //这里开始对我们的内存空间做手脚
00E437E1    0345 E8         add eax,dword ptr ss:[ebp-0x18]
00E437E4    8B4D FC         mov ecx,dword ptr ss:[ebp-0x4]
00E437E7    8A51 01         mov dl,byte ptr ds:[ecx+0x1]
00E437EA    8810            mov byte ptr ds:[eax],dl
00E437EC  ^ EB DF           jmp short 00E437CD                  //这里循环处理

00E43803    0345 10         add eax,dword ptr ss:[ebp+0x10]
00E43806    3945 FC         cmp dword ptr ss:[ebp-0x4],eax
00E43809    75 08           jnz short 00E43813
00E4380B    8B45 F4         mov eax,dword ptr ss:[ebp-0xC]
00E4380E    2B45 08         sub eax,dword ptr ss:[ebp+0x8]
00E43811    EB 05           jmp short 00E43818               //以上我就不一一的说啦,就是申请一个临时的跳转空间而已
00E43813  ^ E9 2DFFFFFF     jmp 00E43745                     //这里继续循环处理

00E410D1    E8 FA060000     call 00E417D0             //这里F7继续跟进
00E410D6    8945 E8         mov dword ptr ss:[ebp-0x18],eax
00E410D9    68 7050E400     push 0xE45070                            ; ASCII "COMCTL32.dll"
00E410DE    FF15 0C50E400   call dword ptr ds:[0xE4500C]             ; kernel32.LoadLibraryA
00E410E4    8945 E4         mov dword ptr ss:[ebp-0x1C],eax

00E417D0    55              push ebp           //我们F7跟进后停在这里
00E417D1    8BEC            mov ebp,esp        //作者在一段一样是申请一个临时的过度空间
00E417D3    83EC 4C         sub esp,0x4C
00E417D6    53              push ebx
00E417D7    56              push esi
00E417D8    57              push edi

00E4181F    A3 0061E400     mov dword ptr ds:[0xE46100],eax        //在这里将申请的临时空间传送
00E41824    A1 D063E400     mov eax,dword ptr ds:[0xE463D0]        //在下面会对临时空间的代码进行修改
00E41829    A3 9C60E400     mov dword ptr ds:[0xE4609C],eax        //但是这个不重要因为今天我们不去临时空间
00E4182E    A1 D063E400     mov eax,dword ptr ds:[0xE463D0]
00E41833    A3 C063E400     mov dword ptr ds:[0xE463C0],eax
00E41838    8B45 10         mov eax,dword ptr ss:[ebp+0x10]
00E4183B    A3 A060E400     mov dword ptr ds:[0xE460A0],eax

10E50000    9C              pushfd                                //这里就是作者在内存空间申请修改后的代码
10E50001    60              pushad
10E50002    8925 9860E400   mov dword ptr ds:[0xE46098],esp
10E50008    A1 A460E400     mov eax,dword ptr ds:[0xE460A4]
10E5000D    A3 6463E400     mov dword ptr ds:[0xE46364],eax
10E50012    8B25 6463E400   mov esp,dword ptr ds:[0xE46364]
10E50018    8BEC            mov ebp,esp
10E5001A    B8 9C60E400     mov eax,0xE4609C
10E5001F    C700 00000000   mov dword ptr ds:[eax],0x0
10E50025    B8 C063E400     mov eax,0xE463C0
10E5002A    C700 00000000   mov dword ptr ds:[eax],0x0      //从这里看因为上个版本我跟过这次主程序有所不同但是可以判断
10E50030    B8 6027E400     mov eax,0xE42760             //我们可以得出结论就是作者很快就会解码程序啦
10E50035    FFE0            jmp eax                    //这里在上一次我搞的那个保护框程序那里是跳向程序代码出现的地址

00E41104    8B55 0C         mov edx,dword ptr ss:[ebp+0xC]
00E41107    52              push edx
00E41108    E8 53330000     call 00E44460                   //这个CALL我们F7跟进去瞧瞧
00E4110D    5F              pop edi
00E4110E    5E              pop esi

00E44460    55              push ebp                //这里继续
00E44461    8BEC            mov ebp,esp
00E44463    83EC 50         sub esp,0x50
00E44466    53              push ebx                                 ; 甲壳2模?00404180
00E44467    56              push esi
00E44468    57              push edi

00E44469    8B45 10         mov eax,dword ptr ss:[ebp+0x10]
00E4446C    50              push eax
00E4446D    E8 4EFEFFFF     call 00E442C0             //这里F7跟进去
00E44472    8945 FC         mov dword ptr ss:[ebp-0x4],eax
00E44475    8D45 F8         lea eax,dword ptr ss:[ebp-0x8]

00E442C0    55              push ebp                  //跟进CALL来到这里
00E442C1    8BEC            mov ebp,esp
00E442C3    81EC 88000000   sub esp,0x88
00E442C9    53              push ebx
00E442CA    56              push esi
00E442CB    57              push edi
00E442CC    8B45 08         mov eax,dword ptr ss:[ebp+0x8]
00E442CF    8B48 14         mov ecx,dword ptr ds:[eax+0x14]
00E442D2    81C1 78030000   add ecx,0x378
00E442D8    894D EC         mov dword ptr ss:[ebp-0x14],ecx
00E442DB    6A 40           push 0x40
00E442DD    68 00100000     push 0x1000
00E442E2    8B45 EC         mov eax,dword ptr ss:[ebp-0x14]
00E442E5    50              push eax
00E442E6    6A 00           push 0x0
00E442E8    FF15 1450E400   call dword ptr ds:[0xE45014]             ; kernel32.VirtualAlloc
00E442EE    8945 E8         mov dword ptr ss:[ebp-0x18],eax       //这里申请出来的内存空间就是放我们程序代码的啦
00E442F1    837D E8 00      cmp dword ptr ss:[ebp-0x18],0x0
00E442F5    75 1C           jnz short 00E44313

00E44313    8B45 E8         mov eax,dword ptr ss:[ebp-0x18]      //这里将我们的程序完整的放到了临时空间
00E44316    8945 F0         mov dword ptr ss:[ebp-0x10],eax      //我这里传送的值是10E80000
00E44319    8B45 08         mov eax,dword ptr ss:[ebp+0x8]
00E4431C    8B48 18         mov ecx,dword ptr ds:[eax+0x18]

00E4432A    51              push ecx
00E4432B    E8 00F4FFFF     call 00E43730            //这CALL里将我们的程序解码,具体解码步骤也是赋值那种形式
00E44330    83C4 0C         add esp,0xC              //里面的指令和申请内存空间修改的临时过度跳转地址修改方法是一样的
00E44333    8945 E4         mov dword ptr ss:[ebp-0x1C],eax     //这里就是我们最佳的DUMP时机,我们按照下面图所示转存
00E44336    8B45 08         mov eax,dword ptr ss:[ebp+0x8]      //我这里的临时转存的空间就是10E80000
00E44339    8B4D E4         mov ecx,dword ptr ss:[ebp-0x1C]
00E4433C    3B48 14         cmp ecx,dword ptr ds:[eax+0x14]

第一步


第二步


第三步



第四步

第四步就是把我们转存出来的程序的拓展名Region10E80000-10F79000.dmp改成XXXX.EXE就达到了完美脱壳啦

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (14)
雪    币: 2067
活跃值: (82)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
2
这是沙发吗?
No. 这是头香.
2010-5-20 07:08
0
雪    币: 86
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我这个是板凳吗
2010-5-20 08:10
0
雪    币: 4911
活跃值: (145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
看来小生最近对甲壳很有兴趣啊
2010-5-20 08:16
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
楼主看起来就很牛, 努力学习中
2010-5-20 08:47
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
“小生我怕怕”的分析还较为肤浅
这些用IDA直接可以看C代码  谁都看得见
这些正式《甲壳2》的优雅之处 你能看见的都是无需保护的源码

你现在的分析还属于门外汉 劝你先弄清楚模拟CPU

至于为什么说你还是门外汉 是因为你在另外一个帖子里面都还吧我的
模拟CPU理解成混淆  你得意了半天你看你dump下来的东西还是个加壳程序吗
2010-5-20 14:07
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
你又在这里看别人误解我的CPU?
2010-5-20 14:14
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
这个小生我怕怕真有意思 居然还在用dump
我知道你之前很牛 不过你现在的的举止好比用清末的火枪对抗洲际导弹
2010-5-20 14:43
0
雪    币: 215
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
你的举止也好像是在用 你的 假壳 在给 小霸王 上的游戏带 做保护的

看了你的价格 真不敢恭维  宁可买NP  也不买你的假壳啊。 还卖呢。 有人买啊?

建议给你自己的主程序套上NP吧。
2010-5-20 16:39
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
你倒是吧我的《甲壳2》的界面弄出来了 那有用么 告诉你吧 主程序放模拟CPU里了
至于你得了个界面幸喜若狂 你继续吧 微软的MFC拖控件 最多5分钟就可得到一个
你吧界面弄出来有什么用呢 你最多自我安慰一下罢了 至于其他的壳好不好我不好讲
不过我所知道的很多壳只是吧入口扣了一点代码走,放入了所谓的VMP 其实这种壳落伍了
大多数程序有没有你入口的那几行代码无关紧要 而且跟多的时候你抠走的是微软的附加代码

然《甲壳2》不同,《甲壳2》是有坐标定位的 指向哪块内存 哪儿出现一个骷髅  这才是新时代的壳 如果你也是做壳的 好好跟我学吧
2010-5-20 16:53
0
雪    币: 306
活跃值: (85)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
什么都不说,lz我顶...
2010-5-20 17:17
0
雪    币: 35
活跃值: (11)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
通过网友得知《甲壳2》模拟CPU程序保护壳免费版在XP上出现较卡的问题
现已修正 欢迎从网站重新下载 www.jococ.com
2010-5-20 19:07
0
雪    币: 317
活跃值: (93)
能力值: ( LV9,RANK:140 )
在线值:
发帖
回帖
粉丝
13
DUMP出来的的确没有功能,因为作者用另外一个EXE来当Loader申请好内存空间后,把DLL植入,在由DLL申请内存来完成作者那所谓的模拟,主功能全部在无壳的程序里,加壳报错是因为没有可用的内存空间导致,如果要修复难度也不大就是工作量大,编程功底好的直接写个lorder套用下就可以解开这个所谓的CUP模拟啦
或者就是找个地址把jmp dword ptr ds:[0x400020]这个地址给作者解决掉,然后把作者的解码数据直接PATCH下即可,然后等解码完毕,跳回0040252D   .  81C4 2C020000 add esp,0x22C这句即可完成作者所谓的功能,003E44B1    C745 F0 2000400>mov dword ptr ss:[ebp-0x10],0x400020上面那句跳向解码的地址也是由DLL里指定了的

还有作者所谓的模拟
00411298  |.  E8 6323FFFF   call FUCK.00403600,这个壳里判断,是属于那一种的跳转

0040362E  |.  C74424 3C 607>mov dword ptr ss:[esp+0x3C],FUCK.00447C6>;  jo
00403636  |.  C74424 40 047>mov dword ptr ss:[esp+0x40],FUCK.00447D0>;  jno
0040363E  |.  C74424 44 5C7>mov dword ptr ss:[esp+0x44],FUCK.00447C5>;  jb
00403646  |.  C74424 48 007>mov dword ptr ss:[esp+0x48],FUCK.00447D0>;  jnb
0040364E  |.  C74424 4C 587>mov dword ptr ss:[esp+0x4C],FUCK.00447C5>;  jz
00403656  |.  C74424 50 FC7>mov dword ptr ss:[esp+0x50],FUCK.00447CF>;  jnz
0040365E  |.  C74424 54 F87>mov dword ptr ss:[esp+0x54],FUCK.00447CF>;  jbe
00403666  |.  C74424 58 547>mov dword ptr ss:[esp+0x58],FUCK.00447C5>;  ja
0040366E  |.  C74424 5C 507>mov dword ptr ss:[esp+0x5C],FUCK.00447C5>;  js
00403676  |.  C74424 60 F47>mov dword ptr ss:[esp+0x60],FUCK.00447CF>;  jns
0040367E  |.  C74424 64 F07>mov dword ptr ss:[esp+0x64],FUCK.00447CF>;  jpe
00403686  |.  C74424 68 EC7>mov dword ptr ss:[esp+0x68],FUCK.00447CE>;  jpo
0040368E  |.  C74424 6C 487>mov dword ptr ss:[esp+0x6C],FUCK.00447C4>;  jl
00403696  |.  C74424 70 E87>mov dword ptr ss:[esp+0x70],FUCK.00447CE>;  jge
0040369E  |.  C74424 74 E47>mov dword ptr ss:[esp+0x74],FUCK.00447CE>;  jle
004036A6  |.  C74424 78 447>mov dword ptr ss:[esp+0x78],FUCK.00447C4>;  jg

还有很多由于代码比较多懒得复制那么多,就是在这些指令上判断好后进行作者所谓的模拟
但是我个人比较肤浅,技术也比较菜,没有看出来是在模拟什么,只看到是把指令像抽取一样的放进内存某个指定位置,然后逐一以赋值的形式去解码
2010-5-22 18:53
0
雪    币: 51
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
有W哥的地方就有江湖,
有江湖就有纷争,
如果没有纷争了,
W哥就不存在了
2010-5-22 20:33
0
雪    币: 99
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
矛与盾的PK,观战,双方我都支持!
2010-5-25 17:13
0
游客
登录 | 注册 方可回帖
返回
//