windows 下,把 dll 注入某个进程,直接代码。
my_dll.h
#ifndef __my_dll_h__ #define __my_dll_h__ #include <Windows.h> #ifdef DLL_EXPORT #define DLLAPI __declspec(dllexport) #else #define DLLAPI __declspec(dllimport) #endif #ifdef __cplusplus extern "C" { #endif void DLLAPI set_hook (); void DLLAPI remove_hook (); #ifdef __cplusplus } #endif #endif // __my_dll_h__
my_dll.c
#define DLL_EXPORT #include "my_dll.h" #include <process.h> #include <stdio.h> HANDLE g_hThrd = NULL; unsigned int __stdcall thrdproc( void *param ); int APIENTRY DllMain( HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved ) { switch( dwReason ) { case DLL_PROCESS_ATTACH: set_hook(); break; case DLL_PROCESS_DETACH: remove_hook(); break; } return TRUE; } void DLLAPI set_hook() { static int time = 3000; if( NULL != g_hThrd ) return; g_hThrd = (HANDLE)_beginthreadex( NULL, 0, thrdproc, (void*)&time, 0, NULL ); if( NULL == g_hThrd ) MessageBox( NULL, "set_hook() failed", "dll", MB_OK ); } void DLLAPI remove_hook() { if( NULL == g_hThrd ) return; WaitForSingleObject( g_hThrd, INFINITE ); CloseHandle( g_hThrd ); g_hThrd = NULL; } unsigned int __stdcall thrdproc( void *param ) { int time = *(int*)param; int i = 0; char title[4] = { 0 }; while( i++ < 10 ) { memset( title, 0, sizeof(char) * 4 ); sprintf( title, "%d", i ); MessageBox( NULL, "thread output", title, MB_OK ); Sleep( time ); } _endthreadex( 0 ); return 0; }
测试代码:
#include <stdio.h> #include <string.h> #include <Windows.h> #include <TlHelp32.h> void ImprovePermission() { HANDLE hToken = NULL; LUID luid = { 0 }; TOKEN_PRIVILEGES tp = { 0 }; if( !OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) ) return; if( !LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid) ) { CloseHandle( hToken ); return; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL); CloseHandle( hToken ); } HANDLE GetProcessHandleByName( char *lpszName ) { HANDLE hSnap = NULL; PROCESSENTRY32 pe = { sizeof(PROCESSENTRY32) }; if( NULL == lpszName ) return NULL; ImprovePermission(); hSnap = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); if( INVALID_HANDLE_VALUE == hSnap ) return NULL; if( !Process32First(hSnap, &pe) ) { CloseHandle( hSnap ); return NULL; } do { if( 0 == _stricmp(lpszName, pe.szExeFile) ) { CloseHandle( hSnap ); return OpenProcess( PROCESS_ALL_ACCESS, FALSE, pe.th32ProcessID ); } } while( Process32Next(hSnap, &pe) ); CloseHandle( hSnap ); return NULL; } int main( void ) { HANDLE hProcess = NULL; HANDLE hRemoteThread = NULL; int sz = 0; char *pszRemoteName = NULL; PTHREAD_START_ROUTINE pfnStartAddr = NULL; #if 0 char szDll[] = "C://bin//api_hook.dll"; char szExe[] = "explorer.exe"; #else char szDll[MAX_PATH] = { 0 }; char szExe[MAX_PATH] = { 0 }; printf( "input the dll path: " ); /*这里必须是 dll 的全路径*/ gets( szDll ); printf( "input the exe file: " ); /*这里是一个运行中的进程名*/ gets( szExe ); #endif ImprovePermission(); hProcess = GetProcessHandleByName( szExe ); if( NULL == hProcess ) { printf( "GetProcessHandleByName failed !/n" ); return 1; } sz = (strlen(szDll) + 1) * sizeof(char); pszRemoteName = (char*)VirtualAllocEx( hProcess, 0, sz, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE ); if( NULL == pszRemoteName ) { printf( "VirtualAllocEx failed !/n" ); return 2; } if( !WriteProcessMemory(hProcess, pszRemoteName, (LPVOID)szDll, sz, NULL) ) { printf( "WriteProcessMemory failed !/n" ); return 3; } pfnStartAddr = (PTHREAD_START_ROUTINE)GetProcAddress( GetModuleHandleA("kernel32.dll"), "LoadLibraryA" ); hRemoteThread = CreateRemoteThread( hProcess, NULL, 0, pfnStartAddr, pszRemoteName, 0, NULL ); WaitForSingleObject( hRemoteThread, INFINITE ); VirtualFreeEx( hProcess, pszRemoteName, sz, 0 ); if( hRemoteThread ) CloseHandle( hRemoteThread ); return 0; }
测试效果:
“僅退款”服務已成爲各大電商平臺的“標配”。然而,以“薅羊毛”的方式謀取不當利益,給商家造成了經濟和聲譽上的雙重損失,引發了廣泛關注和爭議。 2024年1月,中山市第二人民法院審理了一起電商“僅退款”案件,引發了廣泛關注。該案中,買家李某在
本文分享自華爲雲社區《ModelBox-AI應用開發:動物目標檢測【玩轉華爲雲】》,作者:陽光大貓。 一、準備環境 ModelBox端雲協同AI開發套件(Windows)環境準備【視頻教程】 二、應用開發 1. 創建工程 在Model
這是一個輕鬆賺錢的項目。 短視頻時代,誰掌握了流量誰就掌握了Money! 所以給大家分享這個經過精心打造的MoneyPrinterPlus項目。 它可以:使用AI大模型技術,一鍵批量生成各類短視頻。 它可以:一鍵混剪短視頻,批量生成短視頻不
Telerik UI for WPF擁有超過100個控件來創建美觀、高性能的桌面應用程序,同時還能快速構建企業級辦公WPF應用程序。UI for WPF支持MVVM、觸摸等,創建的應用程序可靠且結構良好,非常容易維護,其直觀的API將無縫地
本文分享自華爲雲社區《【昇騰開發全流程】AscendCL開發板模型推理》,作者:沉迷sk。 前言 學會如何安裝配置華爲雲ModelArts、開發板Atlas 200I DK A2。 並打通一個Ascend910訓練到Ascend310推理
本文分享自華爲雲社區《10分鐘搞懂各種內存溢出案例!!(含完整源碼,建議收藏)》,作者:冰 河。 作爲程序員,多多少少都會遇到一些內存溢出的場景,如果你還沒遇到,說明你工作的年限可能比較短,或者你根本就是個假程序員!哈哈,開個玩笑。今天,我
今天我們向大家推薦的是兩個開發環節的主流數據庫管理品牌*那麼你知道這兩款數據庫管理軟件品牌與 數據庫引擎配套的管理軟件有什麼區別嗎*小編這就360°全方位爲您解答* ★ 品牌介紹 Devart*擁有超過20年的經驗*利用最新的技術創造創新的
這個其實是一個特別高頻的面試題,松哥也一直很想和大家仔細來聊一聊這個話題,網上關於這塊的文章很多,但是我一直覺得要把這個問題講清楚還有點難度,今天我來試一試,看能不能和小夥伴們把這個問題梳理清楚,當然,如果小夥伴們覺得看文章不過癮,松哥也有
分享8個開箱即用的API,方便日常處理集合。 1. 快速過濾空值:Stream.ofNullable 該方法是在 Java 9 中引入的,有助於過濾集合中的所有空值,從而可能使我們避免空指針異常。 在下面的示例中,有一個包含 null 的L
一、背景 在日常部門OpsReview過程中,部門內多次遇到應用容器所在的宿主機磁盤繁忙導致的接口響應緩慢,TP99增高等影響服務性能的問題,其中比較有效的解決方案是開啓日誌的異步打印,可以有效避免同步日誌打印在磁盤IO高起的情況下拖慢業
前言 導入地址表鉤取的方法容易實現但是存在缺陷,若需要鉤取的函數不存在導入地址表中,那麼我們就無法進行鉤取,出現以下幾種情況時,導入函數是不會存儲在導入地址表中的。 延遲加載:當導入函數還沒調用時,導入函數還未寫入到導入地址表中。
近日,國家市場監督管理總局公佈《網絡反不正當競爭暫行規定》 ,自2024年9月1日起施行。《網絡反不正當競爭暫行規定》是爲預防和制止網絡不正當競爭行爲,維護公平競爭的市場秩序,鼓勵創新,保護經營者和消費者的合法權益,促進數字經濟規範持續健康
pt-osc原理探索及其觸發器的深入分析 > 作者:莫善,某互聯網公司高級 DBA。 > > 愛可生開源社區出品,原創內容未經授權不得隨意使用,轉載請聯繫小編並註明來源。 > > 本文約 6000 字,預計閱讀需要 20 分鐘。 背景 自工
前置知識 導入表 在一個可執行文件需要用到其餘DLL文件中的函數時,就需要用到導入表,用於記錄需要引用的函數。例如我們編寫的可執行文件需要用到CreateProcess函數,就需要用到kernel32.dll文件並且將其中的Create
大型語言模型(LLM)正在深刻地影響自然語言處理(NLP)領域,其強大的處理各種任務的能力也爲其他領域的從業者帶來了新的探索路徑。推薦系統(RS)作爲解決信息過載的有效手段,已經緊密融入我們的日常生活,如何用LLM有效重塑RS是一個有前