以下示例是Delphi代碼。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,tlhelp32;
type
TForm1 = class(TForm)
Button3: TButton;
Edit1: TEdit;
Label1: TLabel;
procedure Button3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
{ 列舉進程 }
procedure GetMyProcessID(const AFilename: string; const PathMatch: Boolean; var ProcessID: DWORD);
var
tpe: TProcessEntry32;
SsHandle: Thandle;
FoundAProc, FoundOK: boolean;
begin
ProcessID :=0;
{ 創建系統快照 }
SsHandle := CreateToolhelp32Snapshot(TH32CS_SnapProcess, 0);
{ 取得快照中的第一個進程 }
{ 一定要設定結構的大小,否則將返回False }
tpe.dwSize := sizeof(TProcessEntry32);
FoundAProc := Process32First(Sshandle, tpe);
while FoundAProc do
begin
{ 進行匹配 }
if PathMatch then
FoundOK := AnsiStricomp(tpe.szExefile, PCHAR(AFilename)) = 0
else
FoundOK := AnsiStricomp(PChar(ExtractFilename(tpe.szExefile)), PChar(ExtractFilename(AFilename))) = 0;
if FoundOK then
begin
ProcessID := tpe . th32ProcessID;
break;
end;
{ 未找到,繼續下一個進程 }
FoundAProc := Process32Next(SsHandle, tpe);
end;
CloseHandle(SsHandle);
end;
{ 設定許可權 }
function EnabledDebugPrivilege(const Enabled : Boolean) : Boolean;
var
hTk : THandle; { 打開令牌句柄 }
rtnTemp : Dword; { 調整許可權時返回的值 }
TokenPri : TOKEN_PRIVILEGES;
const
SE_DEBUG = 'SeDebugPrivilege'; { 查詢值 }
begin
Result := False;
{ 獲取進程令牌句柄,設定許可權 }
if (OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,hTk)) then
begin
TokenPri.PrivilegeCount := 1;
{ 獲取LUID值 }
LookupPrivilegeValue(nil,SE_DEBUG,TokenPri.Privileges[0].Luid);
if Enabled then
TokenPri.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
TokenPri.Privileges[0].Attributes := 0;
rtnTemp := 0;
{ 設定新的許可權 }
AdjustTokenPrivileges(hTk,False,TokenPri,sizeof(TokenPri),nil,rtnTemp);
Result := GetLastError = ERROR_SUCCESS;
CloseHandle(hTk);
end;
end;
{ 注入遠程進程 }
function InjectTo(const Host, Guest: string; const PID: DWORD = 0): DWORD;
var
{ 被注入的進程句柄,進程ID}
hRemoteProcess: THandle;
dwRemoteProcessId: DWORD;
{ 寫入遠程進程的內容大小 }
memSize: DWORD;
{ 寫入到遠程進程後的地址 }
pszLibFileRemote: Pointer;
iReturnCode: Boolean;
TempVar: DWORD;
{ 指向函式LoadLibraryW的地址 }
pfnStartAddr: TFNThreadStartRoutine;
{ dll全路徑,需要寫到遠程進程的記憶體中去 }
pszLibAFilename: PwideChar;
begin
Result := 0;
{ 設定許可權 }
EnabledDebugPrivilege(True);
{ 為注入的dll檔案路徑分配記憶體大小,由於為WideChar,故要乘2 }
Getmem(pszLibAFilename, Length(Guest) * 2 + 1);
StringToWideChar(Guest, pszLibAFilename, Length(Guest) * 2 + 1);
{ 獲取進程ID }
if PID > 0 then
dwRemoteProcessID := PID
else
GetMyProcessID(Host, False, dwRemoteProcessID);
{ 取得遠程進程句柄,具有寫入許可權}
if(dwRemoteProcessID<=0 ) then begin
ShowMessage('沒找到進程');
exit;
end;
hRemoteProcess := OpenProcess(PROCESS_CREATE_THREAD + {允許遠程創建執行緒}
PROCESS_VM_OPERATION + {允許遠程VM操作}
PROCESS_VM_WRITE, {允許遠程VM寫}
FALSE, dwRemoteProcessId);
{ 用函式VirtualAllocEx在遠程進程分配空間,並用WriteProcessMemory中寫入dll路徑 }
memSize := (1 + lstrlenW(pszLibAFilename)) * sizeof(WCHAR);
pszLibFileRemote := PWIDESTRING(VirtualAllocEx(hRemoteProcess, nil, memSize, MEM_COMMIT, PAGE_READWRITE));
TempVar := 0;
iReturnCode := WriteProcessMemory(hRemoteProcess, pszLibFileRemote, pszLibAFilename, memSize, TempVar);
if iReturnCode then
begin
pfnStartAddr := GetProcAddress(GetModuleHandle('Kernel32'), 'LoadLibraryW');
TempVar := 0;
{ 在遠程進程中啟動dll }
Result := CreateRemoteThread(hRemoteProcess, nil, 0, pfnStartAddr, pszLibFileRemote, 0, TempVar);
end;
{ 釋放記憶體空間 }
Freemem(pszLibAFilename);
end;
{ 測試 }
procedure TForm1.Button3Click(Sender: TObject);
begin
InjectTo(edit1.Text, extractfilepath(paramstr(0))+'d.dll');
end;
end.
相關詞條
-
遠程執行緒注入
遠程執行緒插入(注入)技術指的是通過在另一個進程中創建遠程執行緒的方法進入目標進程的記憶體地址空間。將木馬程式以DLL的形式實現後,需要使用插入到目標進程中的...
360安全衛士遠程執行緒注入解決方案 -
注入
所謂的SQL(結構化查詢語言)注入,簡單來說就是利用SQL語句在外部對SQL資料庫進行查詢,更新等動作。首先,資料庫作為一個網站最重要的組件之一(如果這...
基本信息 經濟學 編程相關 -
dll注入
所謂DLL 注入就是將一個DLL放進某個進程的地址空間裡,讓它成為那個進程的一部分。要實現DLL注入,首先需要打開目標進程。
-
鉤子注入
鉤子注入,即遠程執行緒插入(注入)技術,指的是通過在另一個進程中創建遠程執行緒的方法進入目標進程的記憶體地址空間。
技術簡介 原理機制 -
《windows核心編程》(Windows Via C/C++)掃描版
icode2.1 icode2.3 dles4.2.3
基本信息 內容簡介 作者簡介 目錄 -
Windows核心編程
銷毀執行緒;如何通過I/O完成連線埠執行同步和異步設備I/O操作;如何使用虛擬記憶體、記憶體映射檔案和堆之類的各種技術來分配記憶體;如何處理默認調撥的執行緒棧物理存儲;如何為延遲載入、API攔截和進程注入構建DLL;如何使用...
編輯推薦 目錄 內容簡介 作者簡介 譯者序 -
經典重讀·Windows核心編程
實現機制、Windows應用程式的基本構件(包括進程、執行緒、記憶體管理、動態程式庫、執行緒本地存儲和Unicode)以及各類Windows API... 4.3 進程的終止 4.3.1 主執行緒的入口函式返回...
圖書信息 作者簡介 內容簡介 目錄 -
XueTr
大部分功能不能使用,如果有攔截請通過4.如檢測到執行緒注入XueTr將會...、CheckInjectThread欄位:決定XT啟動的時候是否檢測有執行緒注入到XT中...的測試,但還是難免有疏忽的地方功能1.進程、執行緒、進程模組、進程視窗、進程...
工具概述 功能 顏色 配置檔案 更新 -
Windows核心編程精講
3 終止進程 4 3 1 主執行緒的入口點函式返回 4 3 2... terminateprocess函式 4 3 4 當進程中的所有執行緒終止時 4 3 5...放入作業中 5 3 終止作業中的所有執行緒查詢作業統計信息 5 4...
基本信息 編輯推薦 內容簡介 作譯者 目錄