前言
几乎
所有的程序
都需要这个指令,寄存器
里面一开始它是没有值
的
0x1 语法格式:
MOV 目标 ,源
目标:可以是内存地址或者寄存器
源:可以是立即数、内存地址或者寄存器
mov指令
C++代码
gi = 0x12345678;
汇编指令
mov dword ptr ds:[001202DCh],12345678h
机器指令
00115718 C7 05 DC 02 12 00 78 56 34 12
提出问题
- 内存00AB02DCh真的是gi的地址吗?
- mov指令真的存放在地址为00115718内存中吗?
发现规律
计算机上表示的整数在内存中是按字节倒序存储的
知识点:大小端存储方式(Intel计算机是小端机)
结论:指令就是一些字节的组合
提出问题:我们可以自己构建指令来执行吗?
#include <iostream>
#include <Windows.h>
int gi{};
void* address;
void* buildCode();
int main() {
void* codeAdr = buildCode();
_asm mov address, offset _adr;
DWORD oldProtect{};
VirtualProtect(codeAdr, 16, PAGE_EXECUTE_READWRITE, &oldProtect);
gi = 1;
printf("gi = %d\n", gi);
_asm jmp codeAdr;
gi = 13;
_adr:
printf("gi = %d\n", gi);
getchar();
}
void* buildCode()
{
char* code = (char*)malloc(16);
char* pMov = (char*)code;
char* pJmp = (char*)code + 10;
char* pAddress = pMov + 2;
//C7 05 B0 00 94 00 01 00 00 00
pMov[0] = 0xC7;
pMov[1] = 0x05;
*((int*)pAddress) = (int)&gi;
*((int*)(pAddress + 4)) = 2;
//FF 25 88 01 7B 00
pJmp[0] = 0xFF;
pJmp[1] = 0x25;
*((int*)(&pJmp[2])) = (int)&address;
return code;
}