首页
论坛
课程
招聘
[.NET平台] [原创]突破技术封锁,JIT层脱壳浅析
2011-12-10 01:04 66511

[.NET平台] [原创]突破技术封锁,JIT层脱壳浅析

2011-12-10 01:04
66511
现在.Net 壳真是越来越强了,目前的主流保护思想都是基于“方法”层面的了,在内存中我们已经无法获得完整的Assembly了,即使Dump下来,也看不全IL代码。比较有代表性的壳就是Reactor, MaxToCode, DNGuard HVM等等。
    可是不知道为什么,大牛们总是把技术藏着掖着,害得我们这些小菜们破解无路,经过细读rick大牛的文章和在某人的细心指点下,略有心得,特来和大家分享。
    俗话说:“柿子要找软的捏”,在上面提到的三款强壳中,最弱的可就是要算Reactor了。虽然是最弱的,但是我相信几乎可以难倒90%的DOTNET初学者。虽然大牛们不屑一顾,甚至秒杀,但是作为小菜的我们还是需要研究很久的。
    为了便于研究,我们自己先创建一个小小的CrackMe,代码非常简单如下:
if (textBox1.Text == "123456")
{
      MessageBox.Show("CODE IS OK");
}
else
{
      MessageBox.Show("ERROR");
}


只要注册码为123456就可以注册成功,我们根据RVA地址可以顺利找到其二进制代码如下:


我们再使用Reactor4.4对这个CrackMe进行加密,同样为了起到研究的目的,我们仅仅勾选NecroBit选项


加密后,我们再也看不到IL代码了。

这便是Reactor的独门秘籍了,基于方法体加密。

    那么我们就真的没有办法了吗?方法当然是有的,其一是研究Reactor的自我解密函数,那么我们甚至就可以静态脱壳了,但这是属于牛人研究的范畴,我们暂且不研究。其二就是利用Hook JIT来截获IL代码。看雪论坛上已经有高手详细的解释了怎么编写一个HOOK JIT的代码,所以我就不展开讲了,我们甚至可以直接使用OllyDBG的ILLY插件来直接获取IL代码。
http://bbs.pediy.com/showthread.php?t=116218
http://bbs.pediy.com/showthread.php?t=63940
    在使用这个插件之前,请先搭建一个Pure DOTNET环境,所谓的Pure DOTNET环境是指一台裸机安装了原版Windows XP操作系统后,仅仅安装了.NET Framework v2.0.50727 版本的框架。
http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=0856eacb-4362-4b0d-8edd-aab15c5e04f5
    任何其他软件都没有安装。这个环境是非常利于HOOK JIT的,可以让我们今天使用的ILLY插件很稳定的截获IL代码。建议大家在虚拟机中建立这样的环境。

    将ILLY插件拷贝到OllyDBG的plugin目录中去。然后将加密后的CrackMe拖进OllyDBG中,
OllyDBG很快就会中断到compileMethod方法处,并弹出了IL代码对话框,当然这里仅仅只CrackMe的入口点,为了测试,我们先暂停ILLY的监控,让程序跑飞。


可以通过上面的菜单进行暂停或执行ILLY的监控。当程序跑飞后,我们再次启用ILLY,点击按钮后,ILLY插件就真正截获到我们需要的IL代码了。


上图便是获得的核心IL代码,我们先不急着处理,看一个小小的意外收获。请看OllyDBG的反汇编代码:


    这岂不就是那段IL代码编译后的Native代码么??而红色标出的部分就是判断注册是否成功的关键跳,将74修改为75后,果然显示注册成功了!看样子如果我们只做一个内存补丁也是可以的,但不是今天研究的主题,我们暂不讨论。
    在弹出的ILLY对话框中,我们可以点击Save *.BIN到文件,这样我们就真正通过HOOK JIT获得了Reactor加密后的数据了。我们只需要将这些二进制代码还原到原程序中就行了,可是新的问题出现了:加密后的程序存储IL代码的字节数太少了,而我们获得的IL字节太多了,根本放不下去啊…..

