vs2019里写代码注入,本来用裸函数写的就像这样:
1 __declspec(naked) void myput() 2 { 3 { 4 __asm 5 { 6 pushad 7 push - 1 //未知,恒为-1 8 push 2 //ID 9 mov eax, 0 //坐标x 10 push 0 //坐标y 11 mov ebx, ds:[0x6A9EC0] 12 mov ebx, ds:[ebx + 0x768] 13 push ebx 14 mov edx, 0x40D120 15 call edx 16 popad 17 ret 18 } 19 } 20 }
但是当我想给这个函数传入一些参数的时候就不得不抛弃裸函数,用
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
DWORD _id = ((ppara)lpParameter)->id;
DWORD _pos_x = ((ppara)lpParameter)->pos_x;
DWORD _pos_y = ((ppara)lpParameter)->pos_y;
__asm
{
pushad
push -1 //未知,恒为-1
push _id //ID
mov eax, _pos_x //坐标x
push _pos_y //坐标y
mov ebx, ds:[0x6A9EC0]//必须加ds这是vs内嵌汇编的规定
mov ebx, ds:[ebx + 0x768]//同上
push ebx
mov edx, 0x40D120
call edx
popad
}
return 0;
}
这种远程线程回调函数写,可是这样一写,原程序一直崩溃,一直找不到原因,后来看到了一个帖子,去od里看了看它写入的代码,发现问题出在vs2019的几个编译选项里了如下:
把安全检查与基本运行检查给关了,因为这俩会在生成的函数尾加入几个call,而这几个call是检查堆栈平衡之类的,但是注入到目标进程后,目标进程里并没有着几个call的实际代码就会出错
还有一点就是,vs内嵌汇编的时候,mov eax,[0xxxxxx]这种汇编代码必须写成 mov eax,ds:[0xxxxx]这种形式,否则vs编译的时候就会编译成 mov eax,0xxxxx这种形式,当然不是我们的本意.