windows-DLL注入
生活随笔
收集整理的這篇文章主要介紹了
windows-DLL注入
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
DLL注入
? ? 剛剛整理的代碼注入(遠程線程注入)現在整理這個DLL注入,DLL注入比較常用,相比遠程代碼注入DLL注入沒有什么太多的限制,而且實現起來比較簡單,當然遠程線程需要注意的問題DLL很多情況都需要注意,這里不做重復,只說代碼注入里面沒有說過的部分。DLL注入的方式不唯一,比如你如果完全看懂了代碼注入,那么你直接LoadLibrary地址和一個dll路徑傳進去然后在里面load一下就行了,也就是之前的代碼注入完全可以實現dll注入,今天就說下一通常dll的注入方式吧,通常dll的注入比我剛剛說的那個方法還要簡單,流程和代碼注入差不多但是簡單了很多,思路是這樣,LoadLibrary這個函數所有的進程都是地址一樣,我們直接獲取LoadLibrary的地址,然后在CreateRemoteThread里面直接把這個地址作為線程地址傳過去,然后參數就是我們已經拷貝到對方內存里的那個字符串,這樣直接就跑起來了,非常簡單,在DLL里想干什么就干什么,可以和本地寫代碼一樣,然后還有一個問題,就是注意一下,dll在入口的switch里面的第一個分支直接調用你想干的事就行了,那個分支的意思就是說當dll被第一次載入的時候就自動執行了,OK就這么簡單,如果你覺得沒聽懂,那么需要看我之前說的那個代碼注入,這個里面只說了新的東西,還有就是dll注入應該注意的幾個地方:
1.dll的入口記得就調用自己的函數,別走正當的流程,如果你非蛋疼的想調用某個指定函數,當然可以用代碼注入結合dll注入的方式,但是 然并卵。
2.注意系統問題,32exe+32dll注入32位程序,64exe+64dll注入64位程序。
? ? 剛剛整理的代碼注入(遠程線程注入)現在整理這個DLL注入,DLL注入比較常用,相比遠程代碼注入DLL注入沒有什么太多的限制,而且實現起來比較簡單,當然遠程線程需要注意的問題DLL很多情況都需要注意,這里不做重復,只說代碼注入里面沒有說過的部分。DLL注入的方式不唯一,比如你如果完全看懂了代碼注入,那么你直接LoadLibrary地址和一個dll路徑傳進去然后在里面load一下就行了,也就是之前的代碼注入完全可以實現dll注入,今天就說下一通常dll的注入方式吧,通常dll的注入比我剛剛說的那個方法還要簡單,流程和代碼注入差不多但是簡單了很多,思路是這樣,LoadLibrary這個函數所有的進程都是地址一樣,我們直接獲取LoadLibrary的地址,然后在CreateRemoteThread里面直接把這個地址作為線程地址傳過去,然后參數就是我們已經拷貝到對方內存里的那個字符串,這樣直接就跑起來了,非常簡單,在DLL里想干什么就干什么,可以和本地寫代碼一樣,然后還有一個問題,就是注意一下,dll在入口的switch里面的第一個分支直接調用你想干的事就行了,那個分支的意思就是說當dll被第一次載入的時候就自動執行了,OK就這么簡單,如果你覺得沒聽懂,那么需要看我之前說的那個代碼注入,這個里面只說了新的東西,還有就是dll注入應該注意的幾個地方:
1.dll的入口記得就調用自己的函數,別走正當的流程,如果你非蛋疼的想調用某個指定函數,當然可以用代碼注入結合dll注入的方式,但是 然并卵。
2.注意系統問題,32exe+32dll注入32位程序,64exe+64dll注入64位程序。
3.加入你注入了QQ,發現第一次注入成功了,但是第二次注入代碼沒報錯,但是么執行自己想要的,什么情況?,原因在于同一個dll被加同一個程序加載兩次的時候,第二次不會加載,給優化掉了,把QQ關了重開就行,或者自己找到某個地方free掉自己的dll。OK一共就這些,接下來是我封裝好的一個DLL調用庫,沒有寫的很細,如果是使用建議簡單修改整理(我寫了測試例子,在這里http://download.csdn.net/detail/u013761036/9603051)。
.H#pragma once#include <Windows.h>#include <stdlib.h>#include <tlhelp32.h>#include <Psapi.h>#include <string>using std::string;using std::wstring;#pragma comment (lib,"Psapi.lib")#pragma warning(disable:4996)class CInstDll{private:bool AdjustProcessTokenPrivilege();bool Camp2str(wstring wsStrA ,wstring wsStrB);DWORD GetProcessIdByName(const wstring &wsProcessName);std::string ws2s(const std::wstring& s_src,UINT CodePage = CP_ACP);std::wstring s2ws( const std::string& s_src,UINT CodePage = CP_ACP);public:bool InjectionDll2ProA(const string &strPorcessName ,const string &strDllPath);bool InjectionDll2ProW(const wstring &wsPorcessName ,const wstring &wsDllPath);};.CPP#include "stdafx.h"#include "InstDll.h"bool CInstDll::AdjustProcessTokenPrivilege(){LUID luidTmp;HANDLE hToken;TOKEN_PRIVILEGES tkp;if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))return false;if(!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidTmp)){ CloseHandle(hToken);return FALSE;}tkp.PrivilegeCount = 1;tkp.Privileges[0].Luid = luidTmp;tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;if(!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)){CloseHandle(hToken);return FALSE;}return true;}bool CInstDll::Camp2str(wstring wsStrA ,wstring wsStrB){int nSize = wsStrA.length();for(int i = 0 ;i < nSize ;i ++){if(wsStrA[i] >= 'A' && wsStrA[i] <= 'Z')wsStrA[i] += 'a'- 'A';}nSize = wsStrB.length();for(int i = 0 ;i < nSize ;i ++){if(wsStrB[i] >= 'A' && wsStrB[i] <= 'Z')wsStrB[i] += 'a'- 'A';}return wsStrA == wsStrB;}DWORD CInstDll::GetProcessIdByName(const wstring &wsProcessName){HANDLE hProcess = 0;DWORD dwProcess[2048] ,dwNeeded;TCHAR tcProcName[MAX_PATH] = {0};wstring wsNowProcessName = L"";int nTempSize = 0;int nPos = 0;EnumProcesses(dwProcess, sizeof(dwProcess), &dwNeeded);for(int i = 0 ;i < dwNeeded / sizeof(DWORD) ;i++){if(0 != dwProcess[i]){hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcess[i]);GetModuleFileNameEx(hProcess, NULL, tcProcName, MAX_PATH);nPos = wstring(tcProcName).find_last_of(L'\\');if(nPos != wstring::npos){wsNowProcessName = wstring(wstring(tcProcName).substr(nPos + 1));if(Camp2str(wsProcessName ,wsNowProcessName)){DWORD aa = dwProcess[i];return aa;}//if(wsProcessName == wsNowProcessName)// return dwProcess[i];}}}return 0;}std::string CInstDll::ws2s(const std::wstring& wide, UINT CodePage){int wide_length = static_cast<int>(wide.length());if (wide_length == 0)return std::string();// Compute the length of the buffer we'll need.int charcount = WideCharToMultiByte(CodePage, 0, wide.data(), wide_length,NULL, 0, NULL, NULL);if (charcount == 0)return std::string();std::string mb;mb.resize(charcount);WideCharToMultiByte(CodePage, 0, wide.data(), wide_length,&mb[0], charcount, NULL, NULL);return mb;}std::wstring CInstDll::s2ws( const std::string& mb,UINT CodePage){if (mb.empty())return std::wstring();int mb_length = static_cast<int>(mb.length());// Compute the length of the buffer.int charcount = MultiByteToWideChar(CodePage, 0,mb.data(), mb_length, NULL, 0);if (charcount == 0)return std::wstring();std::wstring wide;wide.resize(charcount);MultiByteToWideChar(CodePage, 0, mb.data(), mb_length, &wide[0], charcount);return wide;}bool CInstDll::InjectionDll2ProW(const wstring &wsPorcessName ,const wstring &wsDllPath){//1.提權if(!AdjustProcessTokenPrivilege())return false;//2.獲取pidDWORD dwProPID = 0;if((dwProPID = GetProcessIdByName(wsPorcessName)) == 0)return false;//3.打開進程HANDLE hProcess = NULL;if((hProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE ,dwProPID)) == NULL)return false;//4.初始化參數數據PTHREAD_START_ROUTINE dwLoadLibraryAddress = (PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("kernel32.dll")),"LoadLibraryA");if(dwLoadLibraryAddress == 0)return false;char tcCache[MAX_PATH] = {0};strcat(tcCache ,ws2s(wsDllPath).c_str());//5.在宿主進程里分配內存,用于存參數char *pPara = NULL;pPara = (char *)VirtualAllocEx(hProcess , 0 ,sizeof(tcCache) ,MEM_COMMIT,PAGE_READWRITE);if(pPara == NULL) return false;//6.把參數寫入宿主進程里,注意結構體的命名(_REMOTE_PARAMETER)if(!WriteProcessMemory(hProcess ,pPara ,tcCache ,sizeof(tcCache) ,0))return false;//7.啟動注入宿主進程的進程DWORD dwThreadId = 0;HANDLE hThread = CreateRemoteThread(hProcess ,0 ,0 ,dwLoadLibraryAddress ,pPara ,0 ,&dwThreadId);if(!hThread) return false;//9.等待線程結束,然后清理內存 WaitForSingleObject(hThread ,INFINITE);CloseHandle(hThread);VirtualFreeEx(hProcess ,pPara ,0 ,MEM_RELEASE);CloseHandle(hProcess);return true;}bool CInstDll::InjectionDll2ProA(const string &strPorcessName ,const string &strDllPath){return InjectionDll2ProW(s2ws(strPorcessName) ,s2ws(strDllPath));}USER#include "stdafx.h"#include "InstDll.h"int _tmain(int argc, _TCHAR* argv[]){CInstDll cIn;//cIn.InjectionDll2ProW(L"qq.exe" ,L"c:\\MyFirstDll32.dll"); //"explorer.execIn.InjectionDll2ProA("explorer.exe" ,"c:\\MyFirstDll64.dll"); //"explorer.exereturn 0;} 我再把當時測試用的一個簡單DLL代碼貼出來吧// dllmain.cpp : 定義 DLL 應用程序的入口點。#include "stdafx.h"void DoSomethings(){MessageBoxW(NULL ,L"do some things" ,L"T" ,MB_OK);}BOOL APIENTRY DllMain( HMODULE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:{DoSomethings();}break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}
總結
以上是生活随笔為你收集整理的windows-DLL注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: windows-CODE注入(远程线程注
- 下一篇: windows核心编程-第一章 对程序错