您当前的位置:首页 > 电脑百科 > 电脑知识

写给小白看的,逆向工程怎么上路?

时间:2021-07-09 10:58:01  来源:  作者:网络安全—大炮乔

什么是逆向工程

先给大家出一道思考题

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

我想,大部分新手小白估计会这么写:

#include <stdio.h>
#include <string.h>

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函数代码和原来我们的源代码,还原度非常的高了,字符串比较的功能逻辑暴露无遗

可以看到,通过这种方式进行密码匹配,非常不安全,对方拿到你的程序一反编译,就能看到密码是什么了。

不过咱们今天的文章主题不是探讨如何进行安全地进行密码比较,而是另一个主题:逆向工程。

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

逆向工程(Reverse Engineering),又称反向工程,是一种技术过程,即对一项目标产品进行逆向分析及研究,从而演绎并得出该产品的处理流程、组织结构、功能性能规格等设计要素,以制作出功能相近,但又不完全一样的产品。

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

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

软件逆向工程是网络安全领域中的一个重要分支,网络黑客通过逆向工程可以获得目标的程序原理,破解软件的权限,这一般发生在商业软件领域。另外一方面,黑客通过逆向分析也常用来发现软件漏洞,用来对其发起攻击,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位汇编语言。

写给小白看的,逆向工程怎么上路?

 

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

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

高级语言特性

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

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

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

写给小白看的,逆向工程怎么上路?

 

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

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

软件调试

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

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



Tags:逆向工程   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
提到微信,网友是又爱又恨,日常沟通已经彻底离不了,但体积却臃肿不堪,动不动就占用三四十GB的空间,成为手机中占内存最大的APP。其实,最初的微信确实是“小而美”的,在2011年1月发布...【详细内容】
2022-07-27  Tags: 逆向工程  点击:(67)  评论:(0)  加入收藏
Xepor是一款专为逆向分析工程师和安全研究专家设计的Web路由框架,该工具可以为研究人员提供类似Flask API的功能,支持以人类友好的方式拦截和修改HTTP请求或HTTP响应信息。该...【详细内容】
2022-06-06  Tags: 逆向工程  点击:(100)  评论:(0)  加入收藏
什么是逆向工程先给大家出一道思考题用C语言设计一个程序,验证输入的密码是否是“12345678”,如果验证成功,就输出“success”,如果验证失败,则输出“failed”。我想,大部分新手小...【详细内容】
2021-07-09  Tags: 逆向工程  点击:(132)  评论:(0)  加入收藏
场景:开发中为了节约资源,提高效率,往往采用敏捷开发,因此,在搭建一个项目的时候,逆向工程的必不可少的。知识点: 使用逆向工程,首先得安装maven,否则无法实现(maven不会安装的,请私...【详细内容】
2020-05-24  Tags: 逆向工程  点击:(59)  评论:(0)  加入收藏
▌简易百科推荐
相信对于各位游戏发烧友来说,此前一定对虚幻引擎这一概念有所耳闻。可以说目前全球市场上绝大多数主流大作的身上都能看到它的影子,包括大家非常熟悉的《绝地求生》、《堡垒之...【详细内容】
2022-09-14  二姑娘的时尚经  今日头条  Tags:虚幻引擎   点击:(48)  评论:(0)  加入收藏
零拷贝技术是一种思想,指的是计算机操作时,CPU不需要先将数据从某处内存复制从某处内存复制到另一个特定区域。可见,零拷贝的特点是 CPU 不全程负责内存中的数据写入其他组件,CP...【详细内容】
2022-09-14  互联共商  网易号  Tags:零拷贝   点击:(45)  评论:(0)  加入收藏
预计9月中下旬到年底,新一代CPU平台和显卡就要联袂登场了,加上这次可能不得不更换的内存,以及已经初露端倪的新型SSD与电源等需求,可谓是一次机箱内的大换血。要进行这样的更新,...【详细内容】
2022-08-17  电脑爱好者    Tags:升级   点击:(71)  评论:(0)  加入收藏
hashCode到底是什么?是不是对象的内存地址?1) 直接用内存地址?目标:通过一个Demo验证这个hasCode到底是不是内存地址public native int hashCode(); co...【详细内容】
2022-08-03  是啊超ya    Tags:HashCode   点击:(58)  评论:(0)  加入收藏
从20世纪80年代第一代操作系统MS DOS算起,OS不过40年的发展史,但随着终端形态的变化,OS的发展也经历了三轮跨越式演变,从固定桌面终端到移动终端,从封闭到开源。OS生态不断成长的...【详细内容】
2022-07-27    电脑报  Tags:电脑软件   点击:(77)  评论:(0)  加入收藏
Transformer 是第一个完全依赖于自注意力机制来计算其输入和输出的表示的转换模型。主流的序列到序列模型是基于编码器-解码器的循环或卷积神经网络,注意力机制的提出,优化了...【详细内容】
2022-07-11  数据派THU    Tags:Transformer   点击:(112)  评论:(0)  加入收藏
“量子计算机”是一种有潜力拥有远优于传统计算机的性能的技术。美国谷歌公司2013年5月16日宣布,将与美国航天局联手购入一台D-Wave 2量子计算机,并建立量子人工智能实验室(Qua...【详细内容】
2022-07-02  薛定谔D家肥猫    Tags:量子计算机   点击:(119)  评论:(0)  加入收藏
隐私计算市场,真的很奇怪厂商对成功案例,讳莫如深客户对具体实践,闭口不谈但这个市场,就这么“隐私”地起来了&darr; 01、那么,隐私计算到底是个啥? 隐私计算的核心要义就是【数据...【详细内容】
2022-06-30  特大号    Tags:隐私计算   点击:(124)  评论:(0)  加入收藏
资料推荐:109个shell脚本案例174道运维面试题/128道k8s面试题/108道shell脚本面试题&middot;&middot;&middot;&middot;&middot;&middot; 经典的Shell十三问 1. 为何叫做she...【详细内容】
2022-06-30  走进IT学堂    Tags:Shell 脚本   点击:(124)  评论:(0)  加入收藏
如何建立一个有趣的二维码项目和学习 Azure 函数 如果你想学习如何构建 Azure 函数,这里有一个有趣的项目。这个项目有点傻,但是很有教育意义。我们将构建一个二维码生成器,它...【详细内容】
2022-06-23  qaseven    Tags:Azure   点击:(69)  评论:(0)  加入收藏
站内最新
站内热门
站内头条