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

什么是逆向工程

大家好,我是写代码的篮球,这篇文章转自小白哥的文章。

给大家出一道思考题:

用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中,可执行文件反编译出来的汇编指令图:

a8c38ca4c8058a19030e3b460a8c4c32.png

可以非常清晰的看到一些字符串的信息:"success"、"failed"、"1234567。

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

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

640a9c74ee27b5da4ba85a418efd6c8a.png

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

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

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

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

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

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

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

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

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

程序反编译

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

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

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

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

3453335ea73c28d62a9cd15e34719418.png

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

对于C#语言编写的可执行程序,我们一般使用reflector进行反编译。

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

可执行文件格式

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

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

e79f05d6d10d798de59b000b54b42e68.png

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

CPU指令集

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

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

常见的PC端CPU就是Intel的x86、x64和AMD64,移动端的就是ARM架构。建议先从最基本的x86开始学习,尤其要注意网络上很多教程讲的还是16位实模式下的汇编语言,非常容易误导人。实模式当然要了解,但要把精力放在保护模式下32位汇编语言。

920f50ab693e98845db1e4b746008923.png

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

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

高级语言特性

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

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

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

bd2ff509a93d3f961dadcccdf2d96437.png

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

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

软件调试

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

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

876555cc615d5c2037203f23b307c13d.png

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

结语

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

一个超强的逆向分析软件


推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

我的知识小密圈

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

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464962.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue中,点击button按钮后,页面上的input框再次自动获取焦点

需求&#xff1a;点击button按钮&#xff0c;录入成功后&#xff0c;页面上的input框自动聚焦&#xff0c;快速进行下一次录入&#xff0c;提高效率 开始尝试了几种方法都没有成功 一、首先想到的用vue指令 v-focus&#xff0c;然而没有成功 <Input v-model"book.isbnO…

线程、同步与锁——Mutex想说爱你不容易

除了Lock&#xff08;&#xff09;、Monitor之外&#xff0c;我们最长用的就是Mutex了&#xff0c;但是玩不好Mutex就总会造成死锁或者AbandonedMutexException&#xff08;我就玩的不怎么好&#xff0c;在并发性访问测试的时候总是遇到关于Mutex的问题&#xff0c;各位线虫见笑…

STM32F4 串口DMA

串口DMA方式收发 笔者使用的是STM32F407VET6&#xff0c;共包含6路串口&#xff0c;页尾处程序已将全部串口的DMA收发配置完成&#xff0c;本文仅以串口1为例进行讲解。&#xff08;查看代码可直接跳至第二节或页尾处下载&#xff09; 1 STM32F4 DMA 简介 DMA&#xff0c;全称为…

在广州的几天

我前两天写了文章说过&#xff0c;我大伯去世&#xff0c;然后我请假了几天去广州。这次去广州&#xff0c;挺感慨的&#xff0c;顺便记录下自己的一些想法。广州限行广州是限行的&#xff0c;但是广州的限行我觉得很人性&#xff0c;如果是外地车牌&#xff0c;你可以在广州行…

由马化腾谈“微博修改功能”,看什么是优秀的产品经理

我仔细阅读过马化腾的的简历&#xff0c;他是一位技术出身的企业家。也是腾讯最大的产品经理,大家都知道产品经理的对产品的重要性那是不言而喻的&#xff0c;而产品是公司的灵魂。 今天早上起床&#xff0c;看到马化腾先生更新的微博。有位网络公司的CTO建议腾讯微博加一个修改…

flask 必知必会

在局域网中让其它电脑访问我的网站 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return hello worldif __name__ __main__:app.run(debugTrue,host0.0.0.0,port9000) 转载于:https://www.cnblogs.com/wuheng-123/p/9665004.html

超酷的红外小车

推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言我的知识小密圈关注公众号&#xff0c;后台回复「1024」获取学习资料网盘链接。欢迎点赞&#xff0c;关注&#xff0c;转发&#xff0c;在看&#xff0c;您的每一次鼓励&#xff0c;我都将铭记于心~

KEIL编译生成bin文件,并输出内存使用情况

一、STM32CubeMX生成的代码输出bin文件 输出bin文件&#xff1a; Run#1框填入的是&#xff1a;fromelf.exe空格–bin空格-o空格"$LL.bin"空格"#L"。“–bin”是两根英文短杆。 fromelf.exe --bin -o "$LL.bin" "#L"编译的时候&#x…

CRC16算法之三:CRC16-CCITT-MODBUS算法的java实现

