如何学习逆向工程?

文章讲述了逆向工程师的工作内容,强调理论与实践相结合的重要性。逆向不仅是调试和反汇编,而是建立心理模型和定位底层细节的过程。调试器和模拟器在逆向中起到关键作用,同时指出理解和掌握工具原理、可执行文件加载过程以及具备C/C++编程基础是必要的。作者还提醒新手要专注于一个平台并积累实践经验。
摘要由CSDN通过智能技术生成

作为一个老逆向工程师,有几句话想讲。

2010年就开始搞逆向了,那时候是windows平台,这两年搞起android了。首先逆向是个困难的工作,需要理论,也需要实践。

理论方面,必须清楚的认识逆向的本质是什么。放到更大的环境下来看,逆向从来不是最终目的,最终目的一般是要实现某个东西。

广义上,逆向不仅仅是调试二进制可执行格式,反汇编,破解。逆向是心理模型的建立过程,以及模型实现的底层细节的定位过程。

从理论上看,你为了理解系统,你读代码,无论是源码还是汇编,甚至二进制机械指令,都是一个逆向过程,其结果就是建立了一个模糊的心理模型,用于理解系统的运作过程,然而系统代码是复杂的,庞大的,只凭脑力难以定位底层细节,需要借助工具,如反汇编器,调试器,模拟器。有人认为学好了汇编语言,就相当于可以阅读任何闭源软件了,这显然是错误的思想,没有理论上的清晰认识,容易进入这个思维误区,给定一个逆向的目标,不去搜索背景信息,已有成果,而是一头扎进汇编独自探索,是愚蠢的行为。

因为人类的临时记忆是非常可怜的,靠脑力仅能推演很短的代码量,通过纯汇编去推演高层逻辑,是人脑不可承受的,即便理论是可能的,但时间也是不可承受的。所以推演必须要让cpu来执行,人脑只负责在特定的条件下让系统停下来,读取推演的结果。于是就有了调试器。用了调试器,人脑只需判断并控制条件逼近底层细节,具体的就是操作软件,并结合条件断点来定位底层代码,这样在效率上比人肉调试器就有了质的提高。

而这种逆向模型,在很多时候仍然不够,因为它要求逆向者对软件高层概念对底层代码的映射有清晰深刻的理解,也就是编译器如何把源码层的概念编译为底层代码的,比如高层的函数,语句,变量,如何变为底层的函数,汇编,内存地址的。一般情况下,逆向者阅读汇编会直接反向映射为高层的函数语句变量等,但是也仅此而已,拥有源码的人根据函数名就知道这个函数是干嘛的,而逆向者需要更多的信息才能知道,在仅依赖汇编的基础上,如何才能得知这段代码的功能呢,关注它的输入和输出,以及所调函数,这决定了它的功能。

在输入和输出上以及所调用函数的断点上抽取信息做判断,这是和琐碎的工作,是体力活,于是面向调试器脚本的编程又将逆向推进一步。逆向能力随着逆向手段的增强而越来越强,软件保护的一方也在不断进步,从开始的反调试,反反汇编,此阶段逆向与保护的能力基本持平,此消彼长,水平依赖于经验,后来发展到虚拟机保护,保护的一方对逆向破解者造成对抗上的碾压。逆向者面对虚拟机保护一筹莫展,原来的知识体系仅能逆向虚拟机,对虚拟机指令无能为力,并且没有现成的反汇编器可用,当其中混入了反调后(直接使用系统调用指令),常规逆向走入了死胡同,期待出现新的逆向手段。终于基于模拟器的技术承担了这一重任,cpu模拟,全系统模拟,污点分析,程序切片技术,总的来说是面向模拟器分析的编程。

模拟器是天然规避反调试的,虚拟指令不用分析了,因为大部分情况我们不需要那种心理模型了。这个对抗阶段,是多种技术方案并存的,因为门槛比较高,虚拟机保护基本是要花钱的,逆向破解也少有人能力足够来做。目前这个层次的对抗是个神仙打架,大家围观的状态。

在实践上,你需要理解流行的寄存器机器,流行的操作系统,可执行文件格式,流行的工具,这四个东西的原理。总的来说分三大平台

windows,mac/ios,android。linux不算,因为开源,在实践上研究linux不叫逆向(虽然理论上是)。这三大平台都(至少)支持intel,arm两种机器架构。

但就现实流行度来看,windows平台基本绑定了intel, mac/ios绑定了intel和arm,android绑定了arm/java。可执行文件格式分别为pe,macho,elf,流行的工具

有的是平台特定的,有的是通用的,林林总总的很多,总的来说包括编译器,汇编器,调试器,模拟器,二进制分析对比工具,重量级集成式工具。

编译器包括:msvc,gcc,clang,javac

汇编器包括: 相当多的工具都具有汇编和反汇编功能

调试器包括:msvc,windbg,od,gdb,ida,xdbg64,lldb

模拟器或沙盒包括:qemu,bochs,unicorn,vapp

二进制分析对比工具:beyondcompare,010editor,binutils

重量级集成式工具:visualstudio,xcode, android studio,temu,panda,bap,angr,r2,

hook工具:开源detour,其他各类hook,

以上工具挂一漏万,实际上工具实在太多了,光熟悉工具都要耗费很多精力,经常的,你发现一个工具,然后研究使用,然后弃之如履,极少的视如珍宝。

特别提出的工具:visualstudio + visualgdb,其调试功能涵盖windows,android,linux,在理解开源代码方面非常有力。开源与逆向何关?原因在于很多时候工具过于复杂,导致需要先理解工具,比如unicorn,bochs,甚至xdbg64,或者android的java虚拟机。曾经有一股歪风,吹捧linux,鄙视windows,吹捧命令行,顺便鄙视可视化工具,实际上,命令行有命令行的优势,可视化有可视化的优势,尤其是在集成开发调试上,集成开发调试工具上,最大限度的专注于相关信息的展示,以及减少操作,命令行在这方面是劣势,命令行的优势在于快糙猛的拼凑功能代码,优势在于快速实现一个定制的补丁或功能。

特别喜欢的工具:unicorn,这是高级逆向的基石,为什么unicorn优于基于qemu的全系统模拟工具呢,因为工具也在发展,并且全系统模拟牵涉了太多的组件和信息,很多时候一个缺陷让你没法用,或者要解决这个跟手头认为毫不相干的问题。unicorn + softmmu,用来构建运行环境,这时候有个问题,就是你仍需要大量的平台底层知识来使它像真实环境那样来运行起来,很多时候这是很考验技术深度的,事实上你可以用调试技术来动态的编程获得,前提是unicorn必须编译运行在目标平台上,在windows,mac,linux上这是容易的,幸好,最近unicorn也能在android上运行了。

对于有志于逆向的新手,几句忠告:

1. 实践重于理论,好的理论会败给实践。

2. 集中精力在一个平台的一个小领域选个平台吧,win,或mac,或android,先找工作在说。因为东西太多了,学不完的。

3. 尽可能的理解工具原理,通过各种手段。

4. 可执行文件的加载执行过程是核心的知识,你需要一个加载器源码在调试器中把玩。

最后, 抱歉,我好像忽略了c/c++的编程能力,我假定你有2-3年的c/c++的编程编程经验,没有这个基础,劝你先别做逆向,先编程吧,c/c++是必须的。

网络安全学习资源分享:

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

在这里插入图片描述

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享 (qq.com)

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

在这里插入图片描述

CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享 (qq.com)

因篇幅有限,仅展示部分资料,需要点击上方链接即可获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值