1. 程式人生 > >c++執行緒注入學習

c++執行緒注入學習

原理:

遠端執行緒注入,首先在當前所有執行的程序中找到目標程序,然後將我們的dll的內容寫入目標程序的私有空間中,最後通過關鍵的API:CreateRemoteThread建立執行緒。該執行緒只執行一個任務:loadlibrary載入我們的dll。

具體實現:

1.找到目標
原理簡單,我們首先獲得目前時刻正在執行的程序的列表,然後通過遍歷搜尋,找到列表中我們想要的程序,然後記錄下程序的ID號。
hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
這個函式用來獲得當前程序的快照,就是獲得當前程序的列表啊。

然後通過下面的程式碼按順序遍歷這個列表,通過字串對比,找到我們的目標:notepad.exe。程式碼如下:

DWORD ProcessFind(LPCTSTR Exename) //程序名稱,notepad.exe
{
	HANDLE hProcess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,NULL);
	if (!hProcess)
	{
		return FALSE;
	}
	PROCESSENTRY32 info;
	info.dwSize=sizeof(PROCESSENTRY32);
	if (!Process32First(hProcess,&info))
	{
		return FALSE;
	}
	while(TRUE)
	{
		if (_tcscmp(info.szExeFile,Exename) == 0)
		{
			return info.th32ProcessID;//返回程序的ID
		}
		if (!Process32Next(hProcess,&info))
		{
			return FALSE;
		}
	}
	return FALSE;

}

上面這個程式碼段中關鍵函式分別是Process32First,Process32Next兩個可以沿著列表搜尋的函式還有一個字串對比函式strcmp核對當前搜尋的程序物件的名稱是不是notepad.exe。

2.開啟程序,把我們的dll寫進去!
(1) 獲取目標程序的控制代碼
在上一步獲得目標程序的id後我們就可以開啟程序,然後對程序進行操作。開啟程序如下:
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,TRUE,ProcessID);
引數中的第一個是表明我們在開啟程序的時候想要獲得的許可權,第三個是目標程序的ID。成功開啟後,我們用hProcess存放開啟的控制代碼。控制代碼嘛,大家都懂的,windows裡都是用控制代碼訪問和操作物件的嘛~~

(2)在目標程序記憶體中分配szDllName大小的記憶體
既然要往目標程序的私有空間寫入資料,我們就要先在目標程序中申請和我們的dll一樣大,或者更大的空間。申請如下:

SIZE_T PathSize = (_tcslen(DllPath)+1)*sizeof(TCHAR);
LPVOID StartAddress=VirtualAllocEx(hProcess,NULL,PathSize,MEM_COMMIT,PAGE_READWRITE);
引數中的PathSize是我們想要申請的尺寸,最後一個引數是讀寫許可權。

空間申請好了,空間的首地址用StarAddress存著,然後就可以寫資料了:

WriteProcessMemory(hProcess,StartAddress,DllPath,PathSize,NULL)
這個沒啥好解釋的,就是一個寫記憶體的API。

至此在目標程序中已經有了我們dll邪惡的身影,最後當然是讓目標程序載入我們的dll。

(3)獲取LoadLibraryW() API的地址

PTHREAD_START_ROUTINE pfnStartAddress =(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(_T("kernel32.dll")),"LoadLibraryW");<strong>
</strong>
(4)在notepad.exe程序中執行執行緒
HANDLE hThread=CreateRemoteThreadEx(hProcess,NULL,NULL,pfnStartAddress,StartAddress,NULL,NULL,NULL);
(5)關閉執行緒和程序
WaitForSingleObject(hThread,INFINITE);
CloseHandle(hThread);
CloseHandle(hProcess);
總結注入流程:

依次使用以下函式:
OpenProcess//獲取已知程序的控制代碼
VirtuallAllocEx//在程序中申請空間
WriteProcessMemory //向程序中寫入東西
GetProcessAddress  //取得函式在DLL中的地址
CreateRemoteThreadEx//在其他程序中建立新程序
CloseHandle //關閉控制代碼
完成執行緒的注入


相關推薦

c++執行注入學習

原理: 遠端執行緒注入,首先在當前所有執行的程序中找到目標程序,然後將我們的dll的內容寫入目標程序的私有空間中,最後通過關鍵的API:CreateRemoteThread建立執行緒。該執行緒只執行一個任務:loadlibrary載入我們的dll。 具體實現: 1.找到

C++ 多執行pthread 學習筆記

本篇是我在學習C++多執行緒的時候做的筆記,主要記錄的是基礎的流程,部分程式碼例項,以及重點函式的說明。 pthread 入口函式型別說明 void * func1(void * t) void* 表示無型別指標 void*作為函式引數,表示函式接收一個指標,不管是什麼型別

C++多執行程式設計學習(1)】-CPU個數、CPU核心數、CPU執行

轉自:CPU個數、CPU核心數、CPU執行緒數(by kimsimple)   CPU個數即CPU晶片個數。 CPU核心數是指物理上,也就是硬體上存在著幾個核心。比如,雙核就是包括2個相對獨立的CPU核心單元組,四核就包含4個相對獨立的CPU核心單元組。 CPU執行緒數是一

C# 如何解決程式卡頓的問題(多執行初步學習

