今天是第十二天,之前提到了一下今天實作需要的函數,我們今天就正式遠程注入DLL到exe裡面吧,費話不多說直接開始。
首先我們需要一個一直執行不會跑掉的exe檔,因為像是之前使用的只要按MessageBox按確定就會立刻跳掉,所以我想到了一個辦法,就是使用 While(cin>>a)
當數字等於某個的時候才會調用Dll (因為我不會寫C++的按鈕 我就爛!) ,以下是程式碼
#include <windows.h>
#include <iostream>
typedef void (*ccc)();
int main() {
int b;
while (std::cin >> b) {
if (b == 2) {
HMODULE hmodule = LoadLibrary("Dll5.dll");
if (hmodule == NULL) {
MessageBox(NULL, "沒有抓到DLL", "標題", MB_OK);
return -1;
}
ccc a = (ccc)GetProcAddress(hmodule, "ccc");
a();
}
}
}
這邊的程式碼就不介紹了我們直接跳到遠端注入Dll的程式碼
#include <Windows.h>
void inject(int PID,char* Path){
//獲取進程句柄
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
//申請一個記憶體給Path
LPVOID Return = VirtualAllocEx(hProcess, NULL, strlen(Path) + 1, MEM_COMMIT, PAGE_READWRITE);
//寫入到VirtualAllocEx申請的記憶體內
WriteProcessMemory(hProcess, Return, Path, strlen(Path) + 1, NULL);
//LoadLibrary的函數庫
HMODULE hModule = LoadLibrary("Kernel32.dll");
LPTHREAD_START_ROUTINE lpStartAddress = LPTHREAD_START_ROUTINE(GetProcAddress(hModule, "LoadLibraryA"));
CreateRemoteThread(hProcess, NULL, 0, lpStartAddress,Return, 0, NULL);
}
int main() {
const char* p = "D:\\鐵人賽DLL\\Dll5\\Debug\\Dll5.dll";
inject(26340, (char*)p);
return 0;
}
我們先來簡單介紹一下inject裡面有兩個函數(PID,以及Path)
前面我們提到需要一個exe一直開著,所以將exe開著之後到工作管理員的詳細資料去看PID再將他打進去,這邊需要注意幾點,程式每次重開系統分配的PID都不一樣,所以每重開一次注入這邊的PID就需要更改。
這邊是想要注入DLL的路徑,路徑為甚麼要使用兩個\?因為這邊主要是怕compiler讀錯 (如果沒說錯的話) 還望其他大大指點
所以在這裡的exe檔案內就不會有dll5.dll
這邊提一下LoadLibrary這個函數是可以使用絕對路徑去呼叫Dll的,也就是說為甚麼許多遊戲都會將dll放在別的地方而不是全部堆在一個地方,這邊我猜想的話應該是使用絕對路徑去索引
今天第一次使用遠程注入DLL,對DLL的理解又更加深入了,最近都好忙忙到沒有時間備稿,每天都要打一篇,來人啊給我一個備稿機器,我們明天見。