将EAX寄存器存储在变量中
Storing EAX register in a variable
我目前正在为一个类进行奖金分配,在这个类中,我们必须从可执行文件中提取一个keygen,并使用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存储在另一个变量中。有什么想法吗?我从来没有处理过汇编,有人告诉我不必知道如何使用它。我认为他们对我们撒谎了…
x86的一个常见函数调用约定是cdecl,其中函数的积分返回值保存在EAX寄存器中。例如,一个简单的组装函数可以是:
#include "stdio.h"
int f()
{
__asm
{
mov eax, 42 // setting EAX to 42 here
}
}
int main()
{
int i = f();
printf("%in", i);
return 0;
}
您所拥有的似乎是Intel语法,因此您可能希望使用-masm=intel
标志编译该内联程序集。
使用Visual Studio在Windows 10 64位上编译,并运行可执行文件将在终端中生成:
42
最初的f()
在功能上等同于(据我所知):
int f()
{
return 42;
}
您只需在程序的C部分声明一个int(或无符号int),然后执行
mov变量,eax
在内联汇编程序块中。
相关文章:
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 如何将变量存储为无
- 有没有办法强制C++编译器将变量存储在寄存器中?
- C++ - thread_local变量存储在哪里?
- 如何使用 c++ 将多个变量存储在一个变量中?例如,双精度 x,y,z 包含在可变点 p 中
- 如何将文件从文件作为变量存储
- 引用变量存储在哪里
- 尝试在C 程序中设置简单的键盘输入.使用变量存储True或false
- 如何将变量存储在另一个文件中
- 编译时局部变量存储在哪里
- lambda 捕获的变量存储在哪里
- 闭包捕获的变量存储在哪里?
- 静态和全局变量存储说明
- 模式名称,将值作为静态变量存储在函数中
- 任何人都能解释常量或常量变量存储在哪里吗
- 将变量存储在将被多次使用的函数中的最佳方式(c++)
- 如何将字符变量存储为二维字符变量
- 将环境变量存储在动态分配的数组中
- 从矢量中获取选定的数据,然后作为变量存储
- DLL的全局变量存储在内存中