dll 주입의 APC 주입
1) EXE SleepEx() WaitForSingleObjectEx() , ( Messagebox OK )。
2) , APC 。
3) QueueUserAPC() API APC , Loadlibrary() , DLL 。
절차는 다음과 같습니다.
// TESTAPC2.cpp : 。
//
#include "stdafx.h"
#include
#include
#include
#include
#include
#pragma comment(lib,"shlwapi.lib")
#pragma comment(lib,"ntdll.lib")
using namespace std;
// PID
DWORD GetPidFormName(wstring wsProcessname)
{
HANDLE hSnaoshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnaoshot == INVALID_HANDLE_VALUE)
{
return false;
}
PROCESSENTRY32W pe = { sizeof(pe) };
BOOL bok;
for (bok = Process32FirstW(hSnaoshot, &pe); bok; bok = Process32NextW(hSnaoshot,&pe))
{
wstring wsNowProcName = pe.szExeFile;
if (StrStrI(wsNowProcName.c_str(), wsProcessname.c_str()) != NULL)
{
CloseHandle(hSnaoshot);
return pe.th32ProcessID;
}
}
CloseHandle(hSnaoshot);
return 0;
}
//dll wsProcessname
BOOL Injection_APC(const wstring &wsProcessname, const WCHAR wcCacheInDllPath[])
{
DWORD dwProcessId = GetPidFormName(wsProcessname);
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwProcessId);
if (!hProcess)
{
return FALSE;
}
PVOID lpData = VirtualAllocEx(hProcess, NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
DWORD dwRet;
if (lpData)
{
// dll
WriteProcessMemory(hProcess, lpData, (LPVOID)wcCacheInDllPath,MAX_PATH, &dwRet);
CloseHandle(hProcess);
}
//
THREADENTRY32 te = { sizeof(te) };
HANDLE handleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);//
if (handleSnap == INVALID_HANDLE_VALUE)
{
return false;
}
bool bstat = false;
if (Thread32First(handleSnap, &te))
{
do {
if (te.th32OwnerProcessID == dwProcessId)
{
HANDLE handleThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
if (handleThread)
{
DWORD dwRet = QueueUserAPC((PAPCFUNC)LoadLibraryW, handleThread, (ULONG_PTR)lpData);
}
if (dwRet > 0)
{
bstat = TRUE;
}
CloseHandle(handleThread);
}
} while (Thread32Next(handleSnap, &te));
CloseHandle(handleSnap);
return bstat;
}
}
int main()
{
Injection_APC(L"testapc.exe", L"testapcdll.dll");
return 0;
}
테스트 exe 프로그램:
#include
int main()
{
MessageBox(NULL, L"start", L"tit", MB_OK);
SleepEx(1000 * 60 * 5, true);
MessageBox(NULL, L"end", L"tit", MB_OK);
Sleep(-1);
}
dll 프로그램을 테스트하려면 다음과 같이 하십시오.
#include
#include"dll.h"
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved)
{
switch (dwReason)
{
//
case DLL_PROCESS_ATTACH:
MessageBox(NULL, L"in apc ok~", L"tit", MB_OK);
/**
* DLL (LoadLibrary), ,
* false DLL
**/
break;
//
case DLL_THREAD_ATTACH:
break;
//
case DLL_THREAD_DETACH:
break;
//
case DLL_PROCESS_DETACH:
/**
* DLL (FreeLibrary),
* ,
**/
break;
}
return 1;
}
/*
void helloDLL(void)
{
//MessageBox(NULL, TEXT("Hello DLL~"), TEXT("Title"), MB_OK);
}*/
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.