看雪编辑语:
本篇是《Nothing Is Impossible》系列文章的第三部,也是本系列文章的最后一部。
前两篇回顾:“我与看雪” | 关于成长,关于回忆“我与看雪” | 关于成长,关于回忆(2)
虽然本文写于8年前,但内容并不过时。这一部分如同一篇指南,作者提出了一些学习方法,对刚入门的小白们十分有用,希望能对你有所启发。
Enjoy it~
Nothing is Impossible——看雪十年
第三部 看雪十年之看雪菜语
文 | nba2005
2009.12
看 菜鸟想飞密界
雪 冻难冷高手梦
十 万小时何足道
年 月如梭绝技锤
我是菜鸟又菜鸟,我能学会破解码?
Nothing is impossible!
对于菜鸟而言,如何才能高效而迅速地成长为密界高手呢?心傲的我,带着这个疑问闯进了看雪。看雪的资料和我的自学秉性相互结合,让我对逆向有了自己的一些肤浅认识。
首先,我们需要的是对加密和解密进行对象定位。加密和解密是对软件安全研究的学科。
它的研究对象是程序。程序由一个主线和两个部分组成。主线是程序流程。两个部分是程序结构和数据。
解密难学,难在何处?
解密之难,难在程序结构和数据相关规定的繁复上。
解密之难,难在多学科、多领域的交融组合。这就对解密者的知识面提出了极高的要求。
作为菜鸟,能够学会解密吗?
Nothing is impossible!
作为菜鸟,如何学习解密?
你是如何学会、精通游戏的?游戏的入门,首先是游戏规则的熟悉和掌握,其次是游戏的常规打法的了解、掌握,最后是不断地揣摩、总结,打出高水平的游戏。
游戏和解密的最大不同,就在于规则的简繁上。解密涉及的程序结构和数据的诸多繁琐的规定,对入门者的兴趣维持是很现实的考验。甚至是能够熟练运用高级语言编程的高手,对于系统底层相关的结构和数据的知识也需要大量的精力和时间去熟悉和掌握。
想要速成的人,只需要学会并掌握如何使用解密工具就足够了。
要想进一步的提高自己,我觉得首先学习者自己要有“十年树木,百年育人”的认识。其次,要坚持循序渐进,打好解密基本功。特别是非计算机专业的,要有充裕的时间来玩解密。
作为计算机专业的入门,最困惑的是如何高效的下断。其次是不会调试分析,易语言和MFC是他们的头痛之处。最后是对底层系统的程序结构和重要数据的认识缺乏,常见的如SEH和反调试。
他们学习的盲点在于逆向分析思维的意识不足。写出注册机是学习提高的必经途径。更高层次是手动脱壳分析,分析重点是壳的保护机制,通过壳的分析和学习,追溯相关的程序结构和数据方面的知识。作为高效率的解密学习,对相关保护技术的编程是捷径。再提高就是不断地交流,和实践的反复锤炼。
作为非计算机专业的入门,在现在的加密水平下,在多学科知识相结合的大趋势下,想要得窥门槛,难度是巨大的。然而,业余起步的逆向高手,往往不飞则已,一飞惊人。作为业余的,我想除了少数天赋极高的人才外,大多数人最现实的学习解密之道是对解密的某一方面进行深入的研究。例如脱壳、翻译、教学等。
看雪网站上的解密资料是我所见过最全的。如何充分利用好这份资源?
模仿是人的天性,也是入门的必然学习途径。但模仿到一定时候和水平,必须要有自己的思考和笔记。笔记的内容不是流水账。笔记要求你对自己的体会尽量浓缩成最少的语言来表达。
笔记并不是记录你的成功结果,而是对你的困惑和解决之途的探索及所得,要善于归纳总结。举个简单的例子:
学脱壳的都知道脱壳的七种基本方法如下:
方法一:API函数法
方法二:ESP定律法
方法三:内存镜像法
方法四:一步到达OEP
方法五:最后一次异常法
方法六:模拟跟踪法
方法七:“SFX”法
就我现在的理解,我将上述七种方法归纳总结成一句话:上述方法都是对壳的流程的不同解读,解读的目的是最大效率地找到OEP,从而能够迅速定位自己关心的问题。
运用到我们的脱壳实践中,如何迅速地把握壳的流程是选择高效率地脱壳切入点的关键。随后才能对我们关心的壳的相关保护机制进行剖析和学习。比如,老是看到有人在脱文中说手动追踪IAT加密时,按SHIFT+F9按了数百下,手都酸了,眼睛估计也挺累的。这个人脱壳分析低效的关键在于对壳的流程的把握和理解不足。随着你对壳的流程理解的深入,你可以有好几种方法从低效中解放出来。
在模仿中始终要以批判的眼光有选择地吸收,善于发现问题,经常举一反三,才能学得扎实,学得深入。
例如
1. 关于脱壳中SEH的调试,许多脱文都是教我们说看堆栈的SE句柄。然而,我用的看雪版本里没有SE句柄的显示。
2. 已经按了SHIFT+F7进入了SEH,怎么办?难道要重头再来?OD查看里有个SEH链,一看就行。
3. 被壳修改了SEH的处理代码的地址怎么继续单步跟踪?复习一下,SEH结构的深在含义,尤其是CONTEXT指针+B8的理解。
4. 碰到INT 2D,如何用OD进行调试?
5. 壳的某个SEH处理代码中有反硬件断点处理,我手动分析时,发现花指令繁多,可读性差。如何高效地迅速定位到对反硬件断点处理的代码位置?
这些所有的实际调试中遇到的问题,都迫使我们回头一次次复习SEH结构,更对FS:[0]的理解日益清晰。最后的问题:堆栈的SE句柄显示的原理是什么?一切问题的核心,都归结为对SEH结构的理解层次,以及对于结构中重要数据的含义的理解层次。
高手重结构,
新手重数据,
F7脱壳王道,
核心是调试。
ccfer的神奇是他不断追求完美、追求高效的回报。作为模仿者和学习者,我们除了学习他的破解之法,解题思路,更要揣摩他的高效秘诀。为什么高手定位IAT加密如此高效率,脚本编写代替手工分析是关键。于是,我开始学习LOVEBOOM的OD脚本编写。对于SEH异常,对于已经掌握的反调试(锁键盘鼠标、EnableWindow),都可以用脚本来交互式调试。
要学会自我钻研,触类旁通。一些脱壳文章中,介绍说查找FF25来迅速定位IAT表的位置。那么,能不能找到一种比FF25更简便、适用范围更广的迅速确定IAT表方位的方法呢?存疑是最有效率的学习方法。我自己总结出一种。后来又翻出看雪的旧帖,学到了另外的方法。
作为加密和解密的独特魅力所在,就是对于漏洞的发现和攻防。许多加密者往往对这些漏洞缺乏感性的认识,导致加密作品的秒破。对于算法漏洞而言,我以前总结出两条:特例漏洞和常量漏洞。这次的Crack Me 2009大赛,让我对概率漏洞和穷举漏洞有了全新的认识。对于结构漏洞,则内容相当丰富。例如,爆破点就是最最基本的结构漏洞。
不断地交流,在交流中探求差距的原因,是走向高手的最有效率的提高方式。ccfer、sessiondiy和乌龟大师给了我很多的临摹机会,许多无名的高手的文章也对我启发不小。Petnt大侠的破文,让我认识到学习汇编编程的重要性。这次ccfer的表演,更加深了我对学习汇编编程的重要性的认识。在每周一次的实际脱壳练习中,我开始尝试不看内存、寄存器和堆栈的内容,进行汇编代码的阅读、分析。感觉很别扭,也很吃力。我明白循序渐进的重要性。同时,我开始有意识地理解老壳的特征码的内在含义所在,有意识地记忆一些特殊的机器码,梦想有一天能够养成下意识的反汇编本能。以后有时间,学习汇编编程是不错的选择。路漫漫其修远兮,吾将上下而求索。
我能吗?Who knows,just do it!一步一个脚印。有耕耘,就会有收获。
Nothing is impossible!
看雪的美女都喜欢看雪!
Nothing is impossible!
第三部完
这篇文章到这里就结束了,欢迎大家留言写出你的感受。
文思泉涌的你们也可以立即写下你们的故事,
参与我们的征稿活动哦!
征稿活动详情如下:
戳图片
领取专属 10元无门槛券
私享最新 技术干货