序:Tankaiha在他的“用PEBrowse对.Net程序进行动态调试”中曾经提到过3种方法可以破解.NET程序,我下面介绍的方法,刚好是他说的第一种,但又不完全是。就是用.NET SDK中自带的调试程序\Microsoft.NET\SDK\v2.0\GuiDebug 对.NET的可执行文件直接进行调试。

因为.NET版本的不同,安装目录有所差别,都可以在1.1和2.0版本的目录里找到GuiDebug这个目录,里面的DbgCLR.EXE就是我今天要说的动态调试器。DbgCLR.EXE程序是我在破解.NET程序过程中,被逼无耐而到处狂翻,无意中找到的工具,而且经过自己的使用,知道了一些皮毛的用法,如果您是老手,还不要取消我J

另:在上篇文章中,忘记告诉大家opcode类查找的地址,可找到opcode指令对应的16进制字节,这样可以方便的修改程序:http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpref/html/frlrfSystemReflectionEmitOpCodesClassLdargTopic.asp

一、     破解目标:crackeme.exe(为某些原因隐藏程序的名称),我会把附件上传到网络空间,给出地址。程序有注册号的限制,而且采用了代码混淆和反跟踪的手段。

二、     破解工具:DbgCLR.EXE, Reflector在4.2.36.0

三、     DbgCLR.EXE的一些简单设置和使用

启动DbgCLR.EXE,是中文版本的,对我们而言很容易就能看懂,我只把几个关键地方提一下。如下图所示。

1、设置调试配置如下: 点菜单中的“工具”——“选项”进行设置。如图一

图一

点选项后出现下面的选择,选中下面的“如果源不可用,则显示汇编”。然后“确定”(下面图二是2.0版的显示)

图二

或者在1.1版中如下图三所显示

图三

注:把实时里的项目都选中。

2、加载程序:从菜单中选择“调试”---“要调试的程序”,从“程序”按钮中选择我们的需要调试的crackme.exe,然后“确定”就可以了。如下图四所示:

图四

选择并确定后,程序不会立刻运行,也不会象在OD中那样立刻分析代码,而是等待我们的下一部命令的输入,而且“调试”菜单中已经多了很多功能。如图五所示

图五

3、设置“异常”选项:可以根据程序的情况来设置,因为正在讨论的这个crackeme.exe采用了很多手段反跟踪等,所以我把异常里所有的选项都选择上了,并且激活。点图五菜单中的“异常”,

图六

调试器环境的设置都差不多了,可以进行下一部的跟踪了。

四、     调试分析

1、分析:用PEID查看,为Microsoft Visual C# / Basic .NET,所以用Reflector打开crackme.exe进行分析,发现Reflector不支持,crackme已经对代码进行了混淆(我把此crackme.exe发送给了Reflector的作者,所以Reflector在4.2.36.0版本以后开始支持此crackme混淆代码的处理,这也就是我最初破解采用动态跟踪这个程序的原因)

改用《NET程序的破解(一)》中的Xenocode Fox 2006 Evaluation打开crackme.exe,发现crackme中很多代码都显示不出来,或者反编译出来的信息对我们基本没任何作用L,即使看到了里面很多reg信息有关的东西,还是没有任何的成型的代码让我们来分析,你的心凉了吗?最初在没发现DbgCLR这个工具的时候,我彻底陷入了悲哀中,用OD和SOFTICE调试.NET的程序,无疑就是一种炼狱生活。到现在我也很感叹对这个crackme进行混淆的人的水平,或者是我刚接触.NET,对.NET了解的太少了,记得Reflector的作者曾经问过我一句” What tool was this file obfuscated with?”,我告诉他我也很想知道。

2、动态调试

在图五中点“启动”或者“逐语句”“逐过程”都可以启动crackme,crackme启动中看来没有对注册信息的验证,点crackme中的“开始”按钮,才提示让你注册,出现注册框,如下图:

图七

在出现的对话框里,我们输入假的注册号”miaomiao”,点“确定”后,crackme会提示你重新启动验证,然后重新启动。

