|
本帖最后由 武大郎 于 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 |
|
|
查看全部评分
|