代码注入之远程调用线程的一些问题
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这种形式,当然不是我们的本意.