目录

041-字串比较函数strcmp逆向与(shr右移指令)

一、函数strcmp逆向

042-逻辑左移shl指令

一、SHL 逻辑左移指令测试

043-算术左移(SAL)与右移(SAR)

一、SHL 逻辑左移指令测试

二、作业

044-循环位移ROL,ROR

一、循环位移指令

二、作业


        位移操作是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 

SHLSAL 同一条指令:

SARSHR  有符号数 SAR高位补1SHR高位补0

            无符号数时 SARSHR 指令功能相同

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串操作详解

13、x86条件置位指令(SETxx)完全指南:从标志位解读到条件判断实战

14、游戏逆向工程实战:从CALL分析、基址定位到冷却破解与内存修改

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