2010-08-01 46 views
3

Hé les gars, j'essaie de comprendre comment appeler une fonction sans qu'elle soit exportée. Ok, donc j'ai un fichier exe avec "add" défini en lui, Cet exe est une application console win32 et charge une DLL. La DLL vise également à utiliser la fonction d'ajout du fichier exe (sans les exportations)C - Appel de fonctions depuis un processus externe sans fonctions exportées

Voici mon fichier d'application principal de la console win32:

#include <windows.h> 
#include <stdio.h> 

#pragma auto_inline (off) 

int add (int a, int b) 
{ 
    printf("Adding some ints\n"); 
    return a + b; 
} 

int main () 
{ 
    HMODULE module = NULL; 

    if ((module = LoadLibrary(L"hook.dll")) == NULL) 
    { 
     printf("Could not load library: %ld\n", GetLastError()); 
     return 0; 
    } 

    add(3, 5); 

    FreeLibrary(module); 

    return 0; 
} 

Voici le code pour hook.dll:

#include <windows.h> 
#include <stdio.h> 
#include <detours.h> 

static int (*add) (int a, int b) = (int (*)(int a, int b)) 0x401000; 

int Detoured_add (int a, int b) 
{ 
    return add(a, b); 
} 

BOOL WINAPI DllMain (HINSTANCE hDll, DWORD reason, LPVOID reserved) 
{ 
    if (reason == DLL_PROCESS_ATTACH) 
    { 
     DetourTransactionBegin(); 
     DetourAttach((PVOID*) &add, Detoured_add); 
     DetourTransactionCommit(); 

    } 
    else if (reason == DLL_PROCESS_DETACH) 
    { 
     DetourTransactionBegin(); 
     DetourDetach((PVOID*) &add, Detoured_add); 
     DetourTransactionCommit(); 
    } 

    return TRUE; 
} 

Je démonte ma demande de console win32 pour trouver l'adresse de la fonction add

.text:00401000 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ 
.text:00401000 
.text:00401000 
.text:00401000 sub_401000  proc near    ; CODE XREF: sub_401020:loc_40104Bp 
.text:00401000     push offset aAddingSomeInts ; "Adding some ints\n" 
.text:00401005     call ds:printf 
.text:0040100B     add  esp, 4 
.text:0040100E     mov  eax, 8 
.text:00401013     retn 
.text:00401013 sub_401000  endp 

Le problème est lorsque j'appelle LoadLibrary, il renvoie 998 qui je crois est violation d'accès au code d'erreur. Je suppose que cela a du sens cependant que cette zone de mémoire est probablement protégée.

Des conseils?

(De plus, le désassembleur j'est la version gratuite Ida Pro, et la bibliothèque est fournie par des détours Microsoft.)

+0

Je ne connais pas grand chose à Detours et je ne suis pas sûr qu'il puisse être utilisé de cette façon. Mais êtes-vous sûr que l'adresse de add() sera 0x401000 lors de l'exécution? Le module ne peut-il pas être déplacé ou quelque chose? –

+0

Bon, je ne suis pas trop sûr de l'adresse, puisque je suis nouveau dans ce genre de choses. – Tr41n

+0

Je vais continuer à travailler sur ceci et rapporter mes résultats. – Tr41n

Répondre

1

Les modules sont relocalisés car ils sont chargés. Vous devriez trouver l'adresse de base du module chargé et déplacer l'adresse vous-même. En outre, vous pouvez utiliser la bibliothèque [DebugHelp] [1] pour récupérer l'adresse de la fonction par son nom symbolique au lieu de la coder en dur.

+0

+1 Je suppose que DebugHelp peut être utilisé. Vous devez cependant compiler le module avec les informations de débogage. –

+0

J'ai découvert que mettre la valeur hexadécimale brute de désassembler comme un pointeur de fonction peut fonctionner, mais pas avec les applications console win32. Windows DEP le bloque. donc int (* ajouter) (int a, int b) = (int (*) (int, int)) 0x2329381; // une certaine valeur Cela semble fonctionner correctement si c'est juste à partir de l'exécutable principal, mais si c'est d'un module externe que l'exécutable principal utilise, je pense que cela fonctionnera: HMODULE handle = GetModuleHandleA ("another.dll") ; int (* ajouter) (int a, int b) = (int (*) (int, int)) (handle (DWORD) + (DWORD) 0x2329381); – Tr41n