第2次启动crackeme,然后点“开始”后,DbgCLR异常中断,出现提示框,问我们是否中断,选择“中断”后,程序立刻被断下来(多次调试后发现程序已经把我们注册过的信息写入了系统里,点“开始”后就对我们的输入的注册号进行了动态检测比较,并且采用了多处异常的方式来进行)。

此时可以打开几个窗口,从“调试”—“窗口”中选择自己所需要的窗口,我习惯用下面的几个:

图八

Crackme被中断后,看到图八中的“调用堆栈”里的数据,嘿嘿,你看到什么了?秘密就在这里,放大如图九:

图九

在“调用堆栈”中任意双击其中的一个函数,对应的函数代码立刻在“反汇编”窗口里显示出来,显示的效果,跟Reflector里显示的结构很相似,也让我们很顺利的了解了程序的执行结构。哈,这正是我们所需要的;绿色箭头所指的,正是子程序要返回的位置,在我们需要的代码上点鼠标右键,选择“插入断点”,这样程序执行完现在的子程序返回后,就可以中断在这里了。

图十

经过多次的跟踪分析,发现做如下的修改,就可以让程序正常运行而不再提示注册;如果要研究这个软件的注册算法,你就要自己去跟踪分析了J:

NQQTools.CheckReg.Check

00000093 0F B6 F0         movzx       esi,al         ;修改mov al,01

00000096 8B C6            mov         eax,esi        ;修改为 mov esi,eax

00000098 25 FF 00 00 00   and         eax,0FFh

0000009d 89 45 E0         mov         dword ptr [ebp-20h],eax

000000a0 90               nop

000000a1 EB 0E            jmp         000000B1

000000a3 C7 45 E0 00 00 00 00 mov         dword ptr [ebp-20h],0 ;修改为 mov [ebp-20],1

000000aa E8 4B 6B 20 78   call        78206BFA

000000af EB 00            jmp         000000B1

NQQTools.Form1.button2_Click

00000031 0F B6 F8         movzx       edi,al

00000034 85 FF            test        edi,edi

00000036 75 1E            jne         00000056 ;改为 jmp 56

000000a0 8B CF            mov         ecx,edi

000000a2 E8 89 04 A3 78   call        78A30530

000000a7 0F B6 F8         movzx       edi,al

000000aa 85 FF            test        edi,edi

000000ac 74 0A            je          000000B8 ;修改为跳

(注:在代码窗口里可以直接选取,然后从菜单“编辑”—“复制”里把代码复制出来)

五、     总结

程序的注册过程到现在我也没时间去研究了,对我来说注册不注册都不重要了,我写到这里的目的,也同样是告诉你们如何来动态跟踪.NET程序,除了Tankaiha所说的PEBrowseDbg动态跟踪方法外,这应该也算是一个不错的方法了,只要让.NET程序变成我们所熟悉的ASM代码结构,一切都显的那么自然。

DbgCLR.EXE在调试程序的时候,并不一定非要到异常才能断下来的,这是我需要说明的一点,这是我对抗这个crackeme的策略而已。如果在调试其他程序的时候,断点的方法就要靠你们自己去发掘去了,记得有好的经验就告诉我J,我也在摸索中前进。

我对这个混淆.NET代码的人真的很佩服,我曾经用winhex对代码的内存进行动态修改,结果发现内存中的代码类似于动态解码状态,就是函数执行完毕后,代码就没有了,需要执行加密函数时,代码又恢复出来了L,连做内存补丁的机会都不给我。哎,让我想起了论坛里Bi11's Simple Packer for some .net executables的压缩壳。

先写到这里吧,再写多了反而有灌水的嫌疑J,下章节………………………………………………………………

谨以此文献给所有的cracker

