generelle frage zur dll injection

01/10/2008 22:07 reijin#1
sooo mein zweiter Thread ;D
Diesmal würd ich gern wissen ob es möglich ist direkt auf den speicher des Prozesses zuzugreifen in den eine dll injected wurde und möglicherweise sogar dessen Funktionen auszuführen?
ist doch so oder? :)

gruß, reijin
01/10/2008 23:58 Bot_interesierter#2
Für den Speicher zugriff brauchst du keine dll injection, dazu gibts die windows api, allerdings kannst du mit dll injection Prozessinterne Funktionen callen, wie des im detail geht weiss ich aber nicht, bei tsearch ist aber glaub ein tut dabei, wie man Funktionen in einem fremd programm über code injection nutzten kann, da war sowas mit nem beispiel prog, bei dem man dann ein zusätliches Fenster oder nen Button erstellt hat, also ist es möglich zb in WoW ein Menu deines Hacks einzubauen und auch WoWApi funktionen zu nutzen.
01/11/2008 09:39 mr.rattlz#3
Quote:
Originally Posted by Bot_interesierter View Post
Für den Speicher zugriff brauchst du keine dll injection, dazu gibts die windows api
Mit der dll kannst du allerdings direkt auf den Speicher zugreifen wie das Programm selber, also ohne irgendwelche api aufrufe ;)
ala "mov eax,[dword ptr blabla]" usw...


edit: Wenn das jetzt beispielsweise in integer-wert an der Stelle ist könnte man in C dann auch einfach das als Pointer dereferenzieren und hätte nen tollen Integer :)
01/11/2008 13:13 rEdoX#4
Quote:
Originally Posted by mr.rattlz View Post
...
ala "mov eax,[dword ptr blabla]" usw...
...
wenn schon:

"mov eax,dword ptr [blabla]"

:p

Aber zur eigentlich fragen: Du brauchst dafuer nicht umbedingt eine dll injecten, ein gezielter aufruf von CreateRemoteThread fuehrt auch zum ziel.
01/11/2008 14:22 reijin#5
@bot:
das ist mir schon klar ;) ich will halt direkt auf den speicher der anwednung zugreifen - ist auf dem weg einfacher - find ich^^

muss ich sonst noch was beachten?
wenn ich jetzt tatsächlich ne dll injecte, und ich dann einfach schreibe:
CreateMonster(parameter) (angenommen das ist ne funktion ingame)
kann ich die dann einfach in meinem code schreiben, als sei sie da vorhanden oder muss ich da asm schreiben? oder in der selben sprache wie die anwendung.

//edit//
ich probiers einfach mal ;D

//edit2//
toll ich bekomme mit meinem PBcompiler nen error... versuch ichs mal mit C
linker error... verdammt.. der meckert immer, dass die funktion nicht vorhanden ist... dabei wird sie vorhanden sein... was muss ich da machen?
01/11/2008 14:32 rEdoX#6
Du musst die functionsaddresse callen:

Code:
__asm{
   //Aufrufkonvention beachten

   push Param1
   push Param2
   call 0x40F654

}
Namen sind im compilat schall und rauch (ausgenommen dll-exports usw)
01/11/2008 14:37 reijin#7
also muss ich von jeder funktion die ich calle den ort kennen und über ams ausführen?
01/11/2008 14:44 rEdoX#8
kenne mich mit c nicht ganz so gut aus, aber denke man kann auch eine funktion eine addresse zuweisen:

int asdf() = 0x545458;
asdf();

aber im prinzip hast du recht, man muss wissen wo die funktion im speicher "liegt"
01/11/2008 14:47 reijin#9
Quote:
Originally Posted by rEdoX View Post
kenne mich mit c nicht ganz so gut aus, aber denke man kann auch eine funktion eine addresse zuweisen:

int asdf() = 0x545458;
asdf();

aber im prinzip hast du recht, man muss wissen wo die funktion im speicher "liegt"
im speicher oder im programm? also im debugger werden ja die offsets(?) angezeigt ist das der ort?

//edit//
sry ich nerve :D

//edit2//
ich schau mir mal an wie man in asm nen string als parameter übergibt :D
01/11/2008 15:15 rEdoX#10
Ja, im speicher also Baseaddress + FileOffset = Offset(RVA).

fuer 0-terminierende strings pusht du einfach den pointer auf dem ersten char.
01/11/2008 16:42 Dodge#11
Quote:
Originally Posted by rEdoX View Post
kenne mich mit c nicht ganz so gut aus, aber denke man kann auch eine funktion eine addresse zuweisen:

int asdf() = 0x545458;
asdf();

aber im prinzip hast du recht, man muss wissen wo die funktion im speicher "liegt"
das muss bissl anders aussehn :)


siehe Function pointer (Quelle: Wikipedia)
Code:
#include <stdio.h>
 
 static int my_function(int a)
 {
     printf("my_function: %dn", a);
     return (2*a + 3);
 }
 
 int main(void)
 {
     int (*new_function)(int) = my_function;
     int  x;
 
     x = (*new_function)(10);
     printf("main: %dn", x);
     return 0;
 }
du müsstest halt hier "int (*new_function)(int) = my_function;" anstelle von my_function die adresse schreiben

Gruß^^
01/11/2008 17:02 reijin#12
Quote:
Originally Posted by Dodge View Post
das muss bissl anders aussehn :)


siehe Function pointer (Quelle: Wikipedia)
Code:
#include <stdio.h>
 
 static int my_function(int a)
 {
     printf("my_function: %dn", a);
     return (2*a + 3);
 }
 
 int main(void)
 {
     int (*new_function)(int) = my_function;
     int  x;
 
     x = (*new_function)(10);
     printf("main: %dn", x);
     return 0;
 }
du müsstest halt hier "int (*new_function)(int) = my_function;" anstelle von my_function die adresse schreiben

Gruß^^
ansonsten ließe sich das 1:1 übernehmen?! O.o
muss ich beim erstellen irgendwas beachten, wenn ich ne dll haben will? ich hatte nun versucht das mit asm hinzu bekommen....
aber es klappt nicht

Code:
/* Replace "dll.h" with the name of your header */
#include "dll_test.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>


DLLIMPORT void HelloWorld ()
{    
                          char buchstabe = 'U';
                          __asm{    
                          mov eax, buchstabe
                          push eax
                          call 01002A55                
                          }
                          
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION);
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{

    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
                                
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
nicht wundern - ist nen preset von DEV-Cpp zur erstellung von dlls.
ich hatte vorher die asm funtion in der Dllmain funktion...
aber leider meckert der compiler^^
vermutlich hab ich einfach noch nicht genug ahnung...
ich sollte vllt wieder in meinem Buch lesen...
01/11/2008 22:58 termi#13
Quote:
Originally Posted by Reijin View Post
ansonsten ließe sich das 1:1 übernehmen?! O.o
muss ich beim erstellen irgendwas beachten, wenn ich ne dll haben will? ich hatte nun versucht das mit asm hinzu bekommen....
aber es klappt nicht

Code:
/* Replace "dll.h" with the name of your header */
#include "dll_test.h"
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>


DLLIMPORT void HelloWorld ()
{    
                          char buchstabe = 'U';
                          __asm{    
                          mov eax, buchstabe
                          push eax
                          call 01002A55                
                          }
                          
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION);
}


BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                       DWORD reason        /* Reason this function is being called. */ ,
                       LPVOID reserved     /* Not used. */ )
{

    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
                                
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
nicht wundern - ist nen preset von DEV-Cpp zur erstellung von dlls.
ich hatte vorher die asm funtion in der Dllmain funktion...
aber leider meckert der compiler^^
vermutlich hab ich einfach noch nicht genug ahnung...
ich sollte vllt wieder in meinem Buch lesen...
Ich bin jetzt zwar kein Profi was Intel-ASM angeht (programmiere eigentlich mehr auf Microcontrollern) aber kann der Intel nen call auf einen imediate Wert? Ausserdem wuesste ich nun nicht wo du deine eigene Funktion aufrufst, die wird zwar in den Speicher geladen aber ausgefuert duerfte die nicht werden.
Wenn du mal bissel was testen willst mit den DLL's kannste dir ja auch mal einen Proxy fuer bereits existierende DLL's schreiben und damit bissel rumprobieren. (Dafuer musste dem Hautpprogramm "nur" eine andere DLL anstelle dem Original unterjubel und dann die calls in die originale DLL tunneln.)
Noch was bezueglich der Adresse der aufzurufenden Funktion: Die WinApi stellt dir eine Funktion bereit mit der du dir Adressen von Prozeduren holen kannst (GetProcAddress();).
01/12/2008 00:25 mr.rattlz#14
Quote:
Originally Posted by termi View Post
Ich bin jetzt zwar kein Profi was Intel-ASM angeht (programmiere eigentlich mehr auf Microcontrollern) aber kann der Intel nen call auf einen imediate Wert?
Aber sicher doch, die meisten calls sind sogar immediate. Meines Wissens gibts dazu noch indirekt über ein Register und indirekt über den Speicher. Mein schlaues Buch dazu ist leider in meiner Wohnung :<
01/13/2008 00:12 termi#15
Quote:
Originally Posted by mr.rattlz View Post
Aber sicher doch, die meisten calls sind sogar immediate. Meines Wissens gibts dazu noch indirekt über ein Register und indirekt über den Speicher. Mein schlaues Buch dazu ist leider in meiner Wohnung :<
Über Speicher und Register kenn ich aber das mit dem imidiate haette ich nun nicht gedacht - naja wieder was gelernt :)