Anti dll Injection с помощью API Hooking & quot; Место записи Access Violation 0x0000000000 & quot;

Я использую технику инструкции JMP для попытки сделать инъекцию Anti-Dll с обходом, когда LdrLoadDll API вызывается внутри моей программы. Я нашел код Delphi, который отлично работает, но эта версия VC ++ 2013 для этого кода вылетает с

«Место записи Access Violation 0x0000000000»

с показанным ниже.

Итак, как я могу решить эту проблему? Кто-нибудь может мне помочь, пожалуйста?

Заранее спасибо.

Delphi версия:

procedure hook(target, newfunc:pointer);
var
jmpto:dword;
OldProtect: Cardinal; // old protect in memory
begin
jmpto:=dword(newfunc)-dword(target)-5;
VirtualProtect(target, 5, PAGE_EXECUTE_READWRITE, @OldProtect);
pbyte(target)^:=$e9;
pdword(dword(target)+1)^:=jmpto;
end;

procedure myLdrLoadDll(PathToFile:PAnsiChar; Flags:variant; ModuleFileName:PAnsiChar; var ModuleHandle:THandle);
begin
MessageBox(0, 'I have blocked your attempt to inject a dll file!!', 'WARNING!', MB_OK);
ModuleHandle:=0;
end;

procedure Main;
begin
Hook(GetProcAddress(GetModuleHandle('ntdll.dll'), 'LdrLoadDll'), @myLdrLoadDll);
end;

begin
end.

Попытка перевести для VC ++ 2013 версии:

 BOOL TrampolineAPI(HMODULE hModule, LPCWSTR DllName, LPCSTR ProcName, DWORD dwReplaced)
{
DWORD dwReturn;
DWORD dwOldProtect;
DWORD dwAddressToHook = (DWORD)GetProcAddress(GetModuleHandle(DllName), ProcName);
BYTE *pbTargetCode = (BYTE *)dwAddressToHook;
BYTE *pbReplaced = (BYTE *)dwReplaced;
VirtualProtect((LPVOID)dwAddressToHook, 5, PAGE_EXECUTE_READWRITE, &dwOldProtect);
*pbTargetCode++ = 0xE9;   // My trouble is here
*((signed int*)(pbTargetCode)) = pbReplaced - (pbTargetCode + 4);
VirtualProtect((LPVOID)dwAddressToHook, 5, PAGE_EXECUTE, &dwOldProtect);
dwReturn = dwAddressToHook + 5;
FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
return TRUE;
}

void WINAPI Replaced(HWND hWnd, LPCWSTR lpText, LPCWSTR lpCaption, UINT uType)
{
printf("Invasion!!");
}int _tmain(int argc, _TCHAR* argv[])
{

while (true)
{
TrampolineAPI(GetModuleHandle(0), (LPCWSTR)"ntdll.DLL","LdrLoadDLL"(DWORD)Replaced);}return 0;
}

0

Решение

По крайней мере, одна из проблем, с которой вы столкнулись, — это сочетание строк ANSI и Unicode.

В Win32 вы можете найти два типа кодировок — Unicode (2-байтовые символы) и ANSI (1-байтовые символы). Типы строк, с которыми вы столкнетесь для ANSI: LPSTR, LPCSTRи т. д. Широкие символы Unicode LPWSTR, LPCWSTR, так далее.

Есть также два типа функций в Win32 — например, GetModuleHandleA, а также GetModuleHandleW, Способ определения, какой из них используется, прост:

#ifdef UNICODE
#define GetModuleHandle GetModuleHandleW
#else
#define GetModuleHandle GetModuleHandleA
#endif //!UNICODE

В вашем конкретном случае вы преобразуете строковую константу с кодировкой ANSI в широкосимвольную строку Unicode. Это неопределенное поведение. + Изменить TrampolineAPI(...); в вашей основной функции следующее:

TrampolineAPI(GetModuleHandle(0), L"ntdll.DLL", "LdrLoadDLL", (DWORD)Replaced);

L"ntdll.DLL" это то, как вы определяете строковую константу широких символов. Это также позволяет избежать распечатки.

Я также рекомендовал бы использовать одинаковое кодирование строк в вашей программе. Это потребует от вас также изменить подпись TrampolineAPI на

BOOL TrampolineAPI(HMODULE hModule, LPCWSTR DllName, LPCWSTR ProcName, DWORD dwReplaced) { ... }

И изменить вызов в главном на

TrampolineAPI(GetModuleHandle(0), L"ntdll.DLL", L"LdrLoadDLL", (DWORD)Replaced);
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector