3.6.1 内存反汇编的应用 Capstone 是一款轻量级、多平台、多架构的反汇编引擎,旨在成为二进制分析和反汇编的终极工具。 函数执行成功后,该句柄将被填充,可以用于后续的反汇编操作。 函数cs_open()是Capstone反汇编引擎提供的,它用于初始化Capstone库并打开一个句柄,以便进行后续的反汇编操作。 打开句柄后,我们可以使用其他的Capstone函数进行反汇编操作,比如cs_disasm()函数用于对二进制代码进行反汇编,反汇编后的结果可以用于分析和理解程序的行为。 第二步也是最重要的一步,调用cs_disasm()反汇编函数,函数返回实际反汇编的指令数,或者如果发生错误,则返回0。 参数 code:要反汇编的二进制代码的指针,定你要反汇编的数据集或者是一个缓冲区 参数 code_size:要反汇编的二进制代码的大小(以字节为单位),指定你要反汇编的长度64 参数 address:
,Capstone是一个轻量级的多平台、多架构的反汇编框架。 Capstone旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎,该引擎支持多种平台的反汇编,非常推荐使用。 反汇编引擎下载地址:https://cdn.lyshark.com/sdk/capstone_msvc12.zip 这款反汇编引擎如果你想要使用它则第一步就是调用cs_open()官方对其的解释是打开一个句柄 ,该函数的解释如下所示; 参数1:指定dasm_handle反汇编句柄 参数2:指定你要反汇编的数据集或者是一个缓冲区 参数3:指定你要反汇编的长度 64 参数4:输出的内存地址起始位置 0x401000 说完了反汇编接着就需要讲解如何对内存进行汇编操作了,汇编引擎这里采用了XEDParse该引擎小巧简洁,著名的x64dbg就是在运用本引擎进行汇编替换的,本引擎的使用非常简单,只需要向XEDParseAssemble
通过利用反汇编库,并使用python编写工具,读取PE结构中的基地址偏移地址,找到OEP并计算成FOA文件偏移,使用反汇编库对其进行反汇编,并从反汇编代码里查找事先准备好的ROP绕过代码,让其自动完成搜索 ,这里给出实现思路与部分代码片段。 十六进制转换器 可自行添加上,文件与偏移对应关系,即可实现指定位置的数据转换,这里给出坑爹版实现,自己晚膳吧。 char))[2:] + " ",end="") else: print(hex(ord(char))[2:] + " ",end="") 二进制与字符串互转 char = fp.read(1) print(to_ascii(hex(ord(char))[2:]),end="") print("") 反汇编框架
3.6.1 内存反汇编的应用Capstone 是一款轻量级、多平台、多架构的反汇编引擎,旨在成为二进制分析和反汇编的终极工具。 函数执行成功后,该句柄将被填充,可以用于后续的反汇编操作。函数cs_open()是Capstone反汇编引擎提供的,它用于初始化Capstone库并打开一个句柄,以便进行后续的反汇编操作。 打开句柄后,我们可以使用其他的Capstone函数进行反汇编操作,比如cs_disasm()函数用于对二进制代码进行反汇编,反汇编后的结果可以用于分析和理解程序的行为。 第二步也是最重要的一步,调用cs_disasm()反汇编函数,函数返回实际反汇编的指令数,或者如果发生错误,则返回0。 code:要反汇编的二进制代码的指针,定你要反汇编的数据集或者是一个缓冲区参数 code_size:要反汇编的二进制代码的大小(以字节为单位),指定你要反汇编的长度64参数 address:要反汇编的二进制代码在内存中的地址
,Capstone是一个轻量级的多平台、多架构的反汇编框架。 Capstone旨在成为安全社区中二进制分析和反汇编的终极反汇编引擎,该引擎支持多种平台的反汇编,非常推荐使用。 反汇编引擎下载地址:https://cdn.lyshark.com/sdk/capstone_msvc12.zip这款反汇编引擎如果你想要使用它则第一步就是调用cs_open()官方对其的解释是打开一个句柄 ,该函数的解释如下所示;参数1:指定dasm_handle反汇编句柄参数2:指定你要反汇编的数据集或者是一个缓冲区参数3:指定你要反汇编的长度 64参数4:输出的内存地址起始位置 0x401000参数5 图片说完了反汇编接着就需要讲解如何对内存进行汇编操作了,汇编引擎这里采用了XEDParse该引擎小巧简洁,著名的x64dbg就是在运用本引擎进行汇编替换的,本引擎的使用非常简单,只需要向XEDParseAssemble
以前看过一些关于 Windows 下逆向方面的内容,最近想着不如有时间把 MacOS 下的逆向也看看,研究逆向比较关键的内容就是汇编(或者是虚拟机的中间字节码),这个应该在每个平台上都差不多,毕竟个人机的 对应的反汇编代码 用 clang 和 gcc 编译一下,然后观察它们两个的反汇编代码,后来发现没有任何区别,其反汇编代码如下: <__text> @00000eb0 push rbp mov [rbp-10h], eax ret 这样的 x64 的反汇编代码看着还是很直观的。 绕过 666 绕过 666 的方法也是比较简单的,只要修改对应的跳转语句即可。
反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解高级语言代码都有相当大的帮助,软件一切神秘的运行机制全在反汇编代码里面 }; int x; for (x = 0; x < 5; x++){ printf("打印数组元素: %d \n", array[x]); } return 0; } 第一种Debug版反汇编代码如下 ,而2维数组则与之不同,我们接着将上方代码稍加修改: #include <stdio.h> int main(int argc, char *argv[]) { char cArray[2][10] add eax,0xA这条汇编指令,每次让指针递增10,之所以是10是因为char类型为1个字节,而1维数组的大小为10,所以每次递增就要为10,如果为整数类型就需要递增4 * 10也就是每次递增40了 ; x++) { printf("%d\t",*(p)); } system("pause"); return 0; } 第二个案例,我们来研究一下,其反汇编形式。
反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解高级语言代码都有相当大的帮助,软件一切神秘的运行机制全在反汇编代码里面 逆向分析函数实现机制 函数与堆栈的基础: 下面一个简单的函数调用案例,我们来看看汇编格式是怎样的. 变量作用域解析 接着我们来研究一下变量的作用域,在C语言中作用域可分为局部变量与全局变量,两种变量又分为静态变量和动态变量,接下来我们将通过反汇编学习研究他们之间的异同点. ,我就不再新的文章里写了,直接在这里把它给写完,C语言的反汇编就到此结束。 ,接下来我们将领略C++ 的反汇编技巧,C++ 是重头戏,其中的类,构造析构函数,等都是重点,不过C++ 在识别上其实更加的容易,因为其封装的更加彻底,对C语言的封装。
《C++反汇编与逆向分析技术揭秘》从介绍调试工具开始,到语言特性的分析,反汇编代码的重建等,再到逆向分析技术应用,内容逐步深入。 软件分析技术重在方法,所以《C++反汇编与逆向分析技术揭秘》以启发方法为导向,逐步培养读者的分析和推理能力。 全书共分为三个部分:第一部分 准备工作;第二部分 C++反汇编揭秘;第三部分 逆向分析技术应用,逐步引导读者,结合具体的应用掌握逆向分析的关键技术。 《C++反汇编与逆向分析技术揭秘》对所有软件安全领域工作者, 想了解C++内部机制的中高级C++程序员以及 对Windows底层技术感兴趣的技术人员来说,是一本很好的学习C++反汇编与逆向分析技术的参考书
反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解高级语言代码都有相当大的帮助,软件一切神秘的运行机制全在反汇编代码里面 + y); return 0; } 反汇编结果如下,如果在vc6下mov ecx,0xC 原因 int=4 3*4=0xC 004113CC | 8DBD 1CFFFFFF | ] | 打印输出 0041141D | 83C4 08 | add esp,0x8 | 反汇编长字符串与字符串指针 每次转换之后,可能还会暴露相邻窗口之间的某些优化机会,所以可以多次调用窥孔优化,尽可能提升性能 基本的乘除法: 乘法与除法与加减法相同也有一组专用汇编指令,只不过乘除法的计算方式与加减法稍有不同,在Debug y); int b = a * 3; printf("当前b= %d\n", b); return 0; } Debug反汇编代码如下,如果是Release那么这些变量也会被计算出结果并赋予一个常量
LyScript 插件实现对特定汇编指令片段的批量搜索功能,用户传入一个汇编指令列表,然后循环搜索该列表内的所有指令特征,如果找到了,则返回该指令的内存地址。 图片批量搜索反汇编代码: 与搜索机器码类似,此功能实现了搜索代码段中所有指令集,匹配列表中是否存在,存在则返回地址。 local_base_end: disasm = dbg.get_disasm_one_code(local_base_start) print("地址: 0x{:08x} --> 反汇编 range(0, len(search_asm)): if disasm == search_asm[index]: print("地址: {} --> 反汇编 local_base_start = local_base_start + dbg.get_disasm_operand_size(local_base_start) dbg.close()搜索反汇编列表特征
LyScript 插件实现对特定汇编指令片段的批量搜索功能,用户传入一个汇编指令列表,然后循环搜索该列表内的所有指令特征,如果找到了,则返回该指令的内存地址。 批量搜索反汇编代码: 与搜索机器码类似,此功能实现了搜索代码段中所有指令集,匹配列表中是否存在,存在则返回地址。 local_base_end: disasm = dbg.get_disasm_one_code(local_base_start) print("地址: 0x{:08x} --> 反汇编 (0, len(search_asm)): if disasm == search_asm[index]: print("地址: {} --> 反汇编 local_base_start = local_base_start + dbg.get_disasm_operand_size(local_base_start) dbg.close() 搜索反汇编列表特征
IDA 2.1反汇编算法 a.线性扫描反汇编:无法将嵌入的数据和代码区分开 b.递归下降反汇编:无法处理间接代码路径(如利用指针表来查询目标地址的跳转和调用 ) 2.2 常用操作与快捷方式(IDA6.5.1版本) 名称:sub_xxxx:地址xx子例程 loc_xxxx:地址xx指令 byte_xxxx IDA加载过程出现oops错误,需要安装python 2.6版本 9.text view 模式,粗虚线:循环,细虚线:条件跳转,实线:非条件跳转,红线:同一函数内 10 retn xx 或 ret后调用处add esp xx平衡,类似prinf函数参数数量不可确定,需要出栈时调整esp (rop攻击:面向返回值的错误跳转攻击) 2.5 反汇编技巧 1.阅读反汇编时,数据最好从初始化源头追踪,如窗口句柄需要查看createwindow函数,否则很难以阅读 2.lea offset 函数,push入函数代表回调函数
从反汇编与内存数据分析C++程序行为本文利用gdb工具基于X64架构,根据反汇编与内存中最原始的数据,从CPU运行时最真实的行为对C++程序的行为进行分析。 eax,%eax#清空eax,结合上下文来看这个操作没有意义0x00005555555551d3<+27>:lea-0x20(%rbp),%rax#结合下文中地址0x00005555555551f2处的反汇编看 +249>:pop%rbx0x00005555555552ed<+250>:pop%rbp0x00005555555552ee<+251>:retqEndofassemblerdump.对main函数反汇编暂时分析到以上程度 nop0x000055555555540a<+58>:leaveq0x000055555555540b<+59>:retqEndofassemblerdump.这里仅对base和childFirst构造函数反汇编分析 反汇编析构函数验证一下猜想。
JustDecompile是Telerik公司推出一个免费的.net反编译工具,支持插件,与Visual Studio 集成,能够创建Visual Studio project文件。 JustDecompile与Reflector相比的话,个人更喜欢JustDecompile,因为他免费,而且对于一些C#动态类型的反编译效果比较好,对于某个第三方程序集,如果它缺乏文档,或者是一个bug 此外,开发者可以借助最新发布的API与支持文档开发自己的插件。
反汇编引擎有很多,这个引擎没有Dll,是纯静态链接库,适合r3-r0环境,你可以将其编译为DLL文件,驱动强制注入到游戏进程中,让其快速反汇编,读取出反汇编代码并保存为txt文本,本地分析。 地址:https://github.com/BeaEngine/beaengine BeaEngine 反汇编特定字符串 #include <stdio.h> #include <Windows.h> 0x00, 0xFF, 0x15, 0x0C, 0x20, 0x40 }; DisassembleCode(buffer, 14); system("pause"); return 0; } 反汇编字节数组 // 反汇编字节数组 void DisassembleCodeByte(BYTE *ptr,int len) { DISASM Disasm_Info; char *end_offset = = 1; // 1 = 表示反汇编32位 / 0 = 表示反汇编64位 Disasm_Info.Options = MasmSyntax;
IDA Pro是一款强大的静态反汇编工具,不仅可以应用在反编译和动态调试等强大的逆向工程领域,还支持对多种处理器不同类型的可执行模块进行反汇编处理,功能强大! IDA Pro静态反汇编工具图片功能1、交互性目前,电脑在遇到未知事物时,是无法和人类大脑相比的。 ida pro mac版调试器补充了反汇编的静态分析功能:允许分析师通过代码一步一步来调查,调试器经常会绕过混淆,并得到一些能够对静态反汇编程序进行深入处理的数据,包括有助于得到的数据的功能更强大的静态反汇编器将能够在深度处理 3、反汇编作为一个反汇编器,ida pro mac版为可用在那些源代码不总是可用的二进制程序的探索开发,创建程序执行图。 一个反汇编器最大的益处就在于它可以通过符号表示,也就是汇编语言来为在执行的处理器提供说明。如果一个你刚刚安装的友好的屏幕存储器在探视你的网上银行会话或者登陆你的邮箱,反汇编器就可以将它显示出来。
当一个进程被打开后,则下一步可以通过调用cs_disasm()函数来实现对打开文件的反汇编,cs_disasm函数是Capstone反汇编框架中的一个函数,用于对指定的二进制数据进行反汇编,返回解码后的指令信息 code:待反汇编的二进制数据的指针,可以是一个地址。 code_size:待反汇编的数据的长度,以字节为单位。 address:指定待反汇编数据的地址,通常为起始地址。 count:指定要反汇编的指令数,如果为0,则会一直反汇编至遇到code_size终止。 insn:指向用于保存反汇编结果的cs_insn结构体对象指针,在函数调用结束后存储反汇编结果。 在cs_disasm()函数中,我们通过将待反汇编的数据以及其它必要的参数传递给该函数,然后使用cs_insn结构体对象来存储反汇编结果。 当读者理解了这两个API接口后,那么反汇编实现将变得很容易实现,我们来看一下官方针对反汇编实现的一种方式,我们自行封装一个DisassembleCode()函数,该函数传入机器码字符串以及该字符串的长度则会输出该字符串的反汇编代码片段
反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解、外挂技术、病毒分析、逆向工程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解高级语言代码都有相当大的帮助,软件一切神秘的运行机制全在反汇编代码里面 IF-单条件分支语句: 单分支结构配合and与or实现的验证. DO-WHILE条件循环: 与while循环不同,do会先执行循环然后判断,如下代码反编译观察. ); return 0; } 如下反汇编代码可以观察到代码结构,C语言在实现while语句与do-while语句的异同点,while语句是先判断然后才会进入循环体,而do-while则是先执行循环体内部的东西 接着实现多分支for循环,也就是循环内部嵌套循环,接下来通过一个9x9口诀表分析,观察汇编代码变化.
这里对我曾使用过的比较流行的反汇编引擎做个比较,我使用过的反汇编引擎有: 1. 作者一次性开源后便不再维护开源版本,对于反汇编上的BUG很难即时修复。 不过这些也可以理解,因为在当时作者的开发目的是进行文本汇编\反汇编,所以没有为解码出的信息建立结构体以及接口。 3. udis86 udis86应该是我最喜爱的反汇编引擎了。 在目前移动端如此火热的背景下,支持ARM的反汇编库还是非常少的,如果要同时进行X86与ARM下的编译器方面的开发,能使用一个统一的接口那自然是更好。 而其他反汇编引擎都是一次性解码到目标结构中的。