C++ 嵌入 汇编 【救命】 jmp call VirtualAllocEx
#include <stdio.h>#include <stdlib.h>
#include <Windows.h>
#include <tchar.h>
#include <string.h>
void run()
{
printf("HelloWorld!\n");
}
int main()
{
HANDLE hd=GetCurrentProcess();
char* pRemoteThread =(char*) VirtualAllocEx(hd, 0,1024, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
memset(pRemoteThread,0,1024);
if (!WriteProcessMemory(hd,pRemoteThread,&run,1024,0)) {
MessageBox(NULL, "写入主失败 !","Notice", MB_ICONINFORMATION | MB_OK);
return 0;
}
DWORD addr;
sscanf(pRemoteThread, "%x", &addr);
printf("%#x \n",pRemoteThread);
_asm
{
lea eax, RetAddr
push eax
call addr
// jmp run这样可以不过打算不用这种方法
//如何 通过 pRemoteThread 的指针 执行这段代码
RetAddr:
}
printf("Main\n");
while (true);
return 0;
}
/*
char* pRemoteThread =(char*) VirtualAllocEx(hd, 0,1024, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
//如何 用汇编 的jmp 执行 pRemoteThread 里面的内容
_asm{
};
*/// jmp run这样可以不过打算不用这种方法
//如何 通过 pRemoteThread 的指针 执行这段代码
_asm
{
lea eax,Start
jmp eax
}
Start:
printf... 1. 代码的意思我大概看懂了,通过VirtualAllocEx分配内存空间,首地址是pRemoteThread,通过 WriteProcessMemory将run函数内存数据写进pRemoteThread内存区域。
2. 你的代码中引用了一个又做了一层替换,将指向addr,最后通过函数返回地址调用内存数据,是这个过程吧。
3. 直接引用_asm
{
lea eax,pRemoteThread
push eax
ret
}pRemoteThread的话可以酱紫。 我的写的你说的没错,就是你写的_asm 运行不了 wangyonglin 发表于 2014-8-28 18:45
我的写的你说的没错,就是你写的_asm 运行不了
发现我写错了,不过我不确定c++里面的ret可不可以返回地址。_asm
{
lea eax,pRemoteThread
push eax
ret
} 这是我以前在C里面嵌入的汇编,也是用来回调函数的。c++没试过。 哦 ,我头都大了 汇编一点都不懂 你的代码有问题,运行出错。 就是有问题啊 ,不知道怎么解决 这是嵌入式么?怎么和C好像啊 C++ 嵌入 汇编 【救命】 jmp call V wangyonglin 发表于 2014-8-29 09:26
就是有问题啊 ,不知道怎么解决
按你说的jmp run 也不可以的。你得先有一种办法行得通啊,才考虑其他办法啊
页:
[1]