c++ 反汇编 表达式
有符号数溢出:
void BreakFor()
{
for (int i = 1; i > 0; i++)
{
printf("%d \r\n", i);
}
}
上面的程序并不是死循环,当有符号数增加到最大整数后,继续加一会进位修改符号位,从而成为负数。
自增、自减
98: int nVarOne = argc;
012665EE 8B 45 08 mov eax,dword ptr [argc]
012665F1 89 45 F8 mov dword ptr [nVarOne],eax
99: int nVarTwo = argc;
012665F4 8B 45 08 mov eax,dword ptr [argc]
012665F7 89 45 EC mov dword ptr [nVarTwo],eax
100: nVarTwo = 5 + (nVarOne++);
012665FA 8B 45 F8 mov eax,dword ptr [nVarOne]
012665FD 83 C0 05 add eax,5
01266600 89 45 EC mov dword ptr [nVarTwo],eax
01266603 8B 4D F8 mov ecx,dword ptr [nVarOne]
01266606 83 C1 01 add ecx,1 //后缀自增,在语句结束后加一
01266609 89 4D F8 mov dword ptr [nVarOne],ecx
101: nVarTwo = 5 + (++nVarOne);
0126660C 8B 45 F8 mov eax,dword ptr [nVarOne]
0126660F 83 C0 01 add eax,1 //前缀自增,先自增
01266612 89 45 F8 mov dword ptr [nVarOne],eax
01266615 8B 4D F8 mov ecx,dword ptr [nVarOne]
01266618 83 C1 05 add ecx,5
0126661B 89 4D EC mov dword ptr [nVarTwo],ecx
102:
103: nVarOne = 5 + (nVarTwo--);
0126661E 8B 45 EC mov eax,dword ptr [nVarTwo]
01266621 83 C0 05 add eax,5
01266624 89 45 F8 mov dword ptr [nVarOne],eax
01266627 8B 4D EC mov ecx,dword ptr [nVarTwo]
0126662A 83 E9 01 sub ecx,1
0126662D 89 4D EC mov dword ptr [nVarTwo],ecx
104: nVarOne = 5 + (--nVarTwo);
01266630 8B 45 EC mov eax,dword ptr [nVarTwo]
01266633 83 E8 01 sub eax,1
01266636 89 45 EC mov dword ptr [nVarTwo],eax
01266639 8B 4D EC mov ecx,dword ptr [nVarTwo]
0126663C 83 C1 05 add ecx,5
0126663F 89 4D F8 mov dword ptr [nVarOne],ecx
105: }
表达式截断:
124: (nNumber == 0) || (nNumber += Accumulation(nNumber - 1));
0126650E 83 7D 08 00 cmp dword ptr [nNumber],0
01266512 74 15 je Accumulation+39h (01266529h) //前面为零,截断表达式,直接跳转
01266514 8B 45 08 mov eax,dword ptr [nNumber]
01266517 83 E8 01 sub eax,1
0126651A 50 push eax
0126651B E8 8B B4 FE FF call Accumulation (012519ABh) //
01266520 83 C4 04 add esp,4
01266523 03 45 08 add eax,dword ptr [nNumber]
01266526 89 45 08 mov dword ptr [nNumber],eax
125: return nNumber;
01266529 8B 45 08 mov eax,dword ptr [nNumber]
126: }
条件表达式:
- 方案1:表达式1为简单比较,而表达式2和表达3两者的差值等于1;
return argc == 5 ? 5 : 6;
00E44BB6 | 8B7D 08 | mov edi,dword ptr ss:[ebp+0x8] |
00E44BB9 | 33C0 | xor eax,eax |
00E44BBB | 83FF 05 | cmp edi,0x5 |
00E44BBE | 0F95C0 | setne al |//差值为一,用到setne,取得ZF值后,取反,再放到AL中,即不等时置AL为1
00E44BC1 | 83C0 05 | add eax,0x5 |
- 方案2:表达式1为简单比较,而表达式2和表达式3两者的差值大于1;
return argc == 5 ? 4 : 10;
00E44BCF | BE 0A000000 | mov esi,0xA |
00E44BD4 | 83FF 05 | cmp edi,0x5 |
00E44BD7 | 8BC6 | mov eax,esi | 00E44BD9 | BB 04000000 | mov ebx,0x4 |
00E44BDE | 0F44C3 | cmove eax,ebx |//相等的时候用ebx-->4代替eax-->10
vc6.0下
- 方案3:表达式2和表达式3两者的差值大于1;
return argc >= 8 ? 4 : 10;
00E44BEC | 83FF 08 | cmp edi,0x8 |
00E44BEF | 8BC6 | mov eax,esi | esi-->1000E44BF1 | 0F4DC3 | cmovge eax,ebx |//大于等于时,用ebx-->4代替eax-->10
在vc6.0下
- 方案4:表达式2和表达式3有一个为变量,于是无优化。
位运算:
141: unsigned int nVar = argc;
0126668E 8B 45 08 mov eax,dword ptr [argc]
01266691 89 45 F8 mov dword ptr [nVar],eax
142: nVar <<= 3;
01266694 8B 45 F8 mov eax,dword ptr [nVar]
01266697 C1 E0 03 shl eax,3 //无符号数<< 使用shl 逻辑左移
0126669A 89 45 F8 mov dword ptr [nVar],eax
143: nVar >>= 5;
0126669D 8B 45 F8 mov eax,dword ptr [nVar]
012666A0 C1 E8 05 shr eax,5 //无符号数>> 使用shr 逻辑右移
012666A3 89 45 F8 mov dword ptr [nVar],eax
144:
145: argc = argc << 3;
012666A6 8B 45 08 mov eax,dword ptr [argc]
144:
145: argc = argc << 3;
012666A9 C1 E0 03 shl eax,3
012666AC 89 45 08 mov dword ptr [argc],eax
146: argc = argc >> 5;
012666AF 8B 45 08 mov eax,dword ptr [argc]
012666B2 C1 F8 05 sar eax,5 //有符号数>> 使用sar 算术右移
012666B5 89 45 08 mov dword ptr [argc],eax
147: argc = argc | 0xFFFF0000;
012666B8 8B 45 08 mov eax,dword ptr [argc]
012666BB 0D 00 00 FF FF or eax,0FFFF0000h
012666C0 89 45 08 mov dword ptr [argc],eax
148: argc = argc & 0x0000FFFF;
012666C3 8B 45 08 mov eax,dword ptr [argc]
012666C6 25 FF FF 00 00 and eax,0FFFFh
012666CB 89 45 08 mov dword ptr [argc],eax
149: argc = argc ^ 0xFFFF0000;
012666CE 8B 45 08 mov eax,dword ptr [argc]
012666D1 35 00 00 FF FF xor eax,0FFFF0000h
012666D6 89 45 08 mov dword ptr [argc],eax
150: argc = ~argc;
012666D9 8B 45 08 mov eax,dword ptr [argc]
012666DC F7 D0 not eax
012666DE 89 45 08 mov dword ptr [argc],eax
151:
152: return argc;
012666E1 8B 45 08 mov eax,dword ptr [argc]
c++ 反汇编 表达式的更多相关文章
- 《C++反汇编与逆向分析技术揭秘》——观察各种表达式的求值过程
---恢复内容开始--- 加法: 示例: 常量相加,则在编译期间就计算出两个常量相加后的结果,直接将这个结果参与运算,减少了运行期的计算.当有变量参与运算时,会先取出内存中的数据,放入通用寄存器中,再 ...
- ldr和adr在使用标号表达式作为操作数的区别
ARM汇编有ldr指令以及ldr.adr伪指令,他门都可以将标号表达式作为操作数,下面通过分析一段代码以及对应的反汇编结果来说明它们的区别. ldr r0, _start adr r0 ...
- C++函数调用的反汇编过程及Thunk应用
x86汇编基础知识 1. 汇编常用寄存器 esp,(Extended stack pointer)栈顶指针.因为x86的栈内存是向下扩展的,因此当push入栈时,esp–.pop出栈时,esp++.e ...
- 《天书夜读:从汇编语言到windows内核编程》三 练习反汇编C语言程序
1) Debug版本算法反汇编,现有如下3×3矩阵相乘的程序: #define SIZE 3 int MyFunction(int a[SIZE][SIZE],int b[SIZE][SIZE],in ...
- C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象
C++反汇编第四讲,反汇编中识别继承关系,父类,子类,成员对象 讲解目录: 1.各类在内存中的表现形式 备注: 主要复习开发知识,和反汇编没有关系,但是是理解反汇编的前提. 2.子类继承父 ...
- C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式.
C++反汇编第五讲,认识多重继承,菱形继承的内存结构,以及反汇编中的表现形式. 目录: 1.多重继承在内存中的表现形式 多重继承在汇编中的表现形式 2.菱形继承 普通的菱形继承 虚继承 汇编中的表现形 ...
- C++11 constexpr常量表达式
常量表达式函数 要求: 函数体内只有单一的return返回语句 例如: constexpr int data() { const int i=1; //含有除了return以外的语句 return i ...
- C++反汇编-结构体和类
学无止尽,积土成山,积水成渊-<C++反汇编与逆向分析技术揭秘> 读书笔记 对象的内存布局 一般计算公式: 对象内存大小 = sizeof(数据成员1)+ sizeof(数据成员2) +. ...
- c++反汇编与逆向分析 小结
第一章 熟悉工作环境和相关工具 1.1 熟悉OllyDBG 操作技巧 1.2 反汇编静态分析工具 IDA(最专业的逆向工具) 快捷键 功能 Enter 跟进函数实现 ...
随机推荐
- git操作是出现Username for 'https://github.com':的验证问题
Username for 'https://github.com': 输入的是github上的邮箱账号, 而不是github中设置的username, 这是个巨坑!!!Password for 'ht ...
- USB2.0协议学习笔记---描述符
USB设备描述符 字段名 长 度(字节) 地址偏移 含 义 bLenth 1 0 描述符长度 bDescriptorType 1 1 描述符类型 (这里为 1) ...
- Error: Cannot find module 'koa-router'
Error: Cannot find module 'koa-router' koa-router !== koa-route # install OK $ yarn add koa-router h ...
- record terminal sessions
record terminal sessions asciinema https://asciinema.org/ # install $ brew install asciinema # Start ...
- Stack Overflow & Segment Fault
Stack Overflow & Segment Fault https://stackoverflow.com/ https://stackoverflow.com/users/593446 ...
- chrome device remote debug
chrome device remote debug chrome://inspect/#devices chrome inspect devices Android chrome MIDI / MT ...
- WPF权限控制——【3】数据库、自定义弹窗、表单验证
你相信"物竞天择,适者生存"这样的学说吗?但是我们今天却在提倡"尊老爱幼,救死扶伤",帮助并救护弱势群体:第二次世界大战期间,希特勒认为自己是优等民族,劣势民族 ...
- C++算法代码——质因数分解[NOIP2012普及组]
题目来自:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1102 题目描述 已知正整数 n 是两个不同的质数的乘积,试求出较大的那个质数. 输入 ...
- ipv4ipv6 地址字符串表示最大长度
1 for IPV4 #define INET_ADDRSTRLEN 16 111.112.113.114 32位IPV4地址,使用10进制+句点表示时,所占用的char数组的长度为16,其中包括最后 ...
- MySQL 常用命令手册 增删改查大法
一.数据库操作 创建数据库 语法: CREATE DATABASE database_name; 删除数据库 删除数据库务必谨慎!因为执行删除命令后,所有数据将消失. 语法: DROP DATABAS ...