DLL Injection - Wie Funktionswerte zurückgeben?

Hallo zusammen,

seit kurzem setze ich mich mit DLL Injection auseinander. Leider ist C nicht gerade meine Stärke, deshalb hoffe ich, dass mir jemand weiterhelfen möchte.

Mein Vorgehen:
Ich versuche die advapi32.dll zu hooken. Hierzu habe ich eine badapi.c erstellt:

Code:
#include <windows.h>
#pragma comment(lib, "user32")
#pragma comment(lib, "advapi32")

void
_CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE *pbData, DWORD *pdwDataLen)
{
    MessageBox(0, "Test", "Decrypt wird aufgerufen", 0);
}
Die Funktionsumleitungen befinden sich in einer badapi.def:

Code:
LIBRARY
EXPORTS
RegQueryValueExA=advapi32.RegQueryValueExA
RegOpenKeyExW=advapi32.RegOpenKeyExW
RegOpenKeyExA=advapi32.RegOpenKeyExA
CryptDecrypt=_CryptDecrypt
CryptEncrypt=advapi32.CryptEncrypt
CryptReleaseContext=advapi32.CryptReleaseContext
CryptDestroyKey=advapi32.CryptDestroyKey
CryptDestroyHash=advapi32.CryptDestroyHash
CryptDeriveKey=advapi32.CryptDeriveKey
CryptHashData=advapi32.CryptHashData
CryptCreateHash=advapi32.CryptCreateHash
CryptAcquireContextW=advapi32.CryptAcquireContextW
RegCloseKey=advapi32.RegCloseKey
Das ganze wird zur badapi32.dll compiliert. Die Header der "anzugreifenden" Executable hab ich gepatch, so dass statt advapi32.dll meine badapi32.dll aufgerufen wird. Funktioniert soweit alles einwandfrei, die MessageBox erscheint, aber dann crasht die Executable.

Nun zu meinen Fragen:
Leider bin ich in C ein totaler Noob. Nach Aufruf meiner gehookten Funktion _CryptDecrypt möchte ich den Inhalt von pbData per MessageBox ausgeben, anschließend advapi32.CryptDecrypt aufrufen und den neuen Inhalt von pbData ausgeben. Zu guter letzt müssen die erhaltenen Werte natürlich an die gehookte Executable zurückgegeben werden, damit diese nicht crasht. Wie mache ich das am Besten? Hab jetzt einige Stunden erfolglos gestestet und finde leider keine passenden Tutorials. Kann mir jemand weiterhelfen?
 
CryptDecrypt sollte einen Boolean zurückgeben. Versuche es mal mit "FALSE". Wenn es immer noch crasht, solltest Du prüfen, ob die Exports auch tatsächlich mit stdcall Konvention erfolgen - sprich, die _CryptDecrypt nicht etwa mit cdecl generiert wurde.
Das "Zurückgeben" sollte ganz normal funktionieren, in dem Du nach der MsgBox die "echte" CryptDecrypt Funkntion aufrufst. Sowas wie "return CryptDecrypt(parameter)". Falls der Compiler rummeckert wegen den gleichen Funktionsnamen, kannst Du die Adresse von CryptDecrypt auch "manuell" über GetProcAddress( LoadLibrary("advapi32") ,"CryptDecrypt") ermitteln und aufrufen.
Im Endeffekt würde ich empfehlen, sich das Ganze in einem Debugger wie OllyDbg anzuschauen, denn nur da kann man die Fehler wie falsche Conventions tatsächlich erknennen ;)
 
Danke für die Antwort!

Nach einigem Herumprobieren hab ichs jetzt geschafft :D

Hier die Lösung, falls jemand damit kämpft:

Code:
#include "dll.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "wincrypt.h"

#pragma comment(lib, "advapi32.lib")

BOOL CALLBACK _CryptDecrypt(HCRYPTKEY hKey, HCRYPTHASH hHash, BOOL Final, DWORD dwFlags, BYTE* pbData, DWORD* pdwDataLen)
{
     BOOL antwort = CryptDecrypt(hKey, hHash, Final, dwFlags, pbData, pdwDataLen);
     return antwort;
}

Und die .def:

Code:
LIBRARY
EXPORTS
RegQueryValueExA=advapi32.RegQueryValueExA
RegOpenKeyExW=advapi32.RegOpenKeyExW
RegOpenKeyExA=advapi32.RegOpenKeyExA
CryptDecrypt=_CryptDecrypt
CryptEncrypt=advapi32.CryptEncrypt
CryptReleaseContext=advapi32.CryptReleaseContext
CryptDestroyKey=advapi32.CryptDestroyKey
CryptDestroyHash=advapi32.CryptDestroyHash
CryptDeriveKey=advapi32.CryptDeriveKey
CryptHashData=advapi32.CryptHashData
CryptCreateHash=advapi32.CryptCreateHash
CryptAcquireContextW=advapi32.CryptAcquireContextW
RegCloseKey=advapi32.RegCloseKey

Mein nächstes Ziel ist nun die Secur32.dll, speziell die Funktion secur32.DecryptMessage. Gleiches Vorgehen, allerdings kein Erfolg. Das Ganze scheint mir erheblich komplexer zu sein? Was hat es mit den SecBuffern auf sich? Lassen die sich überhaupt auslesen?
 
Zurück
Oben