dll의 주입 및 마운트 해제
그러나 이 곳에서 마운트 해제는 자기가 강제로 주입한 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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
AWS 역방향 신청 절차(rDNS)EC2에서 이메일을 보내고 싶다면 AWS에 신청해야 합니다. 메일 발송 제한 해제 신청 역방향 설정 신청 또한 역방향 설정 신청을 하면 동시에 메일 송신 제한 해제도 되므로 신청은 실질적으로 하나로 문제 없습니다. ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.