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