嗨大家好我是Andy,距離鐵人賽完賽剩9天了,好想直接把剩下的稿都備一備,這樣每天只要複製、貼上就好哈哈哈哈,過懶人生活,好了今天我們要繼續DLL強制卸載,廢話不多說直接叫上我們用三天的程式碼。
#include <Windows.h>
#include <stdio.h>
#include <iostream>
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);
}
void uninjectDLL(int PID) {
HANDLE HHmodule = OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
LPVOID pReturnAddress = (LPVOID)0x7FF748EF0000;
HANDLE HHTread = CreateRemoteThread(HHmodule, NULL, 0, (LPTHREAD_START_ROUTINE)0x7FFA0848BD00, pReturnAddress, 0, NULL);
WaitForSingleObject(HHmodule, 2000);
CloseHandle(HHTread);
CloseHandle(HHmodule);
}
int main() {
uninjectDLL(20376);
return 0;
}
今天的程式碼可能會改變一點,上面的是我們的inject部分我們暫時先不要理,但為了做比對我還是把他放上來了哈哈哈。
首先我們今天多出了兩行,然後上面的東西也有改一點。
這很字面上的意思就是我們執行完後再將他線程關閉,做一個確保的動作
這個是讓某個執行緒先做完了在繼續做其他事情在這邊簡單做個介紹
格式長這樣DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
有兩個函數分別是HANDLE和Timeout
前面的當然就是句柄,那後面的時間(毫秒),當然如果想無限等下去的話也可以指定系統常量
這兩個函數都可以用來優化
然後可以先去工作管理員找一個程式將他的Pid打到程式碼上
在用CE去找要關甚麼DLL
最後在去Kernel32.dll這個DLL找他的FreeLibrary
也可以使用上面的寫法 下面的比較簡略不過我個人覺得有點亂
今天的話就先到這裡了,最近的事情多到不得了,我決定接下來到雙十節前都要用這張圖,我們明天見。