对于这个问题我纠结了很久,最后不得不向某人求助。某人是这样做的:他先用CFF在加密后的程序中新建一个Section 将Dump到的Bin文件添加进去。如下图所示


下图就是增加了Section后的截图,新的Section取名为.text2


    我们只需要将button_click1方法的RAV重新指向到这个新的解密后的方法就行了(.text2的RAV是14000)。但是这里我们一定要注意一个很大的问题,就是Tiny Method 和 Fat Method,由于计算Fat Method的数据有点多,我们还是当作Tiny Method来处理,经过IL代码的大小计算后得出的Tiny Method头应该是CA,因此我们将RAV 14006处修改为CA,(限于篇幅,具体计算方法可以Google之)然后我们再将按钮点击出的Button_click1的RVA修改为14006

将上图红色方框处修改为14006

存盘后,我们再用ILSPY打开看看,神奇的一幕出现了:


我们成功的还原了Reactor4.4加密后的源代码!!!激动啊~~~~曾经难倒了多少菜鸟~~~
程序试着跑一下,没有报错!!!剩下的破解工作太简单就不说了。

    今天我们利用纯手工完成了对Reactor4.4加密后的程序的简单破解。大家还满意吗?如果写一个工具完成上述手工操作的全过程,那么整个Reactor壳就可以轻松脱去!!本文也仅仅是起到一个抛砖引玉的作用,虽然某人已经自己写出自动脱壳机了,可惜他没给我……。不能分享给大家了,实在抱歉……。
    最后希望大家能写出来一个出来分享。
附件提供了文中提到的CrackMe,欢迎大家尝试,欢迎留帖或者发邮件给我一起讨论 chenxiaolu2012@gmail.com

第五届安全开发者峰会(SDC 2021)议题征集正式开启!

