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; }
測試效果:
安裝MYSQL時的一系列三大問題與三大解決方法 問題一: 問題二: 問題三: 問題一: 在安裝時候輸入 net start mysql 時候報錯爲: net不是內部或外部命令也不是可運行。 解決方法: 環境變量的問題
作者:木煙 在 YAML 化配置流水線時,你是否會遇到以下問題? 單流水線中批量執行類似任務場景時,YAML 中需要定義多個類似邏輯的 Job,Job 越多,流水線 YAML 配置的越長,YAML 中的重複代碼越多,代碼複用性低,可讀性差
Codejock軟件公司的Xtreme Toolkit Pro是屢獲殊榮的VC界面庫,是MFC開發中最全面界面控件套包,它提供了Windows開發所需要的11種主流的Visual C++ MFC控件,包括Command Bars、Contr
現在短視頻越來越火,據統計,2023年全球短視頻用戶數量已達 10 億,預計到2027年將突破 24 億。對於產品展示和用戶營銷來說,短視頻已經成爲重要陣地,不管你喜不喜歡它,你都得面對它,學會使用它。 但是,優質短視頻的持續輸出對視頻創作
DevExpress Reporting是.NET Framework下功能完善的報表平臺,它附帶了易於使用的Visual Studio報表設計器和豐富的報表控件集,包括數據透視表、圖表,因此您可以構建無與倫比、信息清晰的報表。 下一個主要
1. 創建容器 1.1 自己創建 1.2 使用模板創建 portainer 的 “App Template” 模塊自帶了一些應用的模板,使用起來比較簡單。 根據它的配置項我們提前創建好數據卷 配置上名稱、端口、數據卷
Linux 異寵動物園,平面設計篇,分佈介紹視頻,講解了 Linux 平臺常見的開源平面設計軟件。如 Inkscape,Gimp,Krita,Scribus,並介紹了平面設計行業早期的歷史和 Aldus 公司的歷史。 視頻請見: https
前面松哥寫了一篇文章和大家聊了 Spring6 中引入的新玩意 AOT(見Spring Boot3 新玩法,AOT 優化!)。 文章發出來之後,有小夥伴問松哥有沒有做性能比較,老實說,這個給落下了,所以今天再來一篇文章,和小夥伴們梳理比較小
自帶WEB管理的輕量級內網穿透工具NPS的各種搭建方式和使用教程,支持X86、ARM、MIPS平臺。 NPS介紹 nps是一款輕量級、高性能、功能強大的內網穿透代理服務器。目前支持TCP、UDP流量轉發,可支持任何tcp、udp上層協議(訪
JSON簡介: JSON(Java Script Object Notation)是一種輕量級的數據交換格式,通常用於在不同系統之間傳輸數據。它基於 JavaScript 對象語法,但已成爲一種獨立於語言的格式。JSON 數據以鍵值對的形式
一、簡單介紹: CaffeineCache和Guava的Cache是應用廣泛的本地緩存。 在開發中,爲了達到降低依賴、提高訪問速度的目的。會使用它存儲一些維表接口的返回值和數據庫查詢結果,在有些場景下也會在分佈式緩存上再加上一層本地緩存,
作者:vivo 互聯網大前端團隊 - Ma Lian 本文主要描述了FileProvider,startAnyWhere實現,Parcel不對稱漏洞以及這三者結合產生的漏洞利用實戰,另外闡述了漏洞利用的影響和修復預防措施,這個漏洞波及了
本文分享自華爲雲社區《GaussDB SQL基本語法示例-CASE表達式》,作者:Gauss松鼠會小助手2。 一、前言 SQL是用於訪問和處理數據庫的標準計算機語言。GaussDB支持SQL標準(默認支持SQL2、SQL3和SQL4的主要
前端: import ClientMonitor from 'skywalking-client-js'; ClientMonitor.setPerformance({ collector: 'http://127.0.0.
一般我們在Linux下執行某些外部程序的時候可能會提示找不到共享庫的錯誤, 比如: tmux: error while loading shared libraries: libevent-1.4.so.2: cannot open sha