ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

反汇编分析C++代码

2021-04-15 13:33:38  阅读:179  来源: 互联网

标签:long 代码 mov C++ ebp 反汇编 寄存器 dword ptr


编译环境:Windows 10 + VS2015

1、问题引入

在Win32环境下,CPU小端模式,参数用栈来传递,写出输出结果。

代码如下:

int main()
{    
    long long a = 1;
    long long b = 2;
    long long c = 3;
    printf("%d%d%d", a, b, c);//输出结果102
    return 0;
}

反汇编代码如下:

int main()
{    
010C2AB0  push        ebp  
010C2AB1  mov         ebp,esp //ebp地址为0x00cffcd0 
010C2AB3  sub         esp,0F0h  
010C2AB9  push        ebx  
010C2ABA  push        esi  
010C2ABB  push        edi  
/*
将ebp-0f0处地址(0x00cffbe0)赋给目标变址寄存器edi。
注意lea与mov指令的区别,如果为mov,则表示将0x00cffbe0处存放的数据赋给edi。
*/ 010C2ABC lea edi,[ebp-0F0h] 010C2AC2 mov ecx,3Ch 010C2AC7 mov eax,0CCCCCCCCh
/*
rep 表示重复执行其后面指令stos,重复次数由计数器ecx决定,没执行一次,ecx自动减小,ecx为0时,停止执行其后的指令。
stos 表示将edi指向的内容写成eax中的值,rep过程中edi自动增加。由f0h除以3ch=04得知每次自动增加4个字节,刚好为win32环境下指针长度。
*/ 010C2ACC rep stos dword ptr es:[edi] long long a = 1;
/*
dword 双字节 即四个字节
prt pointer缩写,即针
[]里的数据是一个地址值,这个地址指向一个双字节类型数据
mov ptr [a],1,表示把1数据赋给变量a。
mov eax,dword ptr[00cffbe0] 表示把地址00cffbe0中的双字节型(32位)数据赋给eax累加器。
*/ 010C2ACE mov dword ptr [a],1 010C2AD5 mov dword ptr [ebp-8],0 long long b = 2; 010C2ADC mov dword ptr [b],2 long long b = 2; 010C2AE3 mov dword ptr [ebp-18h],0 long long c = 3; 010C2AEA mov dword ptr [c],3 010C2AF1 mov dword ptr [ebp-28h],0 printf("%d%d%d", a, b, c); 010C2AF8 mov eax,dword ptr [ebp-28h] 010C2AFB push eax 010C2AFC mov ecx,dword ptr [c] 010C2AFF push ecx 010C2B00 mov edx,dword ptr [ebp-18h] 010C2B03 push edx 010C2B04 mov eax,dword ptr [b] 010C2B07 push eax 010C2B08 mov ecx,dword ptr [ebp-8] 010C2B0B push ecx 010C2B0C mov edx,dword ptr [a] 010C2B0F push edx 010C2B10 push offset string "%d%d%d" (010C9B30h) 010C2B15 call _printf (010C152Dh) 010C2B1A add esp,1Ch return 0; 010C2B1D xor eax,eax } 010C2B1F pop edi 010C2B20 pop esi 010C2B21 pop ebx 010C2B22 add esp,0F0h 010C2B28 cmp ebp,esp 010C2B2A call __RTC_CheckEsp (010C1181h) 010C2B2F mov esp,ebp 010C2B31 pop ebp 010C2B32 ret

参数压栈后栈中数据结构如下,所以按整型输出是,读取的是地址0x011df900~0x011df908内容。按小端模式取出的结果为102。

2、寄存器简介

1)数据寄存器:保存操作数和运算结果等信息。

  • EAX:Accumulator。是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。也可用作函数返回值。取低16位为AX,分割为8位寄存器AH-AL。指令ret返回用到。
  • EBX:Base Register。 是"基地址"(base)寄存器, 在内存寻址时存放基地址。
  • ECX:Count Register。是计数器(counter), 是重复(REP)前缀指令和LOOP指令的内定计数器。
  • EDX:Data Register。则总是被用来放整数除法产生的余数。

2)指针寄存器:EBP,ESP可作为通用寄存器,即可存储算术逻辑运算的操作数和运算结果。

  • EBP:Base Pointer,基指针寄存器,直接访问栈中的数据。
  • ESP:Stack Pointer,栈指针寄存器,只可访问栈顶。指令pop/push时自动变。
  • EIP:Instruction Pointer,指令指针寄存器,存放下次将要执行的指令在代码段中的偏移量。每走一条指令自动变一次,如果希望跳转后能返回继续就需要跳转前把它放入栈中,返回时出栈。

3)变址寄存器:主要用于存放存储单元在段内的偏移量。

  • ESI: Source Index,源变址寄存器。EDS:ESI即源串段寄存器:源串变址,ESI在串操作中自动增减。
  • EDI:Destination Index,目标变址寄存器。EES:EDI即目标串段寄存器:目标串变址,EDI在串操作中自动增减。

4)段寄存器:内存分段。这里最多为6个内存段,不同的内存段放入不同的东西。

  • ECS:Code Segment Register,代码段寄存器。
  • EDS:Data Segment Register,数据段寄存器。
  • EES:Extra Segment Register,附加段寄存器。
  • ESS:Stack Segment Register,栈段寄存器。
  • EFS:Extra Segment Register,附加段寄存器。
  • EGS:Extra Segment Register,附加段寄存器。

标签:long,代码,mov,C++,ebp,反汇编,寄存器,dword,ptr
来源: https://www.cnblogs.com/zhongqifeng/p/14662007.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有