首页
社区
课程
招聘
[旧帖] [原创]IDA分析结构体是如何按值传递的,顺便求一个邀请码 0.00雪花
发表于: 2010-7-2 14:34 2769

[旧帖] [原创]IDA分析结构体是如何按值传递的,顺便求一个邀请码 0.00雪花

2010-7-2 14:34
2769

最近又拿起了黑客反汇编揭秘翻了翻,其中有一个例子引起了我的关注,我们知道数值类型和指针类型的参数一般是通过寄存器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期)

上传的附件:
收藏
免费 7
支持
分享
最新回复 (1)
雪    币: 2477
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
每一个原创帖子都要顶一下
2010-7-23 15:08
0
游客
登录 | 注册 方可回帖
返回
//