NET程序的破解(二)相关推荐

  1. 《流浪地球》程序员破解行星发动机到底靠不靠谱

    文 | 李勤 来源:雷锋网(leiphone-sz)报道 不好意思,又要蹭个热点了. 当我走进电影院,看见程序员李一一说要破解行星发动机的程序,替换成"春节十二响"那一刻,我就知道 ...

  2. 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发

    基于Golang pmlpml/RxGo程序包的二次开发[阅读时间:约20分钟] 一.ReactiveX & RxGo介绍 1.ReactiveX 2.RxGo 二.系统环境&项目介绍 ...

  3. java负数右移_收入囊中篇---Java程序基础(二)

    前言: 本篇是接着上一篇更新的,如果没有阅读上一篇的话,可以查阅或回顾一下. 1.收入囊中篇---Java基础必备知识(一) 2.收入囊中篇---Java程序基础(二) Java程序基础目录 1.Ja ...

  4. [转]使用设计模式改善程序结构(二)

    使用设计模式改善程序结构(二) 在本系列的 第一篇文章中,描述了如何通过设计模式来指导我们的程序重构过程,并且着重介绍了设计模式意图.动机的重要性.在本文中我们将继续上篇文章进行讨论,这次主要着重于设 ...

  5. 黯然微信小程序杂记(二):小程序最新版登录并进行缓存模块的实现 附源码

    黯然微信小程序杂记(二):小程序最新版登录进行缓存模块的实现 附源码 一.功能描述 二.mine.wxml界面图片 三.mine.wxml代码 四.mine.wxss代码 五.mine.js代码 六. ...

  6. SegmentFault 技术周刊 Vol.21 - 程序人生(二):2016 这一年

    在第 18 期社区周刊<程序人生>1 中,我们汇总图灵访谈.SegmentFault 内部程序员访谈.社区开发者的编程之路和工具利器等,分享 2016 这一年里,社区开发者们的日常.其中提 ...

  7. 微信小程序把玩(二十八)image组件

    原文:微信小程序把玩(二十八)image组件 image组件也是一个程序不可缺少的,可以这样说一个app中image组件随处可以看到,一般 image有两种加载方式第一种是网络图片第二种是本地图片资源 ...

  8. 微信小程序把玩(二十七)audio组件

    微信小程序把玩(二十七)audio组件 原文:微信小程序把玩(二十七)audio组件 音频播放已经封装的很好!只需配合属性设置即可! (method和data配合使用) 主要属性: wxml < ...

  9. 微信小程序把玩(二十六)navigator组件

    微信小程序把玩(二十六)navigator组件 原文:微信小程序把玩(二十六)navigator组件 navigator跳转分为两个状态一种是关闭当前页面一种是不关闭当前页面.用redirect属性指 ...

最新文章

  1. 石墨计算机,高性能计算机助力石墨烯生产工艺的优化
  2. 数字语音信号处理学习笔记——绪论(1)
  3. DB Intro - MongoDB User
  4. 学习Netflix管理员–第2部分
  5. Dynamics CRM 开启图表的3D效果展示
  6. Spring Cloud 参考文档(Spring Cloud Context:应用程序上下文服务)
  7. 利用ida python 实现复原函数调用的参数 (仅对数据被简单硬编码有效)
  8. [转]你会做Web上的用户登录功能吗?
  9. 价值50个亿的10句话
  10. Mac、centos安装MongoDB
  11. 清明上河图对计算机技术的启发,吴良镛院士:《清明上河图》启示的城市方向...
  12. 微信小程序引入UI组件库
  13. 我奋斗十八年不是为了和你一起喝咖啡!
  14. 环境和社会风险分类c类_风险分类
  15. 信息安全数学基础-扩展欧式算法 2021.9.10
  16. 操作系统知识点总结和题集大杂烩
  17. Python--抽奖概率统计测试
  18. 怎样开始学做自媒体?怎么起步?
  19. hive:函数:转换函数:cast
  20. 消除计算机上的静电有哪些方法,电脑有静电怎么消除

热门文章

  1. 调整图像亮度brightness,对比度contrast,饱和度saturation方法整理
  2. 13:1群殴还不赢,腾讯短视频真是扶不起来的阿斗?
  3. UE4-(蓝图)第二十六课关卡流送(体积域)
  4. 宝尚在线炒股攀钢钒钛,钒涨价最受益标
  5. 【计算机毕业设计】个人交友网站
  6. pcb二次钻孔_用二次钻法解决PCB半金属化孔故障-PCB技术专题
  7. python利用dominate库生成静态网页
  8. 使用Git工具从GitHub上文件代码进行上传下载(图文详细)
  9. arduino 基础设备使用-数码管
  10. 2021 CV NLP CTR 多模态深度学习 超越SOTA新模型整理