一个简单的.NET程序的脱壳以及破解
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一个简单的.NET程序的脱壳以及破解
前几天有朋友问.NET程序的破解,又鉴于论坛里关于.NET脱壳和破解的文章也不多,于是抽空写一个。由于本人也很少接触.NET的程序,因此文章没什么技术含量,用到的技术也是在网上很早就公开的东西。有什么错误还请多多指教。
本文的目标文件是一个非常简单的CrackMe.
本CrackMe的任务有4个:
1.脱壳
2.去NAG
3.去灰色按钮
4.破解
OK,一个一个来完成任务吧。
一、脱壳
查壳发现为:
按照经验,此程序应该是用.NET Reactor加的壳
下面来脱壳吧
根据前人经验,此壳其实只是在简单的混淆,在运行的同时,在内存中会释放原程序的镜像根据这一特点,我们下断点:BP WriteProcessMemory,然后F9运行,中断下来
中断下来看堆栈
写入的地址为:17B1050
在数据窗口查看,然后拉到最顶端
可以发现,PE头在017B0000
于是可以dump此地址的镜像。
当然,此时dump下来的程序不行,因为还有好多内容没写入。于是,不断SHIFT+F9,直到程序运行。
这时候就可以dump了.
用LordPE,区域转存017B0000这个区段,保存为dumped.exe就OK了.
不过,此时dump后,程序是无法运行的。
我们还得再用CFF修正几个量
(1).选Nt Headers,再File Header,然后选Characteristics,再点旁边的Click here,在出现的对话框中,去掉“File is a DLL”就OK了。
(2)修正MetaData RV A和MetaData Size的值
MetaData RV A值的获得可以用2种方法
第一种:原程序中,下完BP WriteProcessMemory,F9运行,第一次中断的时候就dump这个区段,此时的MetaData RV A是正确的。
在CFF中,选.NET Directory,看MetaData RV A的值,并记录:
记录这个值为A400,然后在dumped.exe中同样修正这个值为A400
第二种:参考老K的文章
CFF中,选Address Converter,然后搜索字符“BSJB”
接着就换算成RV A的值:
换算结果同样为A400
下面接着来计算MetaData Size的值
选Optional Header,接着点Data Directories [x],然后看Import Directory RV A 的值
记下值为BD4C
所以,
MetaData Size=BD4C-A400=194C
故把MetaData Size的值修正为194C
脱壳就到此结束了,再用PEiD查下,已经无壳了
另外一种抓取镜像文件的方法如下(参考老K文章):
首先运行下原程序,继续下标题为:Sample Crackme
OD载入程序,接着F9运行程序,然后ALT+M打开内存镜像,CTRL+B,在搜索UNICODE
字符串“Sample Crackme”
大约搜索2次后,就来到下面的地方:
拉到最上端
然后就选备份,保存数据文件,扩展名改为.exe就行
后续的操作同上
二、去NAG
运行程序可以发现,此程序有个讨厌的NAG,并且作者也要求我们去掉
分析.NET程序常用的工具为:ildasm2.0,Reflector,xenocode fox
我这里就用xenocode fox这个了,因为这个工具可以查看地址
当然,默认的选项可能没显示地址,我们可以自己手动改下设置
在设置中,选DeCompiler这个选项卡,然后勾上“Show method body address”前面的勾就OK了
在语言(Language)选项中,我们先为了分析方便,可以选C#语言,当然你也可以选其他的
OK,下面就找关键地方吧,这个没什么好说的,靠自己去寻找。
很明显了吧,这个地方就是显示NAG窗口的代码。
下面就修改这个代码吧,思路就是,在此代码段的头,直接ret,这样,就可以避免产生NAG 窗口了。
为了看机器码和偏移地址,我们把语言改为中间语言IL Assembly
代码如下:
method private hidebysig instance void uuNkODx(object, [mscorlib]System.EventArgs) cil managed
{
// Method Body Address: 0x00001524
// Code Size: 14 byte(s)
.maxstack 1
.locals init (
SampleCrackme.frmNag nag1)
L_0000: newobj instance void SampleCrackme.frmNag::.ctor()
L_0005: stloc.0
L_0006: ldloc.0
L_0007: callvirt instance [System.Windows.Forms]System.Windows.Forms.DialogResult [System.Windows.Forms]System.Windows.Forms.Form::ShowDialog()
L_000c: pop
L_000d: ret
}
可以发现,ret的机器码为0x 2A,而开头代码段的机器码为0x 73,偏移地址为0x00001524
接着就用16进制编辑工具打开脱壳后的程序,定位到0x00001524,把起始代码0x 73修改为0x 2A
修改后保存一下,就去掉NAG了
三、去灰色按纽
原程序这个Check按纽是灰色,而用一般的灰色按纽精灵又去不掉,因为,我们就自己手动来去吧。
同样用xenocode fox来进行分析