-
-
[旧帖]
[原创]IDA分析结构体是如何按值传递的,顺便求一个邀请码
0.00雪花
-
发表于:
2010-7-2 14:34
2768
-
[旧帖] [原创]IDA分析结构体是如何按值传递的,顺便求一个邀请码
0.00雪花
最近又拿起了黑客反汇编揭秘翻了翻,其中有一个例子引起了我的关注,我们知道数值类型和指针类型的参数一般是通过寄存器push(stdcall、cdecl约定)来传递的,那么一个结构体的大小肯定不止4字节(32位系统),那么他是如何进行传递的呢?难道像对象一样通过指针?其实不是,是通过堆栈指针直接传递,希望能给初初学者带来一点帮助。(本人也是初学者,大牛们嘴下留情,有错误请指出。)
vs2008,Max Speed (/02)编译源代码如下:
#include <stdio.h>
#include <string.h>
struct zzz
{
char s0[16];
int a;
float f;
};
void func(zzz y)
{
printf("%s %x %f\n", &y.s0[0], y.a, y.f);
}
int main()
{
zzz y;
strcpy(&y.s0[0], "Hello");
y.a=0x666;
y.f=6.6;
func(y);
}
.text:00401070 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00401070 _main: ; CODE XREF: ___tmainCRTStartup+10Ap
.text:00401070 sub esp, 1Ch
.text:00401073 mov eax, dword ptr stru_403000.s0 ; 将结构体中s0的地址放入eax
.text:00401078 xor eax, esp ; 这里不明白,为何要和esp进行异或
.text:0040107A mov [esp+18h], eax ; s0地址存入放入esp+0x18
.text:0040107E mov ax, word ptr ds:aHello+4 ; 此处将"Hello"的第四个字符Ascii放入ax
.text:00401084 fld ds:flt_402108 ; 6.6压入浮点寄存器
.text:0040108A mov ecx, dword ptr ds:aHello ; "Hello"
.text:00401090 fstp dword ptr [esp+14h] ; 弹出6.6到esp+0x14
.text:00401094 mov [esp+4], ax ; 转存esp+4,不明白为何要保存ax?
.text:00401099 sub esp, 18h ; 分配sizeof(zzz)=0x18字节
.text:0040109C mov eax, esp ; eax指向栈顶
.text:0040109E mov [eax], ecx ; 字符串拷贝1,因为s0有16字节,所以分4句
.text:004010A0 mov ecx, [esp+1Ch]
.text:004010A4 mov [eax+4], ecx ; 字符串拷贝2
.text:004010A7 mov ecx, [esp+20h]
.text:004010AB mov [eax+8], ecx ; 字符串拷贝3
.text:004010AE mov ecx, [esp+24h]
.text:004010B2 mov edx, 666h
.text:004010B7 mov [eax+0Ch], ecx ; 字符串拷贝4
.text:004010BA mov [eax+10h], edx ; 666
.text:004010BD mov edx, [esp+2Ch]
.text:004010C1 mov [eax+14h], edx ; 6.6
.text:004010C4 call func ; 此时eax即esp开始的0x18字节均为zzz结构体了
.text:004010C9 mov ecx, [esp+30h]
.text:004010CD add esp, 18h
.text:004010D0 xor ecx, esp
.text:004010D2 xor eax, eax
.text:004010D4 call sub_4010DD
.text:004010D9 add esp, 1Ch
.text:004010DC retn
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)