遠端注入執行函式

2021-08-27 09:31:39 字數 4639 閱讀 3394

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...