原作者連線
提權方法
64位的一定要生成64的,網上說32和64記憶體隔開的。
//注入程式
#include "stdafx.h"
#include "remote injection.h"
#include "tlhelp32.h"
using
namespace
std;
extern
int listprocess();
extern
int enabledebugpriv(const wchar *);
int _tmain(int argc, tchar *argv, tchar *env)
//呼叫openprocess()獲得控制代碼
handle hremoteprocess;
if ((hremoteprocess = openprocess(process_all_access, false, dwremoteprocessid)) == null)
//在遠端程序中分配記憶體,準備拷入dll路徑字串
//取得當前dll路徑
char dllpath[260]; //windows路徑最大為
getcurrentdirectorya(260, dllpath); //獲取當前程序執行目錄
printf("proces***e directory is %s\n", dllpath);
strcat(dllpath, "\\..\\debug\\mydll.dll"); //鏈結到dll路徑
lpvoid premotedllpath = virtualallocex(hremoteprocess, null, strlen(dllpath) + 1, mem_commit, page_readwrite);
if (premotedllpath == null)
//向遠端程序空間中寫入dll路徑字串
printf("dllpath is %s\n", dllpath);
dword size;
if (writeprocessmemory(hremoteprocess, premotedllpath, dllpath, strlen(dllpath) + 1, &size) == null)
printf("writerrmoyrprocess size is %d\n\n", size);
//獲得遠端程序中loadlibrary()的位址
lpthread_start_routine ploadlibrary = (lpthread_start_routine)getprocaddress(getmodulehandle(text("kernel32.dll")), "loadlibrarya");
if (ploadlibrary == null)
else
//啟動遠端執行緒
dword dwthreadid;
handle hthread;
hthread = createremotethread(hremoteprocess, null, 0, ploadlibrary, premotedllpath, 0, &dwthreadid);
if (hthread == null)
else
//釋放分配記憶體
if (virtualfreeex(hremoteprocess, premotedllpath, 0, mem_release) == 0)
//釋放控制代碼
if (hthread != null) closehandle(hthread);
if (hremoteprocess != null) closehandle(hremoteprocess);
system("pause");
return0;}
int listprocess()
//建立單個程序快照結構體,初始化大小
processentry32 pe32;
pe32.dwsize = sizeof(processentry32); //務必提前初始化,否則預設的大小不一定滿足要求
//初始化緩衝區
wchar buff[1024] = ; //processentry32中的szexefile為wchar型別陣列,此處應一致,使用unicode碼
//列舉系統快照鍊錶中的第乙個程序專案
bool bprocess = process32first(hprocesssnap, &pe32);
while (bprocess)
closehandle(hprocesssnap);
return0;}
int enabledebugpriv(const wchar *name)
//獲得本地程序name所代表的許可權型別的區域性唯一id
if (!lookupprivilegevalue(null, name, &luid))
tp.privilegecount = 1; //許可權陣列中只有乙個「元素」
tp.privileges[0].attributes = se_privilege_enabled; //許可權操作
tp.privileges[0].luid = luid; //許可權型別
//調整程序許可權
if (!adjusttokenprivileges(htoken, 0, &tp, sizeof(token_privileges), null, null))
return
0;}
//dll
// mydll.cpp : 定義 dll 的初始化例程。
//#include
"stdafx.h"
#include
"mydll.h"
#ifdef _debug
#define
new debug_new
#endif
////todo: 如果此 dll 相對於 mfc dll 是動態鏈結的,
// 則從此 dll 匯出的任何調入
// mfc 的函式必須將 afx_manage_state 巨集新增到
// 該函式的最前面。
//// 例如:
//// extern "c" bool pascal export exportedfunction()
//
//// 此巨集先於任何 mfc 呼叫
// 出現在每個函式中十分重要。 這意味著
// 它必須作為函式中的第乙個語句
// 出現,甚至先於所有物件變數宣告,
// 這是因為它們的建構函式可能生成 mfc
// dll 呼叫。
//// 有關其他詳細資訊,
// 請參閱 mfc 技術說明 33 和 58。
//end_message_map()
void test(cstring text);
void test(cstring text)
注入系列 遠端執行緒注入
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...