首页 > 编程知识 正文

新手上路网站(兔小灰和兔小白的情书)

时间:2023-05-04 17:08:31 阅读:70850 作者:3881

什么是逆向工程? 我是写代码的篮球。 这篇文章是从jmdmz的文章转写的。

给大家出考题:

用c语言设计程序,验证输入的密码是否为“12345678”,如果验证成功则输出“success”,如果验证失败则输出“failed”。

我想大多数初学者fzdxxm都会这样写:

# include stdio.h # include string.hint main () charbuf(10 )={0}; 扫描(' % s ',buf ); if(strcmp(buf,' 12345678 ' )==0) (printf ) ) success ); }else{printf('failed ' ); }返回0; }编译上面的代码后,将生成可执行程序。 反编译这个可执行文件,看看你能看到什么。

下图是用反编译神器IDA反编译可执行文件的汇编指令图。

可以非常清楚地看到几个字符串的信息。 ' success '、' failed '和' 1234567。

再仔细看,main函数有分支判断,根据判断结果进入左右两个分支,分别输出' success '和' failed '。

如果初学者看不到上面的反汇编图,可以使用F5反编译高级语言功能(IDA的上帝级功能)将上面的汇编器直接还原为c语言。

请比较一下上图中的c函数代码和原来我们的源代码。 恢复度非常高,字符串比较的功能逻辑已经明确。

用这种方法核对密码是非常不安全的,如果对方拿到你的程序并反向编译,你就会看到密码是什么。

但是,今天文章的主题不是讨论如何安全地进行密码比较,而是另一个主题逆向工程

什么是逆向工程,维基百科解释如下。

逆向工程(Reverse Engineering)又称逆向工程,是对某一目标产品进行逆向分析研究,演绎推导出该产品的处理流程、组织结构、功能性能规格等设计要素,制作功能相似但不完全相同的产品的技术流程

逆向工程的概念从商业和军事领域开始,并延伸到软件领域。

在软件领域,通过逆向分析程序文件,推导出程序设计源代码的过程称为软件逆向工程。 例如,上面通过分析可执行文件来恢复c代码,通过分析jar包/class文件来恢复Java源代码,但这都是软件逆向工程。

逆向工程是网络安全领域的一个重要分支,网络黑客可以通过逆向工程获得所需的程序原理,并对软件权限进行解密。 这通常发生在商业软件领域。 另一方面,黑客常用于通过反向分析发现软件漏洞并发起攻击。 作为非开源操作系统,Windows经常遇到这种情况。

本文就来探讨一下,逆向工程一般是怎么进行的,需要学习哪些东西?

程序反编译的最初,通过会反编译目标。

作为软件开发者,你应该不太熟悉编译这个词。 我们写程序代码,用编译器把它转换成可执行的程序。 这个过程称为编译。

反编译当然是这个过程的反过程,应该选择什么样的程序进行反编译呢?

对于用c、c、Golang等类型语言编写的程序,一般使用IDA进行反汇编。

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

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

所以,学习使用上面三个反编译工具对学习逆向工程非常重要。

根据可执行文件格式操作系统平台的不同,windows 3358www.Sina.com/、Linux平台PE文件和MAC操作系统3358 www.Sina.com /

可执行文件除了从源代码生成的程序集指令外,还包括静态数据(如代码中引用的字符串)、导出信息的导入和文件属性信息。 掌握并提取这些信息有助于了解目标程序。

这需要在各种平台上学习可执行文件的格式。 特别是PE和ELF文件是逆向工程中最常用的文件格式。

在反向分析程序时,CPU指令集最重要的劳力和时间是读取和分析反编译的汇编指令。

所以CPU的指令集和汇编语言是逆向操作的同学一定要学习的课程。

常见的PC端CPU是英特尔的x86、x64和AMD64,移动端是ARM体系结构。 我建议你先从基本的x86开始学习。 特别要注意的是,互联网上的许多教程仍然在讲16位教程模式下的汇编语言。 容易引起误会。 真实模式当然要理解,但必须在保护模式下致力于32位汇编语言。

x86入门后,可以扩展x64进行学习,后期再扩展ARM进行学习

学习汇编语言,不仅仅是学习汇编指令,更是在学习了解CPU,CPU有哪些寄存器,分别有什么用,它是如何访问内存,如何进行寻址,如何进行运算等等。

高级语言特性

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

当然,做逆向的同学,不必要像专业的开发同学那样对这些语言的特性烂熟于心,掌握很多编程技能,这倒不用。

但掌握这些语言的基本编程技能还是有必要。拿C语言来说,C语言中函数调用原理,参数如何传递,函数中的局部变量如何分布,数组如何存储,结构体成员如何内存布局,指针又是如何实现的等等,这些基础概念咱们得知道,不然拿到反汇编代码,也不知道如何与高级语言进行转换。

像上面说到的这些C语言知识,学习的时候要自己对比源码和编译后的汇编指令长什么样,反复对比学习,产生条件反射。除了这些,还要关注C++中面向对象实现原理,虚函数机制,this指针如何传参,new和delete/delete []等等在汇编指令层如何实现。

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

软件调试

很多时候,光靠静态分析无法实现目标,比如程序进行了加壳等技术,在静态分析下看到的全是错误的指令代码,甚至让反编译工具无法分析。

这个时候,就需要结合动态分析技术一块儿上,让程序实际运行起来,再来对其进行分析,所以,掌握软件调试技术,也是逆向工程中不可缺失的一环。

常用的调试器有工具插件非常强大的OllyDbg、微软官方出品的可以进行内核级调试的WinDbg、以及Linux平台上的GDB等等。掌握这三款调试器的使用,能够帮助我们快速对目标进行动态行为分析,对关键代码段进行调试研究,乃至将内存中的程序文件dump到文件中,再使用反编译工具进行静态分析等等。

结语

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

一个超强的逆向分析软件

推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

关注公众号,后台回复「1024」获取学习资料网盘链接。

欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~


版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。