Java教程

对猜数字小游戏案例的逆向分析

本文主要是介绍对猜数字小游戏案例的逆向分析,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

源代码部分,主要是想着边学习c语言,边学习汇编.两只腿走路嘛.
其次就是下次分析的时候会使用ollyce 或者xdbg32来进行分析.
对应着慕课里面的c语言课程

srand(time(0));
int iRandNum =  rand();
int iUserNum  = 0;
printf("input your num\n");
while(1)
{
  scanf_s("%d",&iUserNum);
  if(iUserNum == 110)
  {
     break;
  }
  if(iUserNum<iRandNum)

 {
     printf("your num is smaller\n");
  }
  else if(iUserNum>iRandNum)

 {

     printf("your num is bigger\n");
  }
  else
  {
     printf("your num is %d\n",iRandNum);
     break;
  }
}

分析之余会去除相关部分代码,并且对汇编语言进行中文注释

并且太长的部分会删除掉一些地址,需要用到跳转的地址不会删除

   push   0x0        ;将定义的0放入堆栈(null在汇编显示的也是0)
   call   0xb614c0 ; time(long long *const) at time.h:521
   add    esp, 0x4  ;进行平栈操作,并且将返回值给到eax
   mov    esi, esp ;将栈顶的赋值给寄存器esi
   0push   eax       ;将time函数的返回值 当做参数传递给下面的call
   call   dword ptr [0xb6b174]          ;此call应该就是srand函数
   add    esp, 0x4                              ;平栈操作
   cmp    esi, esp
   call   0xb6115e                              ; __RTC_CheckEsp
   mov    esi, esp
   call   dword ptr [0xb6b170]          ;此call为rand函数
   cmp    esi, esp
   call   0xb6115e                               ; __RTC_CheckEsp
   mov    dword ptr [ebp - 0x4], eax  ;将rand函数的返回值写入到堆栈中
   mov    dword ptr [ebp - 0xc], 0x0  ; 0的值赋值到堆栈地址[ebp-0xc](局部变量)
   push   0xb6a000                             ;此处为字符串 input your num 的地址
   call   0xb61082                                ; _printf
   add    esp, 0x4                                 ;平栈
   0xb6154b <+91>:  mov    eax, 0x1 ;赋值
   0xb61550 <+96>:  test   eax, eax    ;根据结果修改zf标志位,实际用法就是判断eax
   0xb61552 <+98>:  je     0xb615b0   ; eax为0程序while循环结束
   0xb61554 <+100>: lea    ecx, [ebp - 0xc] ;获取iUserNum的地址
   0xb61557 <+103>: push   ecx                  ;iUserNum地址压栈
   0xb61558 <+104>: push   0xb6a010        ;格式化%d
   0xb6155d <+109>: call   0xb61190           ; _scanf_s
   0xb61562 <+114>: add    esp, 0x8            ;平栈
   0xb61565 <+117>: cmp    dword ptr [ebp - 0xc], 0x6e ;6e==110 此处为判断
   0xb61569 <+121>: jne    0xb6156d                               ; 不相等则跳转
   0xb6156b <+123>: jmp    0xb615b0                              ; 相等的情况会执行此指令 
   0xb6156d <+125>: mov    edx, dword ptr [ebp - 0xc]   ;赋值
   0xb61570 <+128>: cmp    edx, dword ptr [ebp - 0x4]   ;开始比较两个变量
   0xb61573 <+131>: jge    0xb61584           ; ebp-0xc大于等于ebp-0x4则跳转
   0xb61575 <+133>: push   0xb6a014         ;关于小于的字符串压栈
   0xb6157a <+138>: call   0xb61082            ; _printf  此处为UNum小于RNum的情况
   0xb6157f <+143>: add    esp, 0x4             ;平栈   
   0xb61582 <+146>: jmp    0xb615ae          ;  回到循环头部
   0xb61584 <+148>: mov    eax, dword ptr [ebp - 0xc]  ;赋值
   0xb61587 <+151>: cmp    eax, dword ptr [ebp - 0x4]  ;判断,改变标志位
   0xb6158a <+154>: jle    0xb6159b             ; ebp-0xc小于等于ebp-0x4则跳转   0xb6158c <+156>: push   0xb6a02c             ;关于大于的字符串
   0xb61591 <+161>: call   0xb61082             ; _printf 此处为UNum大于RNum的情况   0xb61596 <+166>: add    esp, 0x4                ;平栈
   0xb61599 <+169>: jmp    0xb615ae            ; 回到循坏头部
   0xb6159b <+171>: mov    ecx, dword ptr [ebp - 0x4] ;将RNum赋赋值到ecx
   0xb6159e <+174>: push   ecx                      ;rannum压栈
   0xb6159f <+175>: push   0xb6a040            ;压栈关于正确的字符串
   0xb615a4 <+180>: call   0xb61082              ; _printf
   0xb615a9 <+185>: add    esp, 0x8
   0xb615ac <+188>: jmp    0xb615b0                  ; 结束while循环
   0xb615ae <+190>: jmp    0xb6154b                  ; 回到while循环头部
->  0xb615b0 <+192>: xor    eax, eax
 
这篇关于对猜数字小游戏案例的逆向分析的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!