C++ 反汇编:数据类型与常量

反汇编() 即把目标二进制机器码转为汇编代码的过程,该技术常用于逆向工程、软件汉化等领域,学习和理解反汇编对软件调试、系统漏洞挖掘、内核原理及理解高级语言代码都有相当大的帮助,软件一切神秘的运行机制全在反汇编代码里面 。
寻找OEP
1.使用编译器 VS 2013版本,写代码,并关闭基地址随机化,编译采用debug版 。
2.寻找OEP,载入,默认停在,回车跟进 。
call再次回车跟进 。
下方看到一个安全检测,主要防止在目标堆栈中瞎搞,而设计的安全机制 。编译器开启后,每次运行都会生成随机,结束时会验证是否一致,防止瞎搞,老版本编译器中不存在这个选项,一开始开发人员也没想那么多,后来瞎搞的人多了,才加上的,主要是害怕自己的被玩坏 。
继续向下看代码,看到以下代码就到家了,call跟进去就是main.
数值类型变量: 数值类型默认在32位编译器上是4字节存储的 。
#include int main(int argc, char* argv[]){int x = 10, y = 20, z = 0;printf("%d\n", x + y);return 0;}
反汇编结果如下,如果在vc6下mov ecx,0xC 原因 int=4 3*4=0xC
004113CC | 8DBD 1CFFFFFF| lea edi,dword ptr ss:[ebp-0xE4]| 取出内存地址004113D2 | B9 39000000| mov ecx,0x39| 指定要填充的字节数004113D7 | B8 CCCCCCCC| mov eax,0xCCCCCCCC| 将内存填充为0xcccccc004113DC | F3:AB| rep stosd| 调用rep指令,对内存进行初始化004113DE | C745 F8 0A000000| mov dword ptr ss:[ebp-0x8],0xA| 对变量x初始化为10004113E5 | C745 EC 14000000| mov dword ptr ss:[ebp-0x14],0x14| 对变量y初始化为20004113EC | C745 E0 00000000| mov dword ptr ss:[ebp-0x20],0x0| 对变量c初始化为0004113F3 | 8B45 F8| mov eax,dword ptr ss:[ebp-0x8]| 取出10并放入eax004113F6 | 0345 EC| add eax,dword ptr ss:[ebp-0x14]| 与20相加得到结果付给eax004113F9 | 8BF4| mov esi,esp| 保存当前栈帧004113FB | 50| push eax|004113FC | 68 58584100| push consoleapplication1.415858| 415858:"%d\n"00411401 | FF15 14914100| call dword ptr ds:[<&printf>]|00411407 | 83C4 08| add esp,0x8|
除了整数类型外,浮点数也是一种数值运算方式,将上方代码稍微修改后,编译并查看其反汇编代码.
#include int main(int argc, char* argv[]){double x = 1.05, y = 20.56, z = 0;z = x + y;printf("%f\n", z);return 0;}
观察以下汇编代码,会发现前面的初始化部分完全一致,但后面则使用了xmm0寄存器,该寄存器是专门用于运算浮点数而设计的浮点运算模块默认大小就是64位,其将内存中的值取出来并放入xmm0中进行中转,然后复制到堆栈中,等待最后调用addsd命令完成对浮点数的加法运算,并将运算结果回写到缓冲区,最后调用打印函数实现输出.
004113CC | 8DBD 10FFFFFF| lea edi,dword ptr ss:[ebp-0xF0]|004113D2 | B9 3C000000| mov ecx,0x3C|004113D7 | B8 CCCCCCCC| mov eax,0xCCCCCCCC|004113DC | F3:AB| rep stosd|004113DE | F2:0F1005 70584100| movsd xmm0,qword ptr ds:[<__real@3ff0cccccccccccd>]| 将内存地址中的值取出并放入xmm0中004113E6 | F2:0F1145 F4| movsd qword ptr ss:[ebp-0xC],xmm0| 将数据放入堆栈中存储004113EB | F2:0F1005 80584100| movsd xmm0,qword ptr ds:[<__real@40348f5c28f5c28f>]|004113F3 | F2:0F1145 E4| movsd qword ptr ss:[ebp-0x1C],xmm0|004113F8 | F2:0F1005 60584100| movsd xmm0,qword ptr ds:[<__real@0000000000000000>]|00411400 | F2:0F1145 D4| movsd qword ptr ss:[ebp-0x2C],xmm0|00411405 | F2:0F1045 F4| movsd xmm0,qword ptr ss:[ebp-0xC]| main.c:60041140A | F2:0F5845 E4| addsd xmm0,qword ptr ss:[ebp-0x1C]| 对浮点数进行相加操作0041140F | F2:0F1145 D4| movsd qword ptr ss:[ebp-0x2C],xmm0| 结果放入堆栈等待被打印00411414 | 8BF4| mov esi,esp|00411416 | 83EC 08| sub esp,0x8|00411419 | F2:0F1045 D4| movsd xmm0,qword ptr ss:[ebp-0x2C]|0041141E | F2:0F110424| movsd qword ptr ss:[esp],xmm0|00411423 | 68 58584100| push consoleapplication1.415858| 415858:"%f\n"==L"春\n"00411428 | FF15 14914100| call dword ptr ds:[