Assembly EBX寄存器用于传递uu fastcall函数参数

Assembly EBX寄存器用于传递uu fastcall函数参数,assembly,visual-c++,x86,calling-convention,Assembly,Visual C++,X86,Calling Convention,我正在尝试钩住一个使用EBX的fastcall函数,并试图重新生成相同的asm行,以便钩子工作 mov ebx,dword ptr ss:[ebp+8] mov ecx,eax call 004F00F0 你知道什么会让快速呼叫约定利用EBX吗? 注:编写的ASM是由Visual Studio C++ 2005编译器生成的,我在VS2019编写自己的代码。 更新#1: 功能组件如下所示: sub esp,8 test ecx,ecx push ebp push esi push edi je

我正在尝试钩住一个使用EBX的fastcall函数,并试图重新生成相同的asm行,以便钩子工作

mov ebx,dword ptr ss:[ebp+8]
mov ecx,eax
call 004F00F0
你知道什么会让快速呼叫约定利用EBX吗?
注:编写的ASM是由Visual Studio C++ 2005编译器生成的,我在VS2019编写自己的代码。 更新#1:

功能组件如下所示:

sub esp,8
test ecx,ecx
push ebp
push esi
push edi
je 004F0208
mov ax,word ptr ds:[ecx+80]
test al,2
je 004F0208
and al,1C
cmp al,4
jne 004F0208
fldz 
lea ebp,dword ptr ds:[ebx+21A0]
fst dword ptr ss:[ebp+8],st(0)
mov dword ptr ss:[ebp],0
fst dword ptr ss:[ebp+C],st(0)
mov byte ptr ss:[ebp+4],0
mov byte ptr ss:[ebp+5],0
xor eax,eax
mov dword ptr ss:[ebp+10],eax
mov dword ptr ss:[ebp+14],eax
mov dword ptr ss:[ebp+18],eax
mov dword ptr ss:[ebp+1C],eax
mov dword ptr ss:[ebp+20],eax
mov dword ptr ss:[ebp+24],eax
mov dword ptr ss:[ebp+28],eax
mov dword ptr ss:[ebp+2C],eax
mov dword ptr ss:[ebp+30],eax
mov dword ptr ss:[ebp],ecx
mov byte ptr ds:[ebx+21A4],1
movzx eax,word ptr ds:[ecx+E4]
mov dword ptr ss:[esp+10],eax
lea esi,dword ptr ds:[ebx+1EC]
mov edi,17
fild st(0),dword ptr ss:[esp+10]
fstp dword ptr ds:[ebx+21A8],st(0)
movzx ecx,word ptr ds:[ecx+E6]
mov dword ptr ss:[esp+10],ecx
push ecx
fild st(0),dword ptr ss:[esp+14]
fstp dword ptr ds:[ebx+21AC],st(0)
fstp dword ptr ss:[esp],st(0)
push 0
push 3
call 004B3510
fldz 
push ecx
fstp dword ptr ss:[esp],st(0)
push 0
push 3
mov edi,18
call 004B3510
mov edx,dword ptr ds:[ebx]
mov eax,dword ptr ds:[edx+4E8]
mov ecx,ebx
call eax
push 3207
call 00430A00
add esp,4
mov esi,eax
lea ecx,dword ptr ds:[ebx+8]
push ecx
lea eax,dword ptr ds:[edi-14]
mov ecx,esi
call 00404090
mov edi,00CD3A80
call 0042C8F0
cmp dword ptr ss:[ebp],0
je 004F01F3
mov eax,edi
mov ecx,ebp
call 004DD6B0
mov edi,esi
mov eax,edi
mov esi,00CD3A80
call 0042C820
mov esi,ebx
call 00484D90
pop edi
pop esi
pop ebp
add esp,8
ret 

您确定
ebx
实际用作参数吗?该功能的原型是什么样子的?它的(汇编)实现是什么样子的?@Michael是的,ebx实际上是在函数中使用的,我在问题中添加了函数asm,这听起来像是一个自定义调用约定,而不是纯粹的
\uu fastcall
。你确定不是手写的吗?如果不是,从什么来源产生?@ Peer-Cordes源代码实际上是不可用的,据我所知,可执行文件是在VS C++ 2005上编译的,不,我并不认为它是手写ASM,但正如您所提到的,它可能是一个自定义调用约定!其中一些可能是内联asm语句吗?代码生成器的选择看起来很奇怪。我没有查看VS2005输出的经验,但是
mov dword ptr ss:[ebp],0
/…/<代码>异或eax,eax/
mov dword ptr ss:[ebp+10],eax
/。。。更多的EAX商店看起来真的很可疑。对于编译器来说,将寄存器归零并将其存储是有意义的,这样可以为每条指令节省4个字节。如果你打算在一个街区内这样做,为什么不早一点呢?除非该块中有多个分支目标,所以它不是一个基本块,也许?但您可能仍然可以提前(如果不是晚些的话)移动xor归零