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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
LoadLibrary에서 126 오류가 발생하면 원인이되는 파일 이름을 찾는 방법Loadlibrary에서 DLL을 동적으로 로드할 때 로드 실패입니다. 실패한 파일 이름은 알려주지 않습니다. 로드하고자 하는 DLL 자체를 로드할 수 없다면 이야기는 간단하지만, 대상 DLL이 다른 DLL을 로드하...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.