能力值:
( LV2,RANK:10 )
2 楼
不知道为什么是add esp,4
而函数调用前如何是push 4 次,需要再跟进函数的调用,确定是C call, std call还是pascal call, system call,还要确定参数传入,之后才好高级翻译
能力值:
( LV2,RANK:10 )
3 楼
用DELPHI的内嵌汇编已经搞定,不过我还是不会用高级语言来写
procedure _GetA; stdcall; external 'a.dll';
procedure TForm1.Button1Click(Sender: TObject);
var
s: String;
p, p2: Pointer;
begin
s := Edit1.Text;
p := @s[1];
asm
mov eax, p;
push 0;
push 0;
push eax;
push eax;
call GetA;
mov ecx, [eax];
mov p, ecx;
mov ecx, [eax + 4];
mov p2, ecx;
end;
Label1.caption := String(PChar(p)) + String(PChar(p2));
end;
谁会? 告诉我吧,谢谢啦
能力值:
( LV2,RANK:10 )
4 楼
知道函数调用,函数参数就可以写
能力值:
( LV2,RANK:10 )
5 楼
如果什么都知道,那当然没问题,COPY一下就可以了,问题是OD只告诉我这么多
调用前压入4个参数,调用后在EAX和EAX+4有两个DWORD值,指向两个字符串
我不太想用内嵌汇编,想用纯PASCAL,现在不知道在DELPHI怎么处理这个返回
能力值:
( LV2,RANK:10 )
6 楼
最初由 apojie 发布 如果什么都知道,那当然没问题,COPY一下就可以了,问题是OD只告诉我这么多 调用前压入4个参数,调用后在EAX和EAX+4有两个DWORD值,指向两个字符串 我不太想用内嵌汇编,想用纯PASCAL,现在不知道在DELPHI怎么处理这个返回
你可以跟进那个函数啊,跟进了就一定能知道它是C ,std, pascal, 当然在一般程序里面是不会出现system call格式的函数。这样就能确定它的函数参数入stack的顺序,决定究竟有几个是参数,否则没办法知道为什么push 了4次,又add esp only 4。一般来说在函数调用之后add esp ,xxx,是extern"C"的函数,
能力值:
( LV2,RANK:10 )
7 楼
最初由 apojie 发布 PUSH DWORD PTR DS:[1C11038] PUSH EBX PUSH EAX PUSH EAX CALL DWORD PTR DS:[1C1103C] ADD ESP,4 PUSH DWORD PTR DS:[EAX+4] PUSH DWORD PTR DS:[EAX]
最后两statement are push the member of a structure returned by the func call into the stack,
the structure can be represented as
typedef struct {
bits32_t firstmember;
bits32_t secondmember;
}