源代码部分,主要是想着边学习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