Trao đổi với tôi

http://www.buidao.com

4/11/10

[Hooking] Anti Dll Injection

Đoạn là phương pháp của _FIL73R_ trên diễn đàn rohitab: (link: http://www.rohitab.com/discuss/index.php?showtopic=29440)

A very simple way how to protect our prog. from being injected by a dll... There are other ways too (for example a a ssdt hook (LdrLoadLibrary, RtlCreateUserThread...), or something...).
code:

CODE C Language

01// ANTI DLL INJECTION by _FIL73R_
02
03#include
04
05BOOLEAN BlockAPI (HANDLE,CHAR *,CHAR *);
06void AntiInject ();
07
08/****************/
09main()
10{
11 CreateThread (0,0, (LPTHREAD_START_ROUTINE)AntiInject, 0, 0, 0);
12 while (TRUE); // loop forever... now to try and inject
13}
14/****************/
15
16void AntiInject ()
17{
18 HANDLE hProc = GetCurrentProcess();
19 while (TRUE) {
20 BlockAPI(hProc, "NTDLL.DLL", "LdrLoadDll");
21 Sleep (100);
22 }
23}
24
25BOOLEAN BlockAPI (HANDLE hProcess, CHAR *libName, CHAR *apiName)
26{
27 CHAR pRet[]={0xC3};
28 HINSTANCE hLib = NULL;
29 VOID *pAddr = NULL;
30 BOOL bRet = FALSE;
31 DWORD dwRet = 0;
32
33 hLib = LoadLibrary (libName);
34 if (hLib) {
35 pAddr = (VOID*)GetProcAddress (hLib, apiName);
36 if (pAddr) {
37 if (WriteProcessMemory (hProcess,
38 (LPVOID)pAddr,
39 (LPCVOID)pRet,
40 sizeof (pRet),
41 &dwRet )) {
42 if (dwRet) {
43 bRet = TRUE;
44 }
45 }
46 }
47 FreeLibrary (hLib);
48 }
49 return bRet;
50}

Ghi chú:

Đoạn code này làm cho ứng dụng tạo ra 1 thread , và nhiệm vụ của thread này là patch hàm LdrLoadDll thành RET, tức là không làm gì hết. Vì vậy khi tiêm chích thường sử dụng hàm này để load DLL inject lên vùng không gian địa chỉ ứng dụng. Do đó đoạn code trên sẽ có tác dụng anti được inject.

Đoạn code trên được viết thành DLL để sử dụng:


// ANTI DLL INJECTION by _FIL73R_
#include
BOOLEAN BlockAPI (HANDLE,CHAR *,CHAR *);
void AntiInject ();
/****************/
/*void main() {
CreateThread (0,0, (LPTHREAD_START_ROUTINE)AntiInject, 0, 0, 0);
while (TRUE); // loop forever... now to try and inject }

}
*/
void AntiInject () {
HANDLE hProc = GetCurrentProcess();
while (TRUE) {
BlockAPI(hProc, "NTDLL.DLL", "LdrLoadDll");
Sleep (100);
}
}
BOOLEAN BlockAPI (HANDLE hProcess, CHAR *libName, CHAR *apiName) {
CHAR pRet[]={0xC3};
HINSTANCE hLib = NULL;
VOID *pAddr = NULL;
BOOL bRet = FALSE;
DWORD dwRet = 0;
hLib = LoadLibrary (L"libName");
if (hLib) {
pAddr = (VOID*)GetProcAddress (hLib, apiName);
if (pAddr) {
if (WriteProcessMemory (hProcess, (LPVOID)pAddr, (LPCVOID)pRet, sizeof (pRet), &dwRet )) {
if (dwRet) {
bRet = TRUE;
}
}
}
FreeLibrary (hLib);
}
return bRet;
}
extern "C"
{
__declspec(dllexport) BOOL __stdcall WINAPI DllMain (HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls (hModule);
CreateThread (0,0, (LPTHREAD_START_ROUTINE)AntiInject, 0, 0, 0);
MessageBox(NULL, L"olo",L"lolo", MB_OK);
break;
case DLL_PROCESS_DETACH:
//DbgPrint ("Module is being detached now.\n");
break;
}
return TRUE;
}
}





Ơ đây có một đoạn code cũng có chức năng tương tự nhưng trong Delphi
Code:
procedure hook(target, newfunc:pointer);
var
jmpto:dword;
begin
jmpto:=dword(newfunc)-dword(target)-5;
VirtualProtect(target, 5, PAGE_EXECUTE_READWRITE, nil);
pbyte(target)^:=;
pdword(dword(target)+1)^:=jmpto;
end;

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

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