CRC16算法系列文章&#xff1a; CRC16算法之一&#xff1a;CRC16-CCITT-FALSE算法的java实现 CRC16算法之二&#xff1a;CRC16-CCITT-XMODEM算法的java实现 CRC16算法之三&#xff1a;CRC16-CCITT-MODBUS算法的java实现 功能 实现CRC16-CCITT-MODBUS算法 支持int、short类型…

建议去华为

提问&#xff1a;老师&#xff0c;您好&#xff01;我现在手里有两个offer&#xff0c;正在艰难抉择中&#xff0c;一个是小米的相机图像调校工程师&#xff08;camera tuning&#xff09;&#xff0c;工作地在深圳&#xff0c;工资是12k*14&#xff0c;还有大概700元的餐补&am…

Stimulsoft reports .net中创建变量

Stimulsoft reports .net中创建变量<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />变量中request from user 的使用&#xff1a;可以使你在外面指定日期的选择。根据用户需要去选择不同的条件。报表中code代码中也可以使用代码…

STM32CubeMx官网下载HAL库文档资料

1、直接搜STMCubeMxFxx即可。https://www.st.com/zh/embedded-software/stm32cubef4.html#documentation

HTML5学习笔记(一):初步印象

&#xff08;一&#xff09;什么是HTML5(1)HTML5 将成为 HTML、XHTML 以及 HTML DOM 的新标准。(二)HTML5的前世今生&#xff08;1&#xff09;HTML5 是 W3C 与 WHATWG 合作的结果。W3C&#xff08;万维网联盟&#xff09;&#xff1a;World Wide Web ConsortiumWHATWG &#x…

快学好这个去给学妹修热水器

作者&#xff1a;晓宇&#xff0c;排版&#xff1a;晓宇微信公众号&#xff1a;芯片之家&#xff08;ID&#xff1a;chiphome-dy&#xff09;2021年6月25号晚上9点&#xff0c;中国南方某一线城市&#xff0c;小张正在看着前阵子新出的电影误杀2&#xff0c;窗外&#xff0c;疲…

bzoj1233 单调队列优化dp

https://www.lydsy.com/JudgeOnline/problem.php?id1233 数据结构优化dp的代码总是那么抽象 题意&#xff1a;奶牛们讨厌黑暗。 为了调整牛棚顶的电灯的亮度&#xff0c;Bessie必须建一座干草堆使得她能够爬上去够到灯泡 。一共有N大包的干草&#xff08;1<N<100000&…

Win10系统添加 Win10 LTSC2019闹钟

1、本文主要针对没有windows闹钟的情况。 2、下载Win10 LTSC 2019闹钟应用&#xff0c;并解压&#xff1a; http://www.winwin7.com/soft/xtbd-2695.html 链接&#xff1a;https://pan.baidu.com/s/1S_g6XUIezeF8_Q0rJ09cBQ 提取码&#xff1a;68gs 3、搜索Windows Powershell&…

iPhone开发笔记[1/50]:初学iPhone上用Quartz 2D画图

参考了An iOS 4 iPhone Graphics Drawing Tutorial using Quartz 2D这篇文章&#xff0c;用了30分钟在iPhone上画出了一条直线&#xff0c;核心代码全在drawRect这个方法中&#xff1a; -(void)drawRect:(CGRect)rect { CGContextRef context UIGraphicsGetCurrentContext(); C…

MDK中利用宏定义__DATE__和__TIME__设置产品的代码固件版本

文章目录前言一、__DATE__和__TIME__是什么&#xff1f;二、使用步骤1.引入库2.参考代码总结前言 STM32开发中&#xff0c;利用宏定义的__DATE__和__TIME__设置产品的代码固件版本&#xff1a; 为了方便在编译代码的时候&#xff0c;自动生成代码固件的版本号&#xff0c;所以…

昨晚上跟读者闲聊

昨天发了一篇华为小米的求职文章&#xff0c;今天一个知识星球的朋友找我聊天&#xff0c;也是关于择业的问题。本来是聊找工作的&#xff0c;然后聊着聊着就聊到了生活的一些事情。我平时比较关注微信信息&#xff0c;有重要能回复就会回复&#xff0c;但是&#xff0c;也不喜…

上次作业的升级版

好好好 211606375 牛振乾 211606351 曾茜 一、预估与实际 PSP2.1Personal Software Process Stages预估耗时&#xff08;分钟&#xff09;实际耗时&#xff08;分钟&#xff09;Planning计划• Estimate• 估计这个任务需要多少时间4040Development开发9001000• Analysis• 需…