源代码部分,主要是想着边学习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人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