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