[C++] 纯文本查看 复制代码
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <Windows.h>
int WINAPI WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow) {
MessageBox(0, L"start", L"test", MB_OK);
char strs[] = "0123456789ABCDEF";
long a = 0, b = 0, c = 0;
__asm {
push eax
push ebx
push ecx
push edx
push ebp
lea edx, strs
/// 注意修改ebp后不能使用前面定义的局部变量,要在修改前使用。
mov ebp, esp /// 保存esp
xor eax, eax
xor ecx, ecx
mov ebx, x32code /// get exit point
push 0x33
push offset x64code
jmp far fword ptr ss:[esp];
x64code:
//db 0x48, 0x8B, 0x02 //MOV RAX, QWORD PTR DS:[RDX]
_EMIT 0x48
_EMIT 0x8B
_EMIT 0x02
//db 0x48, 0x8B, 0xC8 //MOV RCX, RAX ;低32位
_EMIT 0x48
_EMIT 0x8B
_EMIT 0xC8
//db 0x48, 0xC1, 0xF8, 0x20 //SAR RAX, 32 ; 高32bit
_EMIT 0x48
_EMIT 0xC1
_EMIT 0xF8
_EMIT 0x20
//db 0xC7, 0x44, 0x24, 0x04, 0x23, 0x00, 0x00, 0x00 //MOV DWORD PTR SS:[RSP+4], 0x23
_EMIT 0xC7
_EMIT 0x44
_EMIT 0x24
_EMIT 0x04
_EMIT 0x23
_EMIT 0x00
_EMIT 0x00
_EMIT 0x00
//db 0x89, 0x1C, 0x24 ///MOV DWORD PTR SS:[RSP], EBX
_EMIT 0x89
_EMIT 0x1C
_EMIT 0x24
//db 0xFF, 0x2C, 0x24 ///JMP FAR FWORD PTR SS:[RSP]
_EMIT 0xFF
_EMIT 0x2C
_EMIT 0x24
x32code:
mov esp, ebp /// 恢复 esp
pop ebp /// 使用局部变量前恢复 ebp
mov a, eax /// 高32位
mov b, ebx
mov c, ecx /// 低32位
pop edx
pop ecx
pop ebx
pop eax
}
WCHAR buffer[64];
swprintf_s(buffer, L"eax = 0x%08X, ecx = 0x%08X", a, c);
MessageBox(0, buffer, L"result", MB_OK);
ExitProcess(0);
return 0;
}