为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
C

源代码部分,主要是想着边学习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
 
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
学生
手记
粉丝
0
获赞与收藏
3

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消