Assembly 实施C++;ASM x86中的调用约定
我编写了一个简单的程序,使用ASM x86对字符串进行模糊处理。用户必须输入所需的字符串,然后为要混淆的字符串选择一个键(Assembly 实施C++;ASM x86中的调用约定,assembly,x86,cdecl,Assembly,X86,Cdecl,我编写了一个简单的程序,使用ASM x86对字符串进行模糊处理。用户必须输入所需的字符串,然后为要混淆的字符串选择一个键(Ekey)。(我知道您可以通过移位运算符或查表来模拟左右位旋转,我只是想让自己熟悉ASM) < >我试图改变程序,使其采用一个接受的C++标准调用程序,如 Cdecl < /> >,将参数( EKey < /C> >代码> TunChar < /代码>)放入子例程混淆> < /代码> .< 尽管我做了很多小时的研究,但都没有成功,所以我来到这里,希望有更多经验的人能提供一些指
Ekey
)。(我知道您可以通过移位运算符或查表来模拟左右位旋转,我只是想让自己熟悉ASM)
< >我试图改变程序,使其采用一个接受的C++标准调用程序,如<代码> Cdecl < /> >,将参数(<代码> EKey < /C> >代码> TunChar < /代码>)放入子例程<代码>混淆> < /代码> .<
尽管我做了很多小时的研究,但都没有成功,所以我来到这里,希望有更多经验的人能提供一些指导
以下是相关功能:
void obfusc_chars (int length, char EKey)
{ char tempChar; // char temporary store
for (int i = 0; i < length; i++) // encrypt characters one at a time
{
tempChar = OChars [i]; //
__asm { //
push eax // save register values on stack to be safe
push ecx // pushes first string on stack
//
movzx ecx,tempChar // set up registers (Nb this isn't StdCall or Cdecl)
lea eax,EKey //
call obfuscate // obfuscate the character
mov tempChar,al //
//
pop ecx // restore original register values from stack
pop eax //
}
EChars [i] = tempChar; // Store encrypted char in the encrypted chars array
}
return;
提前感谢您抽出时间阅读 这里到底有什么问题?您正试图从位于其他地方的代码调用内联程序集标签,对吗?那是不可能的。您需要做的是将代码写入一个单独的汇编文件,设置符号
obfuscate
global,将其编译成一个对象文件,并将其与您的程序链接在一起(声明obfuscate
为extern“C”
)@user35443抱歉,我格式化代码的方式非常糟糕,实际上,我并没有试图从其他地方编写的代码中调用。obfuscate
子例程直接写在for
循环的下方。请参阅:尽管如此,它还是一个只有编译器知道的标签。如果你想从C++代码中使用汇编例程,把它们称为外部符号,并把相应的编译程序集链接到程序。那么,我只想知道,为什么你来这里问我。我的代码没有任何问题,所以你为什么要告诉我这个?我只想更改参数tempChar
和EKey
的传递方式。
// Inputs: register EAX = 32-bit address of Ekey,
// ECX = the character to be encrypted (in the low 8-bit field, CL).
// Output: register EAX = the encrypted value of the source character (in the low 8-bit field, AL).
__asm {
obfuscate: push esi
push ecx
mov esi, eax
and dword ptr [esi], 0xFF
ror byte ptr [esi], 1
ror byte ptr [esi], 1
add byte ptr [esi], 0x01
mov ecx, [esi]
pop edx
x17:ror dl, 1
dec ecx
jnz x17
mov eax, edx
add eax, 0x20
xor eax, 0xAA
pop esi
ret
}