将EAX寄存器存储在变量中

Storing EAX register in a variable

本文关键字:变量 存储 EAX 寄存器      更新时间:2023-10-16

我目前正在为一个类进行奖金分配,在这个类中,我们必须从可执行文件中提取一个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

在内联汇编程序块中。