C++ DLL注入和程式碼注入
void InjectDLL(DWORD PID,char *Path)
{
DWORD dwSize;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
dwSize=strlen(Path)+1;
LPVOID lpParamAddress=VirtualAllocEx(hProcess,0,dwSize,PARITY_SPACE,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess,lpParamAddress,(PVOID)Path,dwSize,NULL);
HMODULE hModule=GetModuleHandleA("kernel32.dll");
LPTHREAD_START_ROUTINE lpStartAddress=(LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryA");
HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,lpStartAddress,lpParamAddress,0,NULL);
WaitForSingleObject(hThread,1000);
CloseHandle(hThread);
}
{
DWORD dwSize;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,PID);
dwSize=strlen(Path)+1;
LPVOID lpParamAddress=VirtualAllocEx(hProcess,0,dwSize,PARITY_SPACE,PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess,lpParamAddress,(PVOID)Path,dwSize,NULL);
HMODULE hModule=GetModuleHandleA("kernel32.dll");
LPTHREAD_START_ROUTINE lpStartAddress=(LPTHREAD_START_ROUTINE)GetProcAddress(hModule,"LoadLibraryA");
HANDLE hThread=CreateRemoteThread(hProcess,NULL,0,lpStartAddress,lpParamAddress,0,NULL);
WaitForSingleObject(hThread,1000);
CloseHandle(hThread);
}
另一種是直接注入程式碼,程式碼如下:
//函式名:InjectCode
//功能:封裝遠端注入的函式
//引數:程式ID
//引數:被注入函式指標<函式名>
//引數:引數
//引數:引數長度
void InjectCode(DWORD dwProcId,LPVOID mFunc, LPVOID Param, DWORD ParamSize)
{
HANDLE hProcess;//遠端控制程式碼
LPVOID mFuncAddr;//申請函式記憶體地址
LPVOID ParamAddr;//申請引數記憶體地址
HANDLE hThread; //執行緒控制程式碼
DWORD NumberOfByte; //輔助返回值
CString str;
//開啟被注入的程式控制程式碼
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
//申請記憶體
mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
ParamAddr = VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//寫記憶體
WriteProcessMemory(hProcess,mFuncAddr,mFunc,128, &NumberOfByte);
WriteProcessMemory(hProcess,ParamAddr,Param,ParamSize, &NumberOfByte);
//建立遠端執行緒
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr,
ParamAddr,0,&NumberOfByte);
WaitForSingleObject(hThread, INFINITE); //等待執行緒結束
//釋放申請有記憶體
VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);
VirtualFreeEx(hProcess,ParamAddr,ParamSize,MEM_RELEASE);
//釋放遠端控制程式碼
CloseHandle(hThread);
CloseHandle(hProcess);
}
{
HANDLE hProcess;//遠端控制程式碼
LPVOID mFuncAddr;//申請函式記憶體地址
LPVOID ParamAddr;//申請引數記憶體地址
HANDLE hThread; //執行緒控制程式碼
DWORD NumberOfByte; //輔助返回值
CString str;
//開啟被注入的程式控制程式碼
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcId);
//申請記憶體
mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
ParamAddr = VirtualAllocEx(hProcess,NULL,ParamSize,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//寫記憶體
WriteProcessMemory(hProcess,mFuncAddr,mFunc,128, &NumberOfByte);
WriteProcessMemory(hProcess,ParamAddr,Param,ParamSize, &NumberOfByte);
//建立遠端執行緒
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr,
ParamAddr,0,&NumberOfByte);
WaitForSingleObject(hThread, INFINITE); //等待執行緒結束
//釋放申請有記憶體
VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);
VirtualFreeEx(hProcess,ParamAddr,ParamSize,MEM_RELEASE);
//釋放遠端控制程式碼
CloseHandle(hThread);
CloseHandle(hProcess);
}
相關文章
- 程式注入之DLL注入
- C++ DLL注入工具完整原始碼C++原始碼
- WINDWOS 系統程式DLL檔案注入。
- 程式碼注入
- 技術分享 | DLL注入之遠執行緒注入執行緒
- C# DLL注入技術C#
- 最新堆疊查詢注入攻擊和注入程式碼分析技術
- 8 - DLL注入和解除安裝
- Spring注入:配置注入(set注入和構造器注入)與註解注入Spring
- 常見程式注入的實現及記憶體dump分析——反射式DLL注入(上)記憶體反射
- 常見程式注入的實現及記憶體dump分析——反射式DLL注入(下)記憶體反射
- Windows提權實戰————4、DLL注入Windows
- QueueUserApc實現DLL注入的測試
- 使用微軟Detours庫進行DLL注入微軟
- iOS逆向 程式碼注入+HookiOSHook
- iOS逆向之 程式碼注入iOS
- Windows訊息鉤取(簡單DLL注入)Windows
- injectionForXcode程式碼注入步驟XCode
- 程式碼注入的三種方法
- 遠端執行緒注入dll,突破session 0執行緒Session
- iOS應用程式碼注入防護iOS
- 程式碼注入漏洞以及修復方法
- javascript 依賴注入程式碼例項JavaScript依賴注入
- iOS非越獄逆向--程式碼注入iOS
- [翻譯]利用程式碼注入脫殼
- OpenStack 密碼注入密碼
- Spring set注入和構造注入的區別Spring
- 百度快照劫持織夢注入程式碼和防範
- 最新二次注入攻擊和程式碼分析技術
- 最新寬位元組注入攻擊和程式碼分析技術
- 最新Base64注入攻擊和程式碼分析技術
- SQL 注入:聯合注入SQL
- sql注入之union注入SQL
- iOS逆向之旅(進階篇) — 程式碼注入iOS
- UIWebView程式碼注入時機與姿勢UIWebView
- Spring原始碼系列:依賴注入(三)-屬性注入Spring原始碼依賴注入
- 面向切面程式設計和依賴注入程式設計依賴注入
- sql注入之堆疊注入及waf繞過注入SQL