在編寫程式的時候,有時候難免會出現後臺執行時間過長的問題,這個時候就要考慮多執行緒的操作了。 正文 不帶引數的多執行緒實現 第一步 建立控制檯應用 第二步 引用System.Threading.Thread using System.Threading;

C++:多執行程式設計學習:利用多執行進行歸併排序。

首先學習一下簡單的執行緒知識 :(1)pthread_join函式,用來阻塞當前的執行緒。直到指定執行緒結束。 :(2)pthread_create,用來建立執行緒。 下面的程式碼開了五個執行緒用來輸出一個函式。 #include <pth

C#中執行學習

        程序是作業系統中作為資源擁有的基本單位。執行緒作為系統排程和分派的基本單位。一個程式在執行時大多都只開闢一個程序,一個程序可以包含有一個或多個執行緒。執行緒是程序中的基本執行流,每個執行緒都有自己專屬的暫存器(程式計數器,棧指標等),共享程序中的資源,不同的

C++多執行程式設計學習

1、執行緒的基本概念、執行緒的基本狀態及狀態之間的關係。 (1)執行緒的概念  -------1) 執行緒最直接的理解就是“輕量級程序”,它是一個基本的CPU執行單元,也是程式執行流的最小單位,由執行緒ID、程式計數器、暫存器集合和堆疊組成。  -------2)

c++執行學習5等待函式

WaitForSingleObject的用法  WaitForSingleObject的用法DWORD WaitForSingleObject(  HANDLE hHandle,  DWORD dwMilliseconds);引數hHa

C#執行系列講座(1):BeginInvoke和EndInvoke方法

開發語言:C#3.0 IDE:Visual Studio 2008 本系列教程主要包括如下內容:1.  BeginInvoke和EndInvoke方法 2.  Thread類 3. 執行緒池 4. 執行緒同步基礎 5. 死鎖 6. 執行

執行+JAVA學習筆記-DAY24

24.01_多執行緒(多執行緒的引入)(瞭解) 1.什麼是執行緒 執行緒是程式執行的一條路徑, 一個程序中可以包含多條執行緒 多執行緒併發執行可以提高程式的效率, 可以同時完成多項工作 2.多執行緒的應用場景 紅

執行的弊端,多執行基礎學習

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using

Pthread執行基礎學習

後面會嘗試使用冰搜和goole搜尋來學習技術,網際網路上知識的學習也是符合二八定律的,既然如此,我們何不去選擇最好的文章呢。 文章參考: https://randu.org/tutorials/threads/ http://www.yolinux.com/TUTORIALS/L

遠端執行注入RemoteThread(dll)

// RemoteInject.h #pragma once // RemoteInject 對話方塊 class RemoteInject : public CDialogEx { DECLARE_DYNAMIC(RemoteInject) public: RemoteInject(

C#】C#執行_I/O限制的非同步操作

目錄結構: contents structure [+] 為什麼需要非同步IO操作 C#的非同步函式 async和await的使用 非同步函式的狀態機 非同步函式如何轉化為狀態機 如何擴充套件非

執行學習與總結

單執行緒:        只有一個順序執行流        例如:單執行緒的程式如同只僱傭一個服務員的餐廳,他必須做完一件事情後才可以做下一件事情; 多執行緒:        可以

聊聊C++執行同步機制

  執行緒同步是一個經常出現的場景,考慮一個生產者消費者模式,一個執行緒作為生產,一個執行緒作為消費。生產者往一個佇列中加入元素,消費者往一個佇列中取元素。實現對一個公共區域的同時訪問操作,是C++多執行緒經常會遇到的問題,所以C++提供了執行緒同步的機制。   1.消費者輪

執行學習1(常見簡單方法)

程序&執行緒 程序:執行中的應用程式稱為程序,擁有系統資源(cpu,記憶體) 執行緒:程序中的程式片段,一個程序中可以有多個程式片段。本身不單獨擁有資源(共享所在程序的資源) 並行&併發 並行:兩個任務同時進行。真正意義上的同時進行

執行深入學習及面試解決思路

課程目標 執行緒與程序區別 為什麼要使用多執行緒? 多執行緒應用場景? 多執行緒建立方式 獲取執行緒物件以及名稱 守護執行緒 多執行緒執行狀態 join()方法作用 多執行緒分批處理資料 作業題 面試題 備註單詞 執行緒與程序區別

C#執行--5.0之前時代(二)、執行的同步

執行緒同步 說明:接上一篇,注意分享執行緒同步的必要性和執行緒同步的方法。 一、什麼是執行緒同步: 在同一時間只允許一個執行緒訪問資源的情況稱為執行緒同步。 二、為什麼需要執行緒同步: 避免競爭條件; 確保執行緒安全;(如果兩個執行緒同時訪問一個資源並對那個資源做修改,就不安全了)

歸納一下:C#執行同步的幾種方法

 我們在程式設計的時候,有時會使用多執行緒來解決問題,比如你的程式需要在後臺處理一大堆資料,但還要使使用者介面處於可操作狀態;或者你的程式需要訪問一些外部資源如資料庫或網路檔案等。這些情況你都可以建立一個子執行緒去處理,然而,多執行緒不可避免地會帶來一個問題,就是執行緒同步的問題。如果這個問題處理不好,我們就