首页
社区
课程
招聘
[原创][讨论]Anti-Debug引发的思考
发表于: 2012-12-15 17:58 24045

[原创][讨论]Anti-Debug引发的思考

2012-12-15 17:58
24045

我是VC++程序员,不到两年的windows下编程经验,喜欢底层、逆向分析,各方面来讲,我只不过是个有激情的新手。
初入樵新手CrackMe博物馆的第一页里面,有个叫Pr0Zel的前辈作者发过一篇自作的CrackMe和破文,我的想法和学习计划很简单,就是从这个前辈的CrackMe开始,不断的做类似的练习题。
这是我的第一道带有Anti-Debug技术的练习题。
Anti-Debug技术在我的思维里面,是个真正考验底层技术的试验,但我在这方面比较欠缺,只得先从他的破文开始看起。
这个Crackme有两个Anti技术,第一是用IsDebuggerPresent函数检验程序的调试状态;第二是启用一个计时器,不断的进行CRC文件较验。两者结束程序的方法相同,均用PostQuitMessage方法。
破文从开篇就揭示谜底,用猜测的方法试验程序是如何退出的,比如用OD的IsDebuggerPresent插件,其后又猜测程序是用哪个函数退出的。由于这个CrackMe就是Pr0Zel前辈自己写的,所以这些猜测“恰好”被猜中了,然后CrackMe的Anti-Debug陷阱被攻破了。
我通过Pr0Zel给的链接地址,下载他的CrackMe以及破文,从某种意义上,他是我未谋面的老师,我发此贴子并非商讨老师的教学方法是否得当,也不是发泄我对他的不满,事实上,他无偿地发表CrackMe以及破文,我是挺感谢他的——起码引发出我对某些问题的思考。
破解Anti-Debug技术,用凭空猜测的方式对学习是无益的,这样并不能锻炼增加逆向分析能力,所以我便有了这样的拙见:首先正常运行CrackMe,运行良好,退出它吧;接着用OD调试一份新的CrackMe实例,按F9让它继续运行后,发现它退出了,则说明它有Anti-Debug技术,下一步就应该反推它的退出方式,大致有两种可能:1.在消息循环里用ExitProcess结束进程。2.给消息队列发送退出消息,便其正常跳出消息循环。找到退出方式后,再反推退出条件(即触发条件)。
退出方式->退出条件。这两个步骤,我认为可以解决一个Anti-Debug陷阱,这样的反推逻辑(或步骤)是不是正确的呢?或者说是不是对学习真正有益的呢?
假如真的是正确的,那么问题又来了。
我按照上述的反推逻辑自三个星期前做起,停留在退出方式这一步骤,一直毫无进展。这个CrackMe是基于MFC的程序,若要真的做到寻找到退出方式,是不是必须精通MFC的实现机制,那么是不是意味着每要破解一Anti-Debug,都需要熟悉该程序的框架架构机制?
就像破解加壳软件必须先找到OEP一样,破解Anti-Debug是不是也要首先找到程序的主体代码(比如说窗口回调函数的应用程序实现的那部分,非MFC基类实现的那部分)?
这些问题在我看来,均是方向性问题,决定了船的航向,正所谓差之厘毫、谬以千里,所以很多情况下,我在这些问题上一直犹豫不决(比如这次的CrackMe,平均每天三个小时,持续三个星期,却毫无头绪),不敢轻易涉足,生怕一个不慎,导致自己走弯路从而发生花费大量时间与精力做无用功的事情。即我迫切需要一个良师益友。
以上问题比较杂乱,却是一个有点茫然但很执着的程序员此时学习道路上的真实感受与心理写照。
Pr0Zel前辈的CrackMe和破文敬上:


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 6
支持
分享
最新回复 (18)
雪    币: 257
活跃值: (67)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
同样对底层感兴趣,支持一下LZ
2012-12-16 05:44
0
雪    币: 8519
活跃值: (5690)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我与楼主有同样的疑惑,所以注册看雪至今,进步不大。。。wang高人指点迷津
2012-12-16 09:43
0
雪    币: 106
活跃值: (609)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢分享!!!非常感谢!
2012-12-16 10:15
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
真心纠结,求大家各发己见
2012-12-16 18:36
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
感觉破解Anti-Debug技术最大的难点在于反推出程序的退出方式,但是我连程序的主体代码都找不到,不知有啥技巧可以学习?
2012-12-16 18:48
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
自己顶一个吧
2013-2-3 09:46
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
你还不是一个程序员而是一个程序猿,等你成为真正的程序员,理解破解和逆向也只是看你是否有兴趣而已
2013-3-5 19:27
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
9
此话何解?难道不需要努力学习的么?
2013-3-13 17:12
0
雪    币: 398
活跃值: (676)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
10
我比较熟悉MFC流程框架,一下子就找到了处理按钮事件,不用3分钟.剩下的事情就是分析验证算法了,       
可以关注一下我写的这篇文章.
【原创】每日一破解(第5天 CM测试等级破解) 江湖将会有我的传说
2013-4-3 16:16
0
雪    币: 234
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
我的思路就是ida看看都调用了什么系统调用,如果能看到退出性质的调用就一个一个查,然后把不应该有的退出调用都爆破掉,于是antidebug就废了。
2013-6-15 09:56
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
你起码保证你能看懂程序在做什么吧,退出方式有无数种,一个完全陌生的程序你怎么去推。如果程序已经知道是MFC写的你应该感到开心。因为程序员在MFC框架里写程序的时候能添加antidebug的位置代码无非就是在一些事件当中,换一句话说整个mfc框架都是“善意”的,你只要在一个框架中找到你要处理的部分后看看他做了什么“恶意”的事情就好了。

