爱收集资源网

逆向工程:一个让你思考的题目

网络整理 2023-10-28 15:06

哪些是逆向工程

先给你们出一道思索题

用C语言设计一个程序,验证输入的密码是否是“12345678”,假如验证成功,就输出“success”,假如验证失败,则输出“failed”。

我想,大部份菜鸟小白恐怕会如此写:

#include 
#include 
int main() {
    char buf[10] = {0};
    scanf("%s", buf);
    if (strcmp(buf, "12345678") == 0) {
        printf("success");
    } else {
        printf("failed");
    }
    return 0;
}

里面的代码编译后,会生成一个可执行程序,俺们来对这个可执行文件进行一下反编译,瞧瞧能看见哪些?

右图是在反编译利器IDA中,可执行文件反编译下来的汇编指令图:

可以十分清晰的看见一些字符串的信息:"success"、"failed"、"1234567。

再认真一看,main函数中有一个分支判定,依据判定的结果,走进左右两个分支,分别输出"success"和"failed"。

假如菜鸟看不懂里面的反汇编图,那可以再使用IDA的神级功能:F5反编译中级语言功能,直接将里面的汇编程序再进一步还原成C语言。

可以对照一下上图中的C函数代码和原先我们的源代码,还原度十分的高了,字符串比较的功能逻辑曝露无遗

可以看见,通过这些方法进行密码匹配,十分不安全,对方领到你的程序一反编译,还能见到密码是哪些了。

不过俺们明天的文章主题不是阐述怎样进行安全地进行密码比较,而是另一个主题:逆向工程。

哪些是逆向工程,维基百科中的解释如下:

逆向工程(ReverseEngineering),又称反向工程,是一种技术过程,即对一项目标产品进行逆向剖析及研究,进而诠释并得出该产品的处理流程、组织结构、功能性能尺寸等设计要素,以制做出功能相仿,但又不完全一样的产品。

逆向工程的概念起源于商业和军事领域,后延展到软件领域。

在软件领域,通过对程序文件进行逆向剖析,推导入程序对源代码设计的过程,称为软件逆向工程。例如前面通过剖析可执行文件还原出C代码,剖析jar包/class文件还原出Java源码,这都属于软件逆向工程。

win32下的汇编程序设计_win32汇编语言_win32汇编语言程序设计

软件逆向工程是网路安全领域中的一个重要分支,网路黑客通过逆向工程可以获得目标的程序原理,破解软件的权限,这通常发生在商业软件领域。另外一方面,黑客通过逆向剖析也常拿来发觉软件漏洞,拿来对其发起功击,Windows作为一个不开源的操作系统,就常常遭到这样的事情。

本文就来阐述一下,逆向工程通常是如何进行的,须要学习什么东西?

程序反编译

逆向的一开始,通过会对目标进行反编译。

作为软件开发者,对编译这个词应当不会陌生,我们写好了程序代码,之后使用编译器将其转换成可执行的程序,这个过程称作编译。

反编译,自然就是这个过程的逆过程,那该选择哪些样的程序进行反编译呢?

对于C、C++、Golang等类型语言编撰的程序,我们通常使用IDA进行反汇编。

对于Java语言编撰的class文件和jar文件,我们通常使用jd-gui进行反编译。

对于C#语言编撰的可执行程序,我们通常使用reflector进行反编译。

所以学习里面三款反编译工具的使用对学习逆向工程十分重要

可执行文件格式

不同的操作系统平台具有不同的可执行文件格式,如Windows上的PE文件、Linux平台的ELF文件、MacOS上的Mach-O文件

一个可执行文件中不仅源代码生成的汇编指令,还有静态数据(如代码中引用到的字符串),导出导入信息,文件属性信息等等,把握提取这种信息,会对俺们了解目标程序十分有帮助。

这就须要学习不同平台上可执行文件的格式,尤其是PE文件和ELF文件,是逆向工程中最常打交道的文件格式。

CPU指令集

在逆向剖析程序时,最主要的精力和时间就是在阅读和剖析反编译下来的汇编指令。

所以CPU的指令集和汇编语言是搞逆向的朋友必学的一门课。

常见的PC端CPU就是Intel的x86、x64和AMD64,联通端的就是ARM构架。建议先从最基本的x86开始学习,尤其要注意网路上好多教程讲的还是16位实模式下的汇编语言,特别容易欺骗人。实模式其实要了解,但要把精力放到保护模式下32位汇编语言。

win32汇编语言_win32汇编语言程序设计_win32下的汇编程序设计

等x86入了门,可以扩充学习x64,到后期再扩充学习ARM。

学习汇编语言,不仅仅是学习汇编指令,更是在学习了解CPU,CPU有什么寄存器win32下的汇编程序设计,分别有哪些用,它是怎样访问显存,怎么进行轮询,怎么进行运算等等。

中级语言特点

俺们逆向工程的目标大都是用C/C++/Java/C#这样的中级语言编撰下来的程序,要想还原出程序的代码逻辑,倘若不懂中级语言本身那肯定是不行的。

其实,做逆向的朋友win32下的汇编程序设计,何必要像专业的开发同事那样对这种语言的特点烂熟于心,把握好多编程技能,这倒不用。

但把握这种语言的基本编程技能还是有必要。拿C语言来说,C语言中函数调用原理,参数怎样传递,函数中的局部变量怎么分布,链表怎样储存,结构体成员怎样显存布局,表针又是怎样实现的等等,这种基础概念俺们得晓得,不然领到反汇编代码,也不晓得怎么与中级语言进行转换。

像前面说到的那些C语言知识,学习的时侯要自己对比源码和编译后的汇编指令长哪些样,反复对比学习,形成条件反射。不仅这种,还要关注C++中面向对象实现原理,虚函数机制,this表针怎样传参,new和delete/delete[]等等在汇编指令层怎样实现。

有些人说,咱不是有F5大法吗,直接一键搞定?其实F5功能十分强悍,我也不反对使用工具,但我们不能过于依赖于工具,不然就弄成一个彻底的工具人,尤其是对于初学者,自己尝试从汇编指令转换成中级语言,会让自己对技术底层原理理解的愈发透彻。并且,有好多时侯F5功能用不了,那种时侯还得靠自己的知识上!

软件调试

好多时侯,光靠静态剖析未能实现目标,例如程序进行了免杀等技术,在静态剖析下看见的全是错误的指令代码,甚至让反编译工具未能剖析。

这个时侯,就须要结合动态剖析技术一块儿上,让程序实际运行上去,再来对其进行剖析,所以,把握软件调试技术,也是逆向工程中不可缺位的一环

结语

以上,就是我总结的几点学习逆向工程须要关注的知识点,希望对你们有帮助。

另外,我整理了一套逆向工程学习的书籍、资料、软件工具、使用教程,早已打包好了,因为资料敏感,就不公开传播了,有须要的同学,可以关注+转发一波,

私信【资料】即可免费发放

win32下的汇编程序设