C++ 远程注入内联汇编代码,要申请的空间怎么计算呢?
VirtualAllocEx(prochandle,NULL,1024*4,MEM_COMMIT,PAGE_EXECUTE_READWRITE)
WriteProcessMemory(prochandle,baseaddr,&usecall,1024*4,NULL))
比如上面的usecall 是一个函数,怎么知道注入这个函数需要的空间是多大啊
[解决办法]
一般可以稍稍大一点,如4k(WIN32最小页面大小)
[解决办法]
嗯,不过还有个问题就是,在Debug版本有误,我反汇编看了偏移没问题,也不知道是为什么,Release版没有问题)。
[解决办法]
仅供参考
//仅对VC6#include <stdio.h>void fun1() { int f1=1; printf("fun1\n"); printf("fun1\n");}void fun2() { int f2=2; printf("fun2\n");}void fun3() {}void main() {#ifdef _DEBUG printf("sizeof(fun1)==%d\n",*(int *)((int)fun2+1)-*(int *)((int)fun1+1)); printf("sizeof(fun2)==%d\n",*(int *)((int)fun3+1)-*(int *)((int)fun2+1));//sizeof(fun1)==59//sizeof(fun2)==43#else printf("sizeof(fun1)==%d\n",(int)fun2-(int)fun1); printf("sizeof(fun2)==%d\n",(int)fun3-(int)fun2);//sizeof(fun1)==32//sizeof(fun2)==16#endif}
[解决办法]
如果你的汇编码是asm文件中,那么前后加两个标签,然后相减
如果是inline asm
也可以放标签,但是标签的地址需要用inline asm获得
[解决办法]
__declspec(naked) void remoteFun(){
__asm{
//....
}
}
__declspec(naked) void remoteFun_end(){
}
size =(DWORD)((LPVOID)remoteFun_end-(LPVOID)removeFun);
debug版的栈检查代码在远程线程运行会造成非法,必须用release版,要调试的话可以关掉优化,打开调试信息(编译和连接里面都有)
[解决办法]
一些编译器有特殊的宏,可以计算函数的大小.
不支持这个功能的编译器可以通过一个dummy函数地址和你的函数地址相减的办法.但这要保证两个函数是连续排布的.
最安全的办法是把函数的大小通过obj解析出来,然后写在代码里.稍微麻烦一点,不过自己写个工具,可以自动完成这个事.