QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 906|回复: 7

谁汇编好,帮我看看

[复制链接]
发表于 2004-6-2 09:01:15 | 显示全部楼层 |阅读模式
我刚开始学习逆向工程,请教个汇编转c语言的问题:
我有这样一个发生错误的函数:
====================================
push ebp
mov ebp,esp
push ecx
mov dword ptr[ebp-04], 00000000
......
......
mov eax,[ebp+08]
add eax,[ebp+0c]
mov ecx,[ebp-04]
mov [ecx],eax
xor eax,eax
pop ebp
ret 0008
====================================
错误发生在mov [ecx],eax一句,应该是要把两个参数的和赋值到一个未分配空间的指针中。但是,我不太明白ecx寄存器在这个函数中的作用,我记得ecx应该是一个临时指针,但是我怎么也还原不成C语言,还有ret 0008这条再汇编里应该是返回中断,但它在C里应该怎么表示,它跟直接ret有什么区别。
发表于 2004-6-2 09:55:09 | 显示全部楼层
n年前学过,忘光光了。
回复

使用道具 举报

发表于 2004-6-2 13:13:57 | 显示全部楼层
mov [ecx],eax
我想[ecx]与eax所能容纳的值大小不一样吧。(16与32)
就像mov没有对应的c语句一样,ret也没有吧,要不,还要逆向工程来干啥。
回复

使用道具 举报

 楼主| 发表于 2004-6-2 14:11:20 | 显示全部楼层
都是4byte,怎会不一样。
谁都知道汇编和C不能一一对应,但ret和ret 0008在源码中总是有区别的吧。
回复

使用道具 举报

发表于 2004-6-2 22:48:17 | 显示全部楼层
是4byte我就不知是怎么回事了,不如贴出错误信息看看。
返回中断是iret。
ret : ip <= [sp] sp <= sp+2
ret 0008 ip <=[sp] sp <= sp+2 sp <=sp+0008
比如你有的局部变量占了8字节,就可以ret 0008 ,如果没有局部变量,就ret。
对于逆向工程,我想要看整个程序吧,要找对应比较困难。
回复

使用道具 举报

发表于 2004-6-3 00:10:22 | 显示全部楼层
你打印ecx的值看看,估计是看了不该看的地方了,嘻嘻
ret 0008  应该是和传入参数时使用的方法有关
回复

使用道具 举报

发表于 2004-6-3 00:21:25 | 显示全部楼层
[quote:bbdef5fc5b="sagaeon"]
比如你有的局部变量占了8字节,就可以ret 0008 ,如果没有局部变量,就ret。
[/quote]有不对的地方再探讨一下。 :-)
回复

使用道具 举报

 楼主| 发表于 2004-6-3 09:17:01 | 显示全部楼层
我基本明白了我原来的问题,的确 ret 0008是与其函数参数压栈方式声明的类型有关。
我还原的c代码如下:
[code:1]
void __stdcall stupid(int n1, int n2)
{
        int *pn1 = 0;
                ...........
                ...........
        *pn1 = n1+n2;
        return;
}
[/code:1]
这段代码编译出来与一楼的汇编只差xor eax,eax一句,不知道还差在那里。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-8 04:38 , Processed in 0.037537 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表