汇编位移指令全解与逆向实战:从SHR/SHL到ROL/ROR,逆向分析strcmp
本文摘要: 文章主要讲解了汇编语言中的位移指令及其逆向应用。内容包括:1) strcmp函数的逆向分析,展示字符串比较的汇编实现;2) 逻辑位移指令SHR/SHL的功能说明(右移=除2,左移=乘2)及示例;3) 算术位移SAR/SAL的特性,特别指出有符号数处理时的差异;4) 循环位移ROL/ROR指令的原理和实际应用,通过0x77886611等案例演示位移效果。最后布置了相关计算题,要求分析位移
目录
位移操作是CPU提供的最基础、最高效的位操作,也是逆向中识别算法、解析数据的关键。 本文将系统解析三类位移指令,并带你亲手逆向一个经典函数。
041-字串比较函数strcmp逆向与(shr右移指令)
知识点:
字串比较函数strcmp逆向
shr 右移指令
一、函数strcmp逆向
0011001100110010 0011000101110011
shr 右移指令 右移一位相当于 整除2
char *s1="s123456",*s2="s2abcdef2222";
strcmp(s1,s2);
下面C++代码需要作如下设置:
1、“项目”—“属性”--.....“优化”:已禁用(/Od)
2、“项目”—“属性”--.....“优化”—“启用内部函数”:否
#include "stdafx.h"
#include <string.h>
int _tmain(int argc, _TCHAR* argv[])
{
char *s1="s123456",*s2="s2abcdef2222";
strcmp(s1,s2);
return 0;
}
得到的汇编代码为:
00401000 / PUSH EBP
00401001 | MOV EBP,ESP
00401003 |SUB ESP,8
00401006 |MOV DWORD PTR SS:[EBP-8],41.004020F4 ; ASCII "s123456"
MOV DWORD PTR SS:[EBP-4],41.004020FC ; ASCII "s2abcdef2222"
00401014 | MOV EAX,DWORD PTR SS:[EBP-4]
00401017 |PUSH EAX ; /s2
00401018 | MOV ECX,DWORD PTR SS:[EBP-8] ; |
0040101B |PUSH ECX ; |s1
0040101C | CALL DWORD PTR DS:[<&MSVCR100.strcmp>] ; \strcmp
00401022 |ADD ESP,8
00401025 |XOR EAX,EAX
00401027 |MOV ESP,EBP
00401029 |POP EBP
0040102A \ RETN
042-逻辑左移shl指令
知识点:
shr 逻辑右移指令
shl 逻辑左移指令
一、SHL 逻辑左移指令测试
shr 逻辑右移指令 右移一位相当于整除2
shl 逻辑左移指令 左移一位相当于乘2 //很多时候会溢出
//>> 右移
//<< 左移
unsigned int i=0x44332211;
unsigned int j=0;
j=i<<1;
j=i<<2;
j=i<<8;//左移一个字节 0x33221100
043-算术左移(SAL)与右移(SAR)
知识点:
SAL 算术左移指令
SAR 算术右移指令
一、SHL 逻辑左移指令测试
SAL 逻辑左移指令 左移一位相当于 乘2 //很多时候会溢出
SAR 逻辑右移指令 右移一位相当于整除2
SHL与SAL 同一条指令:
SAR与SHR 有符号数 SAR高位补1,SHR高位补0
无符号数时 SAR与SHR 指令功能相同
int i=0x44332211;
int j=0;
j=i<<1;
j=i<<2;
j=i<<8;
二、作业
1、计算出a的值.
int a=0x87665533;
a=a<<16; //执行后a的值为多少?;
a=0x997766;
a-a>>4;//执行后 a的值是多少?
2、测试SHL,SAL执行后对标志位的影响!
044-循环位移ROL,ROR
知识点:
循环位移指令 ROL
循环位移指令 ROR
循环左移/右移指令只是移位方向不同,它们移出的位不仅要进入CF,而且还要填补空出的位。比如:
int i=0x77886611
ROL i,0x10;
结果为66117788
一、循环位移指令
ROL
ROR
int i=0x77886611;//01110111100010000110011000010001
_asm
{ //01110111100010000110011000010001 ->1
//10111011110001000011001100001000 //BBC43308
ROR i,1 //BBC43308 //11011110001000011001100001000101
ROL i,3 //DE219845 //11011110001000011001100001000101
ROL i,0x10;//9845DE21
}
二、作业
1、说说执行下列代码后EAX,EBX的值是多少?为什么
_asm
{
mov eax,0x778899AA
mov ebx,eax
ROR eax,16;
ROL ebx,16;
}
2、说说执行下列代码后EAX,EBX的值是多少?为什么?
_asm
{
mov eax,0x778899AA
mov ebx,eax
ROR eax,2;
ROL ebx,3;
}
计算机科学与技术 & 计算机网络技术:双专业课程体系完全导航指南
本系列目录
1、逆向工程基础:Ollydbg(OD)调试器实战与MOV指令寻址方式精讲
2、汇编语言核心概念精讲:从ADD、SUB、MOVSX/MOVZX到LEA与寄存器详解
3、x86汇编条件跳转指令完全解析:从CMP到有/无符号跳转与If实现
4、x86汇编函数调用完全解析:栈帧(EBP/ESP)构建与三种调用约定(cdecl/stdcall/fastcall)对比
5、汇编逆向还原核心:if-else与switch-case结构的识别与C代码重构
6、编译器优化揭秘:对比for循环的汇编实现与INC vs ADD指令的性能抉择
7、x86浮点运算基础:FPU寄存器、FLD/FSTP与FADD/FSUB等指令精讲
8、汇编位移指令全解与逆向实战:从SHR/SHL到ROL/ROR,逆向分析strcmp
9、汇编位运算指令精讲:掌握AND/OR/XOR/NOT四大核心操作
10、x86汇编字符串处理:SCASB/SCASW指令与REPNE/REPE重复前缀详解
11、汇编实战:用REPNZ SCASB与REPZ CMPSB从零实现strcmpA/W
12、x86汇编批量操作指令:LOOP循环控制与STOS/LODS串操作详解
更多推荐



所有评论(0)