将 EAX 寄存器存储在变量中
Storing EAX register in a variable
我目前正在为一个 class 做一个额外的任务,在这个任务中我们必须从可执行文件中删除一个注册机并使用 C++ 中的 __asm 指令直接插入汇编代码 (稍作编辑)。
结果如下:
int main(int argc, char** argv) {
char userName[] = "USERNAME";
int serNum;
__asm {
LEA edx, [userName]; //put user name in edx
LEA eax, DWORD PTR[edx]; //put user name in eax
LEA ebx, DWORD PTR[userName + 1]; // put "sername" in ebx
MOV ecx, 0x00000000; // random initializing
MOV ebp, 0x00000000;
MOV esi, 0x00000000;
MOV edi, 0x00000000;
COUNT_loop:;
MOV CL, BYTE PTR DS : [eax]; // code to get length of user name
INC eax;
TEST CL, CL;
JNZ SHORT COUNT_loop;
SUB eax, ebx;
MOV ebx, eax;
SAR ebx, 1;
MOVSX ebp, BYTE PTR DS : [ebx + edx];
IMUL ebp, ebp, 0x3E8;
XOR eax, eax;
CMP ebx, 2;
JL SHORT SKIP_jump;
MOV edi, edi;
GEN_loop:;
MOVSX ecx, BYTE PTR DS : [edx + eax]; //generate the key somehow
LEA ecx, DWORD PTR DS : [ecx + ecx * 4];
LEA esi, DWORD PTR DS : [esi + ecx * 2];
MOVSX ecx, BYTE PTR DS : [edx + eax + 1];
LEA ecx, DWORD PTR DS : [ecx + ecx * 4];
LEA edi, DWORD PTR DS : [edi + ecx * 2];
ADD eax, 2;
LEA ecx, DWORD PTR DS : [ebx - 1];
CMP eax, ecx;
JL SHORT GEN_loop;
SKIP_jump:;
CMP eax, ebx;
JGE SHORT ODD_skip;
MOVSX eax, BYTE PTR DS : [eax + edx];
LEA edx, DWORD PTR DS : [eax + eax * 4];
LEA ebp, DWORD PTR SS : [ebp + edx * 2];
ODD_skip:;
LEA eax, DWORD PTR DS : [edi + esi];
ADD eax, ebp; // store final key in eax
};
}
问题是我现在需要 EAX 的内容。我不确定如何将 EAX 存储在另一个变量中。有任何想法吗?我从未使用过汇编,有人告诉我我不必知道如何使用它。我觉得他们骗了我们....
您可以在程序的 C 部分声明一个 int(或 unsigned int),然后执行
mov cvariable, eax
在线汇编程序块中。
x86 的常用函数调用约定是 cdecl,其中函数的整数 return 值保存在 EAX 寄存器中。例如,一个简单的汇编函数可以是:
#include "stdio.h"
int f()
{
__asm
{
mov eax, 42 // setting EAX to 42 here
}
}
int main()
{
int i = f();
printf("%i\n", i);
return 0;
}
您所使用的似乎是 Intel 语法,因此您可能希望使用 -masm=intel
标志编译该内联程序集。
在 Windows 10 64 位上使用 Visual Studio 编译,运行 可执行文件将在终端中生成:
42
原来的 f()
在功能上等同于(据我所知):
int f()
{
return 42;
}
我目前正在为一个 class 做一个额外的任务,在这个任务中我们必须从可执行文件中删除一个注册机并使用 C++ 中的 __asm 指令直接插入汇编代码 (稍作编辑)。
结果如下:
int main(int argc, char** argv) {
char userName[] = "USERNAME";
int serNum;
__asm {
LEA edx, [userName]; //put user name in edx
LEA eax, DWORD PTR[edx]; //put user name in eax
LEA ebx, DWORD PTR[userName + 1]; // put "sername" in ebx
MOV ecx, 0x00000000; // random initializing
MOV ebp, 0x00000000;
MOV esi, 0x00000000;
MOV edi, 0x00000000;
COUNT_loop:;
MOV CL, BYTE PTR DS : [eax]; // code to get length of user name
INC eax;
TEST CL, CL;
JNZ SHORT COUNT_loop;
SUB eax, ebx;
MOV ebx, eax;
SAR ebx, 1;
MOVSX ebp, BYTE PTR DS : [ebx + edx];
IMUL ebp, ebp, 0x3E8;
XOR eax, eax;
CMP ebx, 2;
JL SHORT SKIP_jump;
MOV edi, edi;
GEN_loop:;
MOVSX ecx, BYTE PTR DS : [edx + eax]; //generate the key somehow
LEA ecx, DWORD PTR DS : [ecx + ecx * 4];
LEA esi, DWORD PTR DS : [esi + ecx * 2];
MOVSX ecx, BYTE PTR DS : [edx + eax + 1];
LEA ecx, DWORD PTR DS : [ecx + ecx * 4];
LEA edi, DWORD PTR DS : [edi + ecx * 2];
ADD eax, 2;
LEA ecx, DWORD PTR DS : [ebx - 1];
CMP eax, ecx;
JL SHORT GEN_loop;
SKIP_jump:;
CMP eax, ebx;
JGE SHORT ODD_skip;
MOVSX eax, BYTE PTR DS : [eax + edx];
LEA edx, DWORD PTR DS : [eax + eax * 4];
LEA ebp, DWORD PTR SS : [ebp + edx * 2];
ODD_skip:;
LEA eax, DWORD PTR DS : [edi + esi];
ADD eax, ebp; // store final key in eax
};
}
问题是我现在需要 EAX 的内容。我不确定如何将 EAX 存储在另一个变量中。有任何想法吗?我从未使用过汇编,有人告诉我我不必知道如何使用它。我觉得他们骗了我们....
您可以在程序的 C 部分声明一个 int(或 unsigned int),然后执行
mov cvariable, eax
在线汇编程序块中。
x86 的常用函数调用约定是 cdecl,其中函数的整数 return 值保存在 EAX 寄存器中。例如,一个简单的汇编函数可以是:
#include "stdio.h"
int f()
{
__asm
{
mov eax, 42 // setting EAX to 42 here
}
}
int main()
{
int i = f();
printf("%i\n", i);
return 0;
}
您所使用的似乎是 Intel 语法,因此您可能希望使用 -masm=intel
标志编译该内联程序集。
在 Windows 10 64 位上使用 Visual Studio 编译,运行 可执行文件将在终端中生成:
42
原来的 f()
在功能上等同于(据我所知):
int f()
{
return 42;
}