上传的附件:
收藏
点赞0
打赏
分享
最新回复 (63)
雪    币: 287
活跃值: 活跃值 (176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
炎黄一脉 活跃值 2011-12-10 01:17
2
0
曾经XX过一个无壳的.net程序,接着第二个程序就遇到了“柿子”,再后来就放弃了
看了楼主的贴子后,又对.net重新拾起了希望。对于楼主的贴子,感觉二个字“很好”,若非得用三个字的话,那就是“非常好”。
雪    币: 215
活跃值: 活跃值 (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
gwotang 活跃值 2011-12-10 07:54
3
0
很有用的文章, 謝謝 !
雪    币: 36
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ellee 活跃值 2011-12-10 08:27
4
0
收藏此贴,以备不时之需
雪    币: 646
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
leisurely 活跃值 2011-12-10 09:03
5
0
感谢分享~~~

不知楼主能不能分享一下如何处理 {SmartAssembly}混淆过的程序。
雪    币: 112
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
chenxiaolu 活跃值 1 2011-12-10 12:33
6
0
对付{SA}即使不反混淆,利用Profile API 也是可以轻松找到破解位置的。

在反混淆方面,我现在只能做到名称反混淆,而流程反混淆还在学习中,一旦学成归来,定会分享给大家。
雪    币: 66
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chenjacker 活跃值 2011-12-10 13:31
7
0
顶楼主中。。。。。。。。。。。。。。。。。。。
雪    币: 947
活跃值: 活跃值 (25)
能力值: ( LV12,RANK:440 )
在线值:
发帖
回帖
粉丝
loongzyd 活跃值 10 2011-12-11 11:53
8
0
谢谢了楼主的分享
雪    币: 120
活跃值: 活跃值 (156)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
雪yaojun 活跃值 2011-12-11 21:26
9
0
看到.net的就直接绕路走了。。。。
雪    币: 108
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
今夕望月 活跃值 2011-12-11 22:52
10
0
哎?很不错哎。
雪    币: 610
活跃值: 活跃值 (228)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
ugvjewxf 活跃值 2011-12-11 22:59
11
0
暂时看不懂,支持楼主共产主义精神
雪    币: 646
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
leisurely 活跃值 2011-12-12 00:22
12
0
期待你更多的精彩文章与分享~~~
雪    币: 113
活跃值: 活跃值 (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Fido 活跃值 2011-12-12 01:15
13
0
这个强帖...必须留名.....膜拜.Net破解啊...
雪    币: 66
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
chenjacker 活跃值 2011-12-12 08:21
14
0
ILLY不能使用
出现这种情况
上传的附件:
雪    币: 413
活跃值: 活跃值 (39)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
大头和尚 活跃值 2011-12-12 08:35
15
0
感谢分享。很久没看到这样的精彩帖子了。DotNet的程序一直比较头疼。
雪    币: 95
活跃值: 活跃值 (47)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
yzslly 活跃值 4 2011-12-12 09:08
16
0
支持美女,好文
雪    币: 112
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
chenxiaolu 活跃值 1 2011-12-12 10:00
17
0
[QUOTE=chenjacker;1028543]ILLY不能使用
出现这种情况
[/QUOTE]

应该是DOTNET FrameWork的版本问题,建议按照文中所述,在Pure DOTNET环境中测试。建议仅仅安装.NET Framework v2.0.50727 其他任何软件均不要安装。

也有可能是和其他插件冲突,可以尝试将其他插件全部删除后再试。
雪    币: 291
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
冷煞xiaosan 活跃值 2011-12-12 10:27
18
0
Mark一下,抽时间好好看一下~
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
albeta 活跃值 2011-12-12 10:29
19
0
看了楼主的分享的帖子,仿佛自己已经进入了共产主义了。
雪    币: 3650
活跃值: 活跃值 (385)
能力值: ( LV13,RANK:278 )
在线值:
发帖
回帖
粉丝
littlewisp 活跃值 2 2011-12-12 11:12
20
0
顶一下...........
雪    币: 112
活跃值: 活跃值 (11)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
chenxiaolu 活跃值 1 2011-12-12 11:34
21
0
谢谢你的支持,希望大牛们不要吝啬技术,多多帮助我们小菜。除了Hook CompileMethod,希望大牛们能写一些更底层HOOK以及IL代码还原的文章。
雪    币: 78
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
ronging 活跃值 2011-12-12 11:55
22
0
学习学习再学习。
雪    币: 29
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
webwizard 活跃值 2011-12-13 02:39
23
0
标记一下,以后试试看。
雪    币: 209
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
breezer 活跃值 2011-12-13 09:41
24
0
好文,对新手来说也通俗易懂,期待楼主后续大作
雪    币: 209
活跃值: 活跃值 (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
breezer 活跃值 2011-12-13 11:42
25
0
我们只需要将button_click1方法的RAV重新指向到这个新的解密后的方法就行了(.text2的RAV是14000)。但是这里我们一定要注意一个很大的问题,就是Tiny Method 和 Fat Method,由于计算Fat Method的数据有点多,我们还是当作Tiny Method来处理,经过IL代码的大小计算后得出的Tiny Method头应该是CA,因此我们将RAV 14006处修改为CA,(限于篇幅,具体计算方法可以Google之)然后我们再将按钮点击出的Button_click1的RVA修改为14006


我来补充一下这里,相信很多人还不明白:

二进制低位为 0x2 (bit 10) 的是 Tiny,0x3 (bit 11) 为 Fat。Tiny Method Header 长度为 1 byte,除去 2 bits 标志位,剩余 6 bit 表示方法长度。


转储出来的代码大小从 02 7B 到 20 2A 结束共 50 个字节,转换成二进制就是 110010
再加上 Tiny Method 的标志 10 就是 11001010,转换为16进制就是 CA 啦
游客
登录 | 注册 方可回帖
返回