代码注入之远程调用线程的一些问题

Posted fanwenke

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了代码注入之远程调用线程的一些问题相关的知识,希望对你有一定的参考价值。

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这种形式,当然不是我们的本意.

 

以上是关于代码注入之远程调用线程的一些问题的主要内容,如果未能解决你的问题,请参考以下文章

远程线程注入

远程线程的注入 PE的修正

远程线程DLL注入, 如何释放DLL和结束DLL的线程

远程线程注入是一种把代码注入到其他进程执行的行为,木马通常利用此技术隐藏自己

远程线程注入代码

ReflectiveLoader分析(远程线程注入 PE修正)