1. threadfunc應該定義成static,不能是全域性函式。如果是全域性函式,只能取到jmp threadfunc這塊**的位址。
2. 在除錯模式會使寫函式資料時資料出錯。
下午就被這兩個東西浪費了乙個多小時。
推薦兩篇有用的內容:
// injecttoremoteprocess.cpp : 定義應用程式的入口點。
//#include "stdafx.h"
#include "injecttoremoteprocess.h"
#define max_loadstring 100
// 全域性變數:
hinstance hinst; // 當前例項
tchar sztitle[max_loadstring]; // 標題欄文字
tchar szwindowclass[max_loadstring]; // 主視窗類名
// 此**模組中包含的函式的前向宣告:
atom myregisterclass(hinstance hinstance);
bool initinstance(hinstance, int);
lresult callback wndproc(hwnd, uint, wparam, lparam);
int_ptr callback about(hwnd, uint, wparam, lparam);
int_ptr callback inject(hwnd hdlg, uint message, wparam wparam, lparam lparam);
int apientry _twinmain(hinstance hinstance,
hinstance hprevinstance,
lptstr lpcmdline,
int ncmdshow)
hacceltable = loadaccelerators(hinstance, makeintresource(idc_injecttoremoteprocess));
// 主訊息迴圈:
while (getmessage(&msg, null, 0, 0)) }
return (int) msg.wparam;}//
// 函式: myregisterclass()
//// 目的: 註冊視窗類。
//// 注釋:
//// 僅當希望
// 此**與新增到 windows 95 中的「registerclas***」
// 函式之前的 win32 系統相容時,才需要此函式及其用法。呼叫此函式十分重要,
// 這樣應用程式就可以獲得關聯的
// 「格式正確的」小圖示。
//atom myregisterclass(hinstance hinstance)
//// 函式: initinstance(hinstance, int)
//// 目的: 儲存例項控制代碼並建立主視窗
//// 注釋:
//// 在此函式中,我們在全域性變數中儲存例項控制代碼並
// 建立和顯示主程式視窗。
//bool initinstance(hinstance hinstance, int ncmdshow)
showwindow(hwnd, ncmdshow);
updatewindow(hwnd);
return true;}//
// 函式: wndproc(hwnd, uint, wparam, lparam)
//// 目的: 處理主視窗的訊息。
//// wm_command - 處理應用程式選單
// wm_paint - 繪製主視窗
// wm_destroy - 傳送退出訊息並返回
////
lresult callback wndproc(hwnd hwnd, uint message, wparam wparam, lparam lparam)
break;
case wm_paint:
hdc = beginpaint(hwnd, &ps);
// todo: 在此新增任意繪圖**...
endpaint(hwnd, &ps);
break;
case wm_destroy:
postquitmessage(0);
break;
default:
return defwindowproc(hwnd, message, wparam, lparam);
} return 0;
}// 「關於」框的訊息處理程式。
int_ptr callback about(hwnd hdlg, uint message, wparam wparam, lparam lparam)
break;
} return (int_ptr)false;
}struct procstruct
;static dword __stdcall threadfunc(procstruct * pps)
static dword __stdcall offsetfunc(lpvoid* pparam)
bool adjustprocesstokenprivilege()
if(!lookupprivilegevalue(null, se_debug_name, &luidtmp))
tkp.privilegecount = 1;
tkp.privileges[0].luid = luidtmp;
tkp.privileges[0].attributes = se_privilege_enabled;
if(!adjusttokenprivileges(htoken, false, &tkp, sizeof(tkp), null, null))
return true;
}dword injectfunctiontoprocess(dword dwprocessid)
hmodule huser32 = getmodulehandle(_t("user32.dll"));
if (hprocess == null)
farproc msgaddr = getprocaddress(huser32,"messageboxw");
procstruct ps;
ps.msgaddr =msgaddr;
_tcscpy(ps.strmsg,_t("this is message!"));
_tcscpy(ps.strtitle,_t("title"));
//開闢儲存變數的記憶體空間
void * pmemprocstruct = virtualallocex(hprocess,null,sizeof(procstruct),mem_commit,page_readwrite);
if (!pmemprocstruct)
//複製引數內容
if (!writeprocessmemory(hprocess,pmemprocstruct,&ps,sizeof(procstruct),null))
//開闢儲存呼叫函式的空間
dword funclen = (dword)offsetfunc - (dword)threadfunc;
void * pmemfunction = virtualallocex(hprocess,null,funclen,mem_commit|mem_reserve,page_execute_readwrite);
if (!pmemfunction)
//複製函式內容
if (!writeprocessmemory(hprocess,pmemfunction,threadfunc,funclen,null))
//啟動執行緒函式注入程序
handle hremotethread = createremotethread(hprocess,null,null,(lpthread_start_routine)pmemfunction,pmemprocstruct,null,null);
if (!hremotethread)
//等待執行緒結束
waitforsingleobject(hremotethread,infinite);
//釋放引數內容
virtualfreeex(hprocess,pmemprocstruct,sizeof(procstruct),mem_release);
//釋放函式內容
virtualfreeex(hprocess,pmemfunction,funclen,mem_release);
} catch (...)
return 0;
}// 「注入」框的訊息處理程式。
int_ptr callback inject(hwnd hdlg, uint message, wparam wparam, lparam lparam)
else if (loword(wparam) == idok)
if (!injectfunctiontoprocess(dwprocessid))
else
}break;
} return (int_ptr)false;
}
注入系列 遠端執行緒注入
1.使用程序pid開啟程序,獲得控制代碼 2.使用程序控制代碼申請記憶體空間 3.把dll路徑寫入記憶體 4.建立遠端執行緒,呼叫loadlibrary 5.釋放收尾工作或者解除安裝dll 實現 bool cinjectdlg zwcreatethreadexinjectdll dword dwpr...
執行緒遠端注入
執行緒遠端注入的技術並不複雜,主要用到createremotethread這個api。難點有個地方,由於要注入其他程序的空間,因此,注入用的那個執行緒中的 必須使用和被注入程序的記憶體空間一致。換句話講,就是需要找到執行緒中使用的函式在遠端程序中的位址。明白這個,問題就沒有了。下面是乙個完整的執行緒...
遠端注入DLL
ool cinject injectdll char m path,dword m id 如果開啟程序成功,則在該程序中開闢記憶體空間 this m baseaddress virtualallocex m handle,null,1024,mem commit,page execute readw...