c语言空函数作用,C语言空函数分析 - osc_pw143nru的个人空间 - OSCHINA - 中文开源技术交流社区...

实验环境:WIN7虚拟机 软件:VC6

首先在VC6里面写一个空函数Fun();

063f45df8a14f0dfcfefcc0be9355a56.png

F7编译运行一下,没有出错,接着在函数处使用F9下断点,使程序运行到Fun函数时停下。

8c7b2ec700efe16d18cbfd89b6c60ef1.png

接着F5开始运行这个程序

ea897e04b0832f0627de10d917b724c9.png

程序停在了Fun函数处,反汇编进去进行逆向分析

3674f852e4d02a1d6d453b220e79459e.png 可以看到程序停在Fun函数的入口处,这里的call就是Fun函数的入口,F11跟进去进行分析。

原始堆栈图是这样的。

1cd5021f616e9cb1d15afa9f5da20459.png

0040D408 call @ILT+5(_Fun) (0040100a)

F11,跟进这个call进行分析,进入函数之后编译器会将跳出函数之后下一个要执行的地址压入堆栈,即将0040D40D压入堆栈,同时esp-4,esp变成0012FEF8,这时的堆栈是这样的:

c7eba4a6d51200a4d0821ada44d526b2.png

跟进来之后是一个jmp,F11直接跳转。

c2b38fe083e0e01eddb46ff6670bec82.png

现在进到函数里面了

aead55239e5259fc73275bc2c18edbc3.png

00401010 push ebp

首先将ebp压栈,就是将[ebp]压入堆栈,即将0012FF48压入堆栈,然后esp的位置向上提升一个变为0012FEF4。

b91dad1167f4697cff3f8b7e1de8eee6.png

查看检查寄存器进行验证:

b443993955207091917f3c00b3954923.png

00401011 mov ebp,esp

将esp的值赋给ebp,也就是将0012FEF4赋给ebp,这时的堆栈图是这样的

2d4e6bb52a1ee1a3cf9f6aab9fa88462.png

查看寄存器验证,这里可以看到esp和ebp的值相等,说明上面那个堆栈图没有问题

251ed43b53d64cd1ce71760db08b5086.png

00401013 sub esp,40h

将esp减去40h,也就是将esp的位置提升到0012FEB4位置,这一步的作用是提升堆栈,这时的堆栈图是这样的

32ec02531e0fdf318844adf69250932c.png

查看寄存器进行验证,看到esp的值为0012FEB4

4d8534a1828567969e3ad5e9c64c9bfc.png

00401016 push ebx

接着将ebx压栈,查看栈顶可以看到ebx被压入堆栈,同时esp的位置向上提升。

d868dc6796e3151f2c74354313f51eeb.png 此时的堆栈是这样的:

fd487f5c081060a2a524f1d664e3a068.png

00401017 push esi

将esi的值压入堆栈,此时的堆栈是这样的

ce65221402ba73a80f3d21a77871a7f2.png 查看寄存器进行验证:

8fcb2f8f322484016c001790b4c13d39.png

00401018 push edi

接着将edi的值压入堆栈,此时的堆栈是这样的

932fceaaac95b22b63bf3bc1304dcccd.png 查看寄存器验证:

bddfb906baa6f5b31f41b339b976be0a.png

00401019 lea edi,[ebp-40h]

将[ebp-40h]的地址存入edi中,也就是将0012FEB4存入edi。

查看寄存器验证,可以看到0012FEB4被存入edi中

19176cdc9d65df25af42fb9afcdb2faf.png

0040101C mov ecx,10h

将10h存入ecx中,也就是将00000010存入ecx,查看寄存器验证:

813831d5707763a65a286e4967075c1b.png

00401021 mov eax,0CCCCCCCCh

将CCCCCCCC存入eax中,查看寄存器验证:

c77ec8ffeeef9294fa76968f18481615.png

00401026 rep stos dword ptr [edi]

将eax的中的值存储到[edi]对应地址的内存中,并重复ecx次,也就是将CCCCCCCC存入地址0012FEB4对应的内存中,并重复10h次,rep每执行一次,[edi]会相应的加4(向下填充数值),ecx会相应的减4(减少执行次数)。

此时的堆栈是这样的:

7b091bd82e8ac846daad35732e6d2434.png 查看寄存器验证一下,发现从0012FEF4到0012FEB4全部被填充为CCCCCCCC。

97cd7424dc4d490bd17c419988fa5aaf.png

00401028 pop edi

将edi出栈,也就是将esp当前对应的值0012FF48赋给edi,同时esp加4变成0012FEAC,此时的堆栈

2ea6768440a013b249f6de5eeb6feebe.png 查看寄存器验证:

e0beea7bab48e861b7b66e70d384a5f3.png

00401029 pop esi

将esi出栈,也就是将esp当前对应的值00000000赋给edi,同时esp加4变成0012FEB0,此时的堆栈

9c8d379db6f472132facb525bc956be8.png 查看寄存器验证:

e02ec8006535fa20722e5e2424842288.png

0040102A pop ebx

将ebx出栈,也就是将esp当前对应的值7FFDD000赋给ebx,同时esp加4变成0012FEB4,此时的堆栈

52cdf3109e88bf62aa62d56daedd2c65.png 查看寄存器验证一下:

73d751a37738ccd61690d9b04516c74e.png

0040102B mov esp,ebp

将ebp的值赋给esp,这里的作用相当于降低堆栈,此时的堆栈是这样的

2fd78bea105b9766a49839e7489b21f0.png 查看寄存器进行验证,esp的值和ebp的值相等

fd5a5671377e43942651904c4d5a353a.png

0040102D pop ebp

将ebp出栈,也就是将esp当前对应的值0012FF48赋给ebx,这时ebx又回到了一开始所在的位置,同时esp加4变成0012FEF8,此时的堆栈是这样的

56a78726c4a2e1a714ca5883895d8122.png 查看寄存器验证一下

96f15b1a20b41e0eafaa993cddde12e7.png

0040102E C3 ret

相当于pop eip,即将当前esp对应的值放入eip中,也就是将0040D40D放入eip中,同时ESP+4,esp变为0012FEFC,此时的堆栈是这样的

e30651b356a6746d49df7ef14b38c1ef.png 查看寄存器验证一下,至此堆栈恢复平衡,Fun函数执行完毕

2040b9a92ad2fb3e1e0b4a39a134432d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值