将EAX寄存器存储在变量中

时间:2016-04-19 03:42:36

标签: c++ visual-c++ inline-assembly

我目前正在为一个类进行奖励分配,我们必须从可执行文件中删除一个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存储在另一个变量中。有任何想法吗?我从未使用过装配工作而且我被告知我不必知道如何使用它。我想他们骗了我们......

2 个答案:

答案 0 :(得分:0)

您可以在程序的C部分声明一个int(或unsigned int),然后执行

mov cvariable,eax

在内联汇编程序块中。

答案 1 :(得分:0)

x86的常用函数调用约定是cdecl,其中函数的整数返回值保存在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;
}

您看起来似乎是英特尔语法,因此您可能希望使用-masm=intel标志编译该内联汇编。

在Windows 10 64位上使用Visual Studio进行编译,并在终端中生成可执行文件:

42

原始f()在功能上等同于(据我所知):

int f()
{
    return 42;
}