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 跟进函数实现 ...
随机推荐
- 部署gitlab-01
Gitlab Server 部署 1.环境配置 关闭防火墙.SELinux 开启邮件服务 systemctl start postfix systemctl enable postfix#ps:不开去 ...
- 008.NET5_IIS安装教程
控制面板->程序->启动或关闭Windows功能
- 恕我直言!!!对于Maven,菜鸟玩dependency,神仙玩plugin
打包是一项神圣.而庄严的工作.package意味着我们离生产已经非常近了.它会把我们之前的大量工作浓缩成为一个.或者多个文件.接下来,运维的同学就可以拿着这些个打包文件在生产上纵横四海了. 这么一项庄 ...
- prefetch vs preload vs prerender vs preconnect All In One
prefetch vs preload vs prerender vs preconnect All In One 前端性能优化 prefetch 预获取 https://developer.mozi ...
- React 17 发布候选版本, 没有添加新功能
React 17 发布候选版本, 没有添加新功能 React v17.0 Release Candidate: No New Features https://reactjs.org/blog/202 ...
- HTTP/HTTPS Proxy & Charles
HTTP/HTTPS Proxy & Charles Charles https://www.charlesproxy.com/ https://www.jianshu.com/p/53d2c ...
- nasm astrcat函数 x86
xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...
- Flutter 避免阻塞ui线程
import 'dart:async'; import 'dart:isolate'; import 'package:flutter/material.dart'; import 'package: ...
- Vue 组件的通信方式都有哪些?
说一下 Vue 组件的通信方式都有哪些?(父子组件,兄弟组件,多级嵌套组件等等) 一.父组件向子组件传值 二.子组件向父组件传值 三.兄弟组件传值 四.跨组件 一.父组件向子组件传值 1.1props ...
- 漫画 | C语言哭了,过年回家,只有我还没对象
C语言回家过年,遇到不少小伙伴. 大家都在外地打拼,一年难得见面,聚到一起吃饭,都非常高兴. 听Java提到TIOBE, 正在喝酒的C语言激动起来. 自己常年在那里排名第二,人类用自己写的程序可真不少 ...