dll의 주입 및 마운트 해제

5236 단어 역방향dll 주입
사용 방법: 세 개의 명령행 매개 변수가 필요합니다.flag 0은 주입을 나타내고 1은 마운트 해제를 나타냅니다. (마운트 해제는 관리자 권한이 필요합니다.) 2.dll의 경로 (이름) 주입은 경로와 이름이 필요합니다. 마운트 해제는 이름이 필요합니다.주입하거나 마운트 해제해야 하는 프로세스 이름 개선이 추가되었습니다. 프로세스 이름을 입력하면 PID를 찾을 수 있습니다.
그러나 이 곳에서 마운트 해제는 자기가 강제로 주입한 dll만 가능합니다.PE 파일에서 가져온 DLL 파일은 프로세스에서 마운트 해제할 수 없습니다
#include"windows.h"
#include"tlhelp32.h"
#include


DWORD FindProcessID(LPCTSTR szProcessName)
{
	DWORD dwPID = 0xFFFFFFFF;
	HANDLE hSnapShot = INVALID_HANDLE_VALUE;
	PROCESSENTRY32 pe;
	//      
	pe.dwSize = sizeof(PROCESSENTRY32);
	hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, NULL);//        (NULL      )
	//    
	Process32First(hSnapShot, &pe);
	do
	{
		if (!_tcsicmp(szProcessName, (LPCTSTR)pe.szExeFile))
		{
			dwPID = pe.th32ProcessID;
			break;
		}
	} while (Process32Next(hSnapShot, &pe));
	CloseHandle(hSnapShot);
	return dwPID;
}
//    
BOOL SetPrivilege(LPCTSTR lpszPrivilege, BOOL bEnablePrivilege)
{
	TOKEN_PRIVILEGES tp;
	HANDLE hToken;
	LUID luid;

	if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
	{
		_tprintf(L"LookupPrivilegeValue error: %u
", GetLastError()); return FALSE; } if (!LookupPrivilegeValue(NULL, lpszPrivilege, &luid)) { _tprintf(L"LookupPrivilegeValue error: %u
", GetLastError()); return FALSE; } tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; if (bEnablePrivilege) tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; else tp.Privileges[0].Attributes = 0; //enable the privilege or disable all privileges. if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES),(PTOKEN_PRIVILEGES)NULL, (PDWORD)NULL)) { _tprintf(L"AdjustTokenPrivileges error: %u
", GetLastError()); return FALSE; } if (GetLastError() == ERROR_NOT_ALL_ASSIGNED) { _tprintf(L"the token does nothave rhe specified privilege .
"); return FALSE; } return TRUE; } BOOL EjectDll(DWORD dwPID, LPCTSTR szDllName) { BOOL bMore = FALSE, bFound = FALSE; HANDLE hSnapshot, hProcess, hThread; HMODULE hModule = NULL; MODULEENTRY32 me = { sizeof(me) }; LPTHREAD_START_ROUTINE pThreadProc; //dwPID=notepad PID // TH32CS_SNAPMODULE notepad dll hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID); bMore = Module32First(hSnapshot, &me); for (; bMore; bMore = Module32Next(hSnapshot, &me)) { if (!_tcsicmp((LPCTSTR)me.szModule, szDllName) || !_tcsicmp((LPCTSTR)me.szExePath, szDllName)) { bFound = TRUE; break; } } if (!bFound) { CloseHandle(hSnapshot); return FALSE; } if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID))) { _tprintf(L"OpenProcess(%d) failed!!! [%d]
,", dwPID, GetLastError()); return FALSE; } hModule = GetModuleHandle(L"Kernel32.dll"); pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hModule, "FreeLibrary"); hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, me.modBaseAddr, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); CloseHandle(hProcess); CloseHandle(hSnapshot); return TRUE; } BOOL InjectDll(DWORD dwPID, LPCTSTR szDllPath) { HANDLE hProcess = NULL, hThread = NULL; HMODULE hMod = NULL; LPVOID pRemoteBuf = NULL; DWORD dwBufSize = (DWORD)(_tcslen(szDllPath) + 1)*sizeof(TCHAR); LPTHREAD_START_ROUTINE pThreadProc; // dwpid if (!(hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID))) { _tprintf(L"OpenProcess(%d) failed!!![%d]
", dwPID, GetLastError()); return FALSE; } // szDllname pRemoteBuf = VirtualAllocEx(hProcess, NULL, dwBufSize, MEM_COMMIT, PAGE_READWRITE);// , // myhack.dll 。 WriteProcessMemory(hProcess, pRemoteBuf, (LPVOID)szDllPath, dwBufSize, NULL); // LoadLibraryW API hMod = GetModuleHandle(L"Kernel32.dll");// pThreadProc = (LPTHREAD_START_ROUTINE)GetProcAddress(hMod, "LoadLibraryW");// // hThread = CreateRemoteThread(hProcess, NULL, 0, pThreadProc, pRemoteBuf, 0, NULL);// _tprintf(L"%d", GetLastError()); WaitForSingleObject(hThread, INFINITE); CloseHandle(hProcess); return TRUE; } int _tmain(int argc, TCHAR* argv[]) { if (argc != 4) { _tprintf(L"USAGE: ,1.flag(flag 0 )。2. dll ( dll )3. ( )dll
", argv[2]); return 1; } DWORD dwPID = 0xFFFFFFFF; dwPID = FindProcessID(argv[3]); if (dwPID == 0xFFFFFFFF) { _tprintf(L"there is no %s process!
", argv[3]); return 1; } _tprintf(L"PID of \"%s\"is%d
", argv[3], dwPID); //enject dll //inject dll if (*argv[1] == (TCHAR)'0') { if (InjectDll(dwPID, argv[2])) _tprintf(L"InjectDll(\"%s\")success!!
", argv[2]); else _tprintf(L"InjectDll(\"%s\") failed!!
", argv[2]); } else { // privilege if (!SetPrivilege(SE_DEBUG_NAME, TRUE)) return 1; if (EjectDll(dwPID,argv[2])) _tprintf(L"EjectDll(%d,\"%s\")success!!!
", dwPID, argv[2]); else _tprintf(L"EjectDll(%d,\"%s\")failed!!!
", dwPID, argv[2]); } return 0; }

좋은 웹페이지 즐겨찾기