首页
社区
课程
招聘
[原创]DotNet混淆后程序的破解
发表于: 2010-9-21 13:33 18847

[原创]DotNet混淆后程序的破解

2010-9-21 13:33
18847

目标软件:EmailXXXXX

软件功能:发送EMAIL,验证EMAIL,搜集EMAIL于一体。

软件语言:Dotnet Vs2005 framework20 平台运行。

破解工具:DotNet Id.exe 检测何种.NET混淆器加壳 Reflector DotNethelper Hexchange(自己写的) dbgCLR(微软自己的调试器)Editplus

工具说明:静态工具:Reflector 查看一些类信息 DotNethelper把程序反编译为IL文件然后在重新用IL文件生成EXE Hexchange这个功能比较简单就是把十六进制转为十进制,或者汉字,方便分析 Editplus这个就是方便打开IL文件,然后查看,修改,查找关键字。动态工具:dbgCLR 设置断点跟踪流程

破解思路:

     1,先确定是否加壳,加密,混淆,用DotNet一试,即知,被 混淆 处理过。混淆器为VS2005自带的工具Dotfuscator 。

     2,用Reflector 出马。结果看到的全是ab,a,d,e,f,,,,,等这类的函数名,类名,过程名,果然,大大小小100多个类名,就名称什么也看不出。双击查看代码内容,也看不出太多内容,好多显示无法反编译。

      3  再在用DotNethelper出马,导出为IL文件,然后在编译一次,运行,OK。基本上无大问题。

          然后在随便找一个ldc.i4.1 的代码改为 ldc.i4.0 然后在重新编译一下,在运行,OK,说明无强名,文件安全性校验,省事不少。

     4,在恢复原来代码,再次编译前,加上/debug选项,然后生成一个同名的.pdb文件,这个是用来调试设置断点用的。

    5,以上操作完毕,现在就要轮到dbgCLR出手了,进行动态调试,跟踪变量。

       在正式开始之前,IL语言的帮助手册,准备好,以备查命令使用,如果一时不记得用哪个命令。

      接下来,就是用dbgCLR打开IL文件,然后在调试菜单中选择调试的程序,打开目标EXE文件,然后,按F5就可以开始运行动态调试了。到了断点后就改为F11/F10,用这工具调试,最重要的就是,要知道在哪里下断点,跟进程序执行流程,准备好笔纸来记录,关键代码,跳转等都可以。如果不知道怎么断点。建议用Editplus这类文字软件,打开IL文件,在代码中搜索一些关键字,找到自己感兴趣的内容,比如 对于按钮类,则查找 windows.forms.button这类关键字,来定位按钮这一块代码,然后在结合上下文,分析,上下文中,可能会出现一些类似按钮文本字符,这些都是非常好的突破口,我就是利用这一点,慢慢定位到了关键代码,然后在在dbgCLR中设置断点,检测是否判断正确,如果正确中断了,然后在记录关键流程,因为在IL代码中,几乎都是用SWITCH方式来决定程序执行步骤与去向的,所以,用笔记录关键点跳转,就可以很方便就知道了问题在哪。。。然后在返回去,结合自己的判断与分析,用Editplus修改关键点代码,改变流程,在重新编译生成EXE后,由dbgCLR二次加载,进行动态调试,检测自己的分析是否有误。对于关键代码,本人就是从Thread.Start()入手,(因为这是一个多线程程序,只有工作时才启动多线程)逆向反推,然后找到了关键的代码条件处,把brtrue改为了brfalse(要注意堆栈平衡,不能直接用br跳转),然后验证了此方法的正确性,最终,半天不到的时间,把未注册的提示信息,发信时的对于没有注册的只能发,10条EMAIL的限制与保存时只能保存100条EMAIL的限制,全部去除了,然后在把他变灰的按钮改为了可用,然后在加上了正确的跳转事件地址(变灰后,对方原代码跳转为始终不工作,但程序中是有能正确工作的代码断)故,我能正确修改成功,当单击后让他跳转到应该执行的地方,完成相应功能,而且对于ListView控件中的双击事件,也进行了处理(原代码中也同样有正确工作的代码,但是此版本没有正确跳转)故一一修复之。然后在重新编译生成,一切OK,去掉了各种限制。交给了相关同事使用。

时间:2010-09-21 13:32 明天就是中秋了,祝兄弟们节日快乐。


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

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 20
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
顶一下,刚接触.net的逆向,楼主的提纲不错!
2010-10-18 21:45
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不错,,学习。。。
2010-10-19 10:42
0
雪    币: 199
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
这个正好研究一下,学习了
2011-5-21 09:26
0
雪    币: 12310
活跃值: (5068)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5

学习了哟,多谢分享
2011-9-17 13:57
0
雪    币: 419
活跃值: (31)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
学习一下
2011-9-19 07:44
0
雪    币: 41
活跃值: (184)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
mark..../
2011-9-20 01:03
0
雪    币: 223
活跃值: (80)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
其实检查有无强名称,打开IL文件头就可以知道的.
混淆过的.net ,我通常都是静态调试来搞定。动态的没试过,楼主介绍的方法很有参考价值
2011-9-20 10:50
0
游客
登录 | 注册 方可回帖
返回
//