| 
 | 
			
 
 本帖最后由 武大郎 于 2017-6-2 03:03 编辑  
 
开新坑!上期答案第一题为 c  因为空语句出现在判断语句下面是会影响的!比如
 
 
 
看,本来不该执行的,但是就因为有空语句一条!他执行了!!!!空语句也是语句,他改变了流程控制!他控制了空语句不显示!不信写个输出函数printf(“1”)放在空函数也就是前面不用加分号了;你看看输出1不! 
 
第二题 sizeof 这个没啥说的,本身就是关键字!所以不能用! 为什么可能是因为怕乱!他重名了!之前被系统函数用过一次了,怕下次调用乱了,所以你就不能再用了,不信定义2个一样的函数名试试!在同一个程序! 
 
 
第三题 a 都说了合适,而且其他都错了!为什么后边写多了你就知道!也可以百度去(学习的好办法)!  
 
 
第四题 c double是浮点型!所以会有小数点! 
 
第五题 b 可以测试很简单的 这是中画线— 这是下画线_ 
 
第六题 d  default 这个是标准的 其他都错了!要不就不是 
 
第七题 d 还是d 其他都错 
 
 
好了入正题今天的学习 
 
 
 
从这里可以看到今天要写的代码 是 调用传值的问题 为什么这里的值会变成这样呢! 
流程不懂的下个断点用f9 下载main函数哪里然后 f 10 走一步 看黄色箭头就知道他怎么走了 
原因就是他对main函数里的值只是复制了一份过去!并没有直接修改main里边的变量,所以自增哪里只是自增自己传过去的值! 
这里牵扯到内存分配的问题,是反汇编的。。。怎么跟你们讲呢,一大堆!我给你们分析下,画个堆栈图吧! 
4:    void main() 
5:    { 
00401020   push        ebp                
00401021   mov         ebp,esp 
00401023   sub         esp,44h 
00401026   push        ebx 
00401027   push        esi 
00401028   push        edi 
00401029   lea         edi,[ebp-44h] 
0040102C   mov         ecx,11h 
00401031   mov         eax,0CCCCCCCCh 
00401036   rep stos    dword ptr [edi] 
6:        int num=3; //定义变量num 赋值3 
00401038   mov         dword ptr [ebp-4],3 
7:        add(num); //调用函数add并传递值num 
0040103F   mov         eax,dword ptr [ebp-4] 
00401042   push        eax 
00401043   call        @ILT+0(add) (00401005) 跳转这里 1111111111111111111111111111111 
00401048   add         esp,4 
8:        printf("%d\n",num); //输出数值! 
0040104B   mov         ecx,dword ptr [ebp-4] 
0040104E   push        ecx 
0040104F   push        offset string "%d\n" (0042001c) 
00401054   call        printf (004010e0) 
00401059   add         esp,8 
9:    } 
0040105C   pop         edi 
0040105D   pop         esi 
0040105E   pop         ebx 
0040105F   add         esp,44h 
00401062   cmp         ebp,esp 
00401064   call        __chkesp (00401160) 
00401069   mov         esp,ebp 
0040106B   pop         ebp 
0040106C   ret 
 
 
1111111111111111111111111111111111111 
10:   void add(int num) 
11:   { 
00401080   push        ebp 
00401081   mov         ebp,esp 
00401083   sub         esp,40h 
00401086   push        ebx 
00401087   push        esi 
00401088   push        edi 
00401089   lea         edi,[ebp-40h] 
0040108C   mov         ecx,10h 
00401091   mov         eax,0CCCCCCCCh 
00401096   rep stos    dword ptr [edi] 
12:       num++; //自增 
00401098   mov         eax,dword ptr [ebp+8] 
0040109B   add         eax,1 
0040109E   mov         dword ptr [ebp+8],eax 
13:       printf("%d\n",num);//输出! 
004010A1   mov         ecx,dword ptr [ebp+8] 
004010A4   push        ecx 
004010A5   push        offset string "%d\n" (0042001c) 
004010AA   call        printf (004010e0) 
004010AF   add         esp,8 
14:   } 
004010B2   pop         edi 
004010B3   pop         esi 
004010B4   pop         ebx 
004010B5   add         esp,40h 
004010B8   cmp         ebp,esp 
004010BA   call        __chkesp (00401160) 
004010BF   mov         esp,ebp 
004010C1   pop         ebp 
004010C2   ret 
 
 
 
 
 
 
 
 
到这里就算完了,就不继续跟了,后边的pop都是恢复堆栈的,调用完毕后会恢复成一开始的样子,但是内存中使用过的数据是没清除的! 
从这里可以看到关键代码!他跟add函数进去之后 
mov         eax,dword ptr [ebp+8]          这是当初call进来的时候存入的eax 所以他更改的值 
0040109B   add         eax,1 
0040109E   mov         dword ptr [ebp+8],eax 
那吗谁给eax的值呢 
mov         eax,dword ptr [ebp-4] 
00401042   push        eax 
00401043   call        @ILT+0(add) (00401005) 
 
 
是这段 ,可以看出,这是刚开始的传入值,传入后,他就跟原来的函数内存没关系了!他复制了一份到新分配的内存里,他后边修改的就不是他这个值了,一个三一个四还是很好辨认的 
 
。。。。。。反正我看着一目了然!你们看我觉得应该很蒙吧!我也这样蒙过!本来说推荐补习班的,后来想想,你们学不会跟我有毛关系! 被坑也没事,又不是我的钱!管理要是给我判断为广告了,损失的就是我了~~ 下一贴走起 
 
 
 
 
 
 
 
 
 |   
 
评分
- 
|  参与人数 4 | HB +2 | 
THX +2 | 
收起
理由
 | 
 
| 
禽大师
 |  + 1 | 
 | 
 | 
 
| 
消逝的过去
 |  | 
 + 1 | 
 | 
 
| 
zxjzzh
 |  | 
 + 1 | 
[吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少! | 
 
| 
agan8888
 |  + 1 | 
 | 
 | 
 
 
查看全部评分
 
 
 
 
 
 |