就像所有的window程序都会调用api,那么是不是必须要精通api才能当一个好的windows cracker呢?这不是废话吗,那么多的汇编指令,不可能所有的部分都去逆向的,你必须要有个大体的框架,一些相对固定的东西作为整体概念,引导你找到关键区域,再对关键区域去逆向阅读,做你想做的事情
2013-7-9 20:02
0
雪    币: 420
活跃值: (77)
能力值: ( LV13,RANK:500 )
在线值:
发帖
回帖
粉丝
13
Scientific but Not Academical Overview of Malware Anti-Debugging, Anti-Disassembly and Anti-VM Technologies

不知道有帮助否?
上传的附件:
2013-7-9 23:31
0
雪    币: 219
活跃值: (878)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
14
顶 mark 学习经验
2013-7-10 00:05
0
雪    币: 0
活跃值: (85)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
感谢“hulucc”,尤其是“你必须要有个大体的框架,一些相对固定的东西作为整体概念,引导你找到关键区域,再对关键区域去逆向阅读,做你想做的事情 ”,如醍醐灌顶,我想我应当把该句当作kill anti-dubug的座右铭!
2013-9-11 13:05
0
雪    币: 153
活跃值: (404)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
呵呵,我现在和lz一样,在论坛上找点软件练习,我并不会感觉浪费时间和精力,也不会说自己走弯路,因为喜欢,所以执着,而如果你只是为了赚钱或者怀着某种目的 。(像你这种怀着怕走弯路的思想不可取),只能说动机不纯。。。
我始终坚信,只有兴趣才能决定你能走多远。。。
2013-9-11 17:33
0
雪    币: 59
活跃值: (142)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
17
程序中有两个CRC校验
如果让我来写这个程序
怎么样才能让两个CRC校验同时满足条件呢?

比如
一个CRC算出 是  0x11223344
我们修改了程序相关验证位置为0x11223344本身之后

遇到第二个CRC校验  我们写上同样的位置  那么  第一次的CRC校验值就不是0x11223344

意思就是  第一个CRC校验的范围包含了  第二次 CRC校验的值
但源程序中好像两个CRC同时满足了对方
望解答  怎么实现的
2013-9-16 22:09
0
雪    币: 81
活跃值: (115)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
18
你所描述的是需要数学上算法支持的,并且对CRC验证的内容有所要求,我估计是你弄错了。
CRC直接去掉验证转跳不就好了
2013-9-27 23:03
0
雪    币: 59
活跃值: (142)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
19
谢谢你回复

我只是在这里超级好奇 作者是这么实现的
并不是想说怎么的好过它
2013-10-4 16:41
0
游客
登录 | 注册 方可回帖
返回