程式碼注入之遠端呼叫執行緒的一些問題

AlwaysBetter發表於2019-05-26

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這種形式,當然不是我們的本意.

 

相關文章