http://bbs.pediy.com/showthread.php?t=51839
在以上链接中有一道c语言的测试题:
1、如何在下面的test函数里加入代码可以使程序运行起来输入和输出的相等?
(环境是vc6Debug方式下)
#include<stdio.h>
void test()
{
int t;
scanf("%d",&t);
在这里加入代码
}
void main()
{
int m;
test();
printf("m=%d",m);
}
/*----------------------------------------------------------------*/
以下是我写的代码(vs2008-vc9.0,debug)
#include <stdio.h>
void test()
{
int t;
scanf("%d",&t);
_asm
{
add esp,0x1C0
push t
sub esp,0x1BC
}
}
void main()
{
int m ;
test();
printf("m = %d",m);
}
/*----------------------------------------------------------------*/
以下是反汇编后的代码
void main()
{
00430760 push ebp
00430761 mov ebp,esp
00430763 sub esp,0D8h
00430769 push ebx
0043076A push esi
0043076B push edi
0043076C lea edi,[ebp-0D8h]
00430772 mov ecx,36h
00430777 mov eax,0CCCCCCCCh
0043077C rep stos dword ptr es:[edi]
0043077E mov byte ptr [ebp-0D1h],0
int m ;
test();
00430785 call test (42E56Eh)
printf("m = %d",m);
0043078A cmp byte ptr [ebp-0D1h],0
00430791 jne main+40h (4307A0h)
00430793 push offset (4307C7h)
00430798 call @ILT+1950(__RTC_UninitUse) (42E7A3h)
0043079D add esp,4
004307A0 mov eax,dword ptr [m]
004307A3 push eax
004307A4 push offset string "m = %d" (48BC70h)
004307A9 call @ILT+4440(_printf) (42F15Dh)
004307AE add esp,8
}
void test()
{
004306C0 push ebp
004306C1 mov ebp,esp
004306C3 sub esp,0CCh
004306C9 push ebx
004306CA push esi
004306CB push edi
004306CC lea edi,[ebp-0CCh]
004306D2 mov ecx,33h
004306D7 mov eax,0CCCCCCCCh
004306DC rep stos dword ptr es:[edi]
int t;
scanf("%d",&t);
004306DE lea eax,[t]
004306E1 push eax
004306E2 push offset string "%d" (48BC6Ch)
004306E7 call @ILT+3300(_scanf) (42ECE9h)
004306EC add esp,8
_asm
{
add esp,0x1C0
004306EF add esp,1C0h
push t
004306F5 push dword ptr [t]
sub esp,0x1BC
004306F8 sub esp,1BCh
}
}
/*---------------------------------------------------------------------------*/
在这里我有两个疑问想请教各位大牛:(vs2008 DeBug)
1.函数入口处sub esp,0CCh和 sub esp,0D8h 指令中的CC和D8和怎么计算出来的,保留这空间是做什么用途的?
2.我添加完代码之后可以把m的值置成我输入的值了,但怎么样才能消除“使用未初始化变量”的错误?
谢谢各位!
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法