iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 21
0
Software Development

闖入DLL的世界 DLL我要進來了哦系列 第 21

第二十一天:DLL強制卸載(下)

  • 分享至 

  • xImage
  •  

嗨大家好我是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部分我們暫時先不要理,但為了做比對我還是把他放上來了哈哈哈。


首先我們今天多出了兩行,然後上面的東西也有改一點。

CloseHandle

這很字面上的意思就是我們執行完後再將他線程關閉,做一個確保的動作

WaitForSinglObject

這個是讓某個執行緒先做完了在繼續做其他事情在這邊簡單做個介紹
格式長這樣DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
有兩個函數分別是HANDLE和Timeout
前面的當然就是句柄,那後面的時間(毫秒),當然如果想無限等下去的話也可以指定系統常量

這兩個函數都可以用來優化


然後可以先去工作管理員找一個程式將他的Pid打到程式碼上
在用CE去找要關甚麼DLL
最後在去Kernel32.dll這個DLL找他的FreeLibrary
也可以使用上面的寫法 下面的比較簡略不過我個人覺得有點亂

結語

今天的話就先到這裡了,最近的事情多到不得了,我決定接下來到雙十節前都要用這張圖,我們明天見。


上一篇
第二十天:前十天統結
下一篇
第二十二天:整理一下目前來有使用過的函數
系列文
闖入DLL的世界 DLL我要進來了哦30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言