您指的是哪种“未记录的功能”?大多数时候,汇编只是编译的高级代码。几乎没有任何“未记录”的内容。
EBP
最常在函数中用作堆栈帧指针,尤其是在 C 调用约定中(也称为cdecl
)。通过这种约定,参数以相反的顺序在堆栈上传递(例如,最后一个参数首先被压入),并且被调用的函数使用EBP
访问它们。根据您发布的代码,我认为第一个参数可能指向数据结构。看一看 :
MOV EAX, DWORD PTR SS:[EBP+8]
LEA ECX, DWORD PTR DS:[EAX+4]
MOV DWORD PTR DS:[EAX], EDX
MOV DWORD PTR DS:[ECX+4],ECX
MOV DWORD PTR DS:[ECX],ECX
MOV DWORD PTR DS:[EAX+C],ECX
MOV ECX, DWORD PTR SS:[EBP+C]
第一条指令将第一个参数移入EAX
。然后将偏移量 4 添加到该参数并移入ECX
。请注意,这是由LEA
指令,它是“加载有效地址”的简写。它用于无符号算术,编译器喜欢在进行指针算术和添加偏移量时使用它 - 所以每当你看到这条指令时,你应该警惕它所操作的任何内容might是一个指向结构体的指针。当然,没有办法确定。后来我们有一些MOV
往返该地址,其中ECX
用于访问内存。这些结构(如果存在)在 C 中看起来像这样:
struct a { /* pointed to by EAX / [EBP+8] */
int memb1; /* MOV DWORD PTR DS:[EAX], EDX */
struct b* memb2; /* LEA ECX, DWORD PTR DS:[EAX+4] */
int memb3; /* unused? */
int memb4; /* MOV DWORD PTR DS:[EAX+C],ECX */
};
struct b {
int memb1; /* MOV DWORD PTR DS:[ECX],ECX */
int memb2; /* MOV DWORD PTR DS:[ECX+4],ECX */
};
希望这能以某种方式解决问题。逆向工程汇编代码是一项非常困难且耗时的任务,特别是如果您没有任何 API 调用来告诉您应用程序使用的参数类型。