Ejecutar llamadas en ASM inyectado en una DLL

Iniciado por Arkhin, 20 Marzo 2013, 01:55 AM

0 Miembros y 2 Visitantes están viendo este tema.

Arkhin

Buenas, hace tiempo ya que programo, pero no en este magnifico lenguaje. Programo en Visual Basic hace ya un tiempo largo y cuando empeze a investigar y conocer el debuggin en ensamblador, comenze a aumentar mis horizontes. Tengo algo basico en programacion en C, pero tengo codigos base de inyecciones de DLLS como para guiarme.
La idea que tengo es la siguiente, de por si ya se como inyectarme en un programa por medio de una dll. Ahora, estando YO inyectado en ese programa, ya soy parte del programa por lo tanto si fuera ASM y quisiera hacer una llamada a X funcion del programa, podria hacerlo libremente ya que soy parte dle mismo, por lo tanto puedo llamar a adress del mismo. Mi intención es inyectarme en un juego online, y llamar a funciones como por ejemplo, para equipar/desequipar un objeto. EL juego esta hecho en VB por lo tanto es bastante facil manipularlo, de hecho por dar un ejemplo, con llamar al adress 004BC23A (Por dar un ejemplo) ya estaria equipando/desequipando el objeto seleccionado, y editando una variable de memoria podriamos editar el objeto que seleccionó. Lo que quiero hacer es poder llamar a ese adress desde la dll en C, y luego de buscar realmente no encuentro como hacerlo, si pueden ayudarme con sus grandes conocimientos se los agradeceria.

x64core

Cita de: Arkhin en 20 Marzo 2013, 01:55 AM
Buenas, hace tiempo ya que programo, pero no en este magnifico lenguaje. Programo en Visual Basic hace ya un tiempo largo y cuando empeze a investigar y conocer el debuggin en ensamblador, comenze a aumentar mis horizontes. Tengo algo basico en programacion en C, pero tengo codigos base de inyecciones de DLLS como para guiarme.
La idea que tengo es la siguiente, de por si ya se como inyectarme en un programa por medio de una dll. Ahora, estando YO inyectado en ese programa, ya soy parte del programa por lo tanto si fuera ASM y quisiera hacer una llamada a X funcion del programa, podria hacerlo libremente ya que soy parte dle mismo, por lo tanto puedo llamar a adress del mismo. Mi intención es inyectarme en un juego online, y llamar a funciones como por ejemplo, para equipar/desequipar un objeto. EL juego esta hecho en VB por lo tanto es bastante facil manipularlo, de hecho por dar un ejemplo, con llamar al adress 004BC23A (Por dar un ejemplo) ya estaria equipando/desequipando el objeto seleccionado, y editando una variable de memoria podriamos editar el objeto que seleccionó. Lo que quiero hacer es poder llamar a ese adress desde la dll en C, y luego de buscar realmente no encuentro como hacerlo, si pueden ayudarme con sus grandes conocimientos se los agradeceria.

¿Así que cual es el problema?
Creo que todo lo has dicho, buscar la dirección de la función, analizarla ( convención de llamada, Number de parametros , Tipo de los parametros, etc )
Programar la DLL, inyectarla, Comprobar algunos patrones posibles ( recomendable ), Llamar a la funcíon. Se más especifico con tu problema, lo que quiero decir es,
Ya que dices que tienes algunos codigos de inyecciónes y al parecer sabes lo que estas haciendo, Cual es el problema?
Por cierto, esto no tiene nada que ver con ASM y C/C++. todo lo mencionado se puede hacer tanto en C/C++ como en Ensamblador.

85

#2
Si lo que te dijeron, importante la convención de llamada para determinar como se maneja el RETURN. La cantidad y tipo de los parámetros, eso lo verás si te resulta posible en un desensamblador y para el tipo lo mejor sería que puedas ver la pila (en el depurador) en el momento que es llamada la función, sería la mejor idea. Si ya tenés el prototipo de la función, entonces tan sólo te construís un puntero a función y lo llamás, si es que para vos se arregla tan sólo llamando a esa función.
El código si lo ejecutás en tu DLL, de otra forma podés considerar interceptar alguna función que te interese para que puedas ejecutar tu código.
Son ideas. También puede usar ASM en línea en C.
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/

Arkhin

Hola, gracias por las respuestas. Lo que no se hacer es las llamadas a un call en asm, desde C. No se como codearlas, como hacerlas.

En este foro ya dan una base de una inyección de DLL:
http://www.daniweb.com/software-development/cpp/threads/181713/dll-injection-cc

Pienso basarme en eso para hacer las llamadas cuando la dll se inyecta.

Otra cosa, habria alguna minima posibilidad de hacerlo en visual basic con ThunderVB? (Es un plugin el cual permite ejecutar codigo en C y en ASM dentro de VB6)

x64core

Cita de: Arkhin en 21 Marzo 2013, 01:56 AM
Hola, gracias por las respuestas. Lo que no se hacer es las llamadas a un call en asm, desde C. No se como codearlas, como hacerlas.

En este foro ya dan una base de una inyección de DLL:
http://www.daniweb.com/software-development/cpp/threads/181713/dll-injection-cc

Pienso basarme en eso para hacer las llamadas cuando la dll se inyecta.

Otra cosa, habria alguna minima posibilidad de hacerlo en visual basic con ThunderVB? (Es un plugin el cual permite ejecutar codigo en C y en ASM dentro de VB6)

Un "Call" en ASM, desde C?
Quieres decir llamar una función escrita en ASM y llamarla desde C?
De todas maneras ya he dicho lo que necesitas, luego que tienes la función objetivo, simplemente la llamas.
Yo mucho antes programaba en VB 6.0, estoy seguro que no necesitas de ese plugin.


Arkhin

Lo que quiero es escribir un call 005D88D0 en c, o en vb.
Mi idea es estar inyectado en la aplicacion mediante una dll, y hacer llamadas a adress dentro de esa aplicación. Al estar inyectado, puedo hacer las llamadas directamente ya que estoy dentro de los adress de la app.
Lo que no se hacer, es como escribir ese "call 005D88D0" dentro de C o VB, preferentemente vb ya que es el lenguaje con el cual me manejo mejor, pero me han dicho que no se puede, solo en C pueden hacerse llamadas a codigos en ASM.

x64core

Cita de: Arkhin en 21 Marzo 2013, 03:20 AM
Lo que quiero es escribir un call 005D88D0 en c, o en vb.
Mi idea es estar inyectado en la aplicacion mediante una dll, y hacer llamadas a adress dentro de esa aplicación. Al estar inyectado, puedo hacer las llamadas directamente ya que estoy dentro de los adress de la app.
Lo que no se hacer, es como escribir ese "call 005D88D0" dentro de C o VB, preferentemente vb ya que es el lenguaje con el cual me manejo mejor, pero me han dicho que no se puede, solo en C pueden hacerse llamadas a codigos en ASM.

Como ya he dicho lo primero es analizar la función a la que quieres llamar y luego para comodidad puedes hacerte un tipo definido de
un puntero a una función, por ejemplo:

typedef INT (__stdcall MyPointer*)(INT,INT)

este es un puntero a una funcion con __stdcall como convencion de llamada, dos parametros de tipo INT, y como retorno se espera un
INT tambíen. luego declarar una variable de tipo "MyPointer" y asignarle la dirección de la función y llamar:

MyPointer Function = 0x005D88D0;
INT RetOfFunction = Function(0x10,0x20);

en VB lo más rapido que se me ocurre seria hacer un array de bytes con instrucciones como estas:

PUSH param
PUSH Param
CALL Address


Copiar esas instrucciones en memoria virtual reservada ( VirtualAlloc ), establecer los valores ( parametros, direccion de la funcion ), y luego llamar a
la dirección de la memoria virtual reservada.  si DEP esta desactivado también puedes usar CreateThread, CallWindowProc. Apuesto a que existen muchas
maneras más.


Arkhin

Realmente admiro tus conocimientos pero lamentablemente los mios no llegan a tanto. Hasta lo que entendi lo que estas haciendo ahi es leer en la memoria el adress 005D88D0. Lo que quiero no es leer el adress, sino hacer un call a ese adress. La app es una app en vb6, y ese adress es donde comienza el clickeo de un IMAGE. Lo que quiero hacer yo ese que ese image se "clickee", llamando al adress donde empieza el clickeo del image. Ya probe metiendo un "call adress" dentro de timers en la aplicacion, y funciona perfectamente, es lo mismo que hacer click en el image, lo que quiero hacer es llamarlo yo mismo desde una app asi controlo cuando lo llamo y cuando no. Gracias por sus ayudas

x64core

Cita de: Arkhin en 21 Marzo 2013, 04:29 AM
Realmente admiro tus conocimientos pero lamentablemente los mios no llegan a tanto. Hasta lo que entendi lo que estas haciendo ahi es leer en la memoria el adress 005D88D0. Lo que quiero no es leer el adress, sino hacer un call a ese adress. La app es una app en vb6, y ese adress es donde comienza el clickeo de un IMAGE. Lo que quiero hacer yo ese que ese image se "clickee", llamando al adress donde empieza el clickeo del image. Ya probe metiendo un "call adress" dentro de timers en la aplicacion, y funciona perfectamente, es lo mismo que hacer click en el image, lo que quiero hacer es llamarlo yo mismo desde una app asi controlo cuando lo llamo y cuando no. Gracias por sus ayudas

Pequeña dll, simplemente cambia el valor de la constante FUNCTION_ADDRESS a la dirección de la función ( Programas en VB 6.0 por defecto no tienen tabla de relocalización asi que puedes escribirla directamente ) , cambia el tipo de definición de la funcion e  inyectala en el proceso y listo cuando presiones el boton llamara a la función.


typedef INT (WINAPI* MyPointer)(INT,INT);

#define FUNCTION_ADDRESS 0x005D88D0


HINSTANCE hInstance;
HWND hWMain;
HWND hWButton;
MyPointer FunctionTarget = (MyPointer)FUNCTION_ADDRESS;

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   INT mRet;

   switch (message)
{
   case WM_COMMAND:
       /* call Function */
       mRet = FunctionTarget(10,10);
        break;
   case WM_DESTROY:
       PostQuitMessage(0);
       break;
   default:
       return DefWindowProc(hWnd, message, wParam, lParam);
}

return 0;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
WNDCLASSEXW    wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style        = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra     = 0;
wcex.cbWndExtra     = 0;
wcex.hInstance = hInstance;
wcex.hIcon        = 0;
wcex.hCursor = 0;
wcex.hbrBackground = (HBRUSH)COLOR_BTNSHADOW;
wcex.lpszMenuName = 0;
wcex.lpszClassName = TEXT("PROJECT");
wcex.hIconSm = 0;

return RegisterClassExW(&wcex);
}

INT MessageLoop()
{
   MSG msg;

   while(GetMessageW(&msg, NULL, 0, 0) > 0)
   {
       TranslateMessage(&msg);
       DispatchMessageW(&msg);
   }
   return 0;
}


INT InitDialog(HINSTANCE hInst)
{
   if(hInst)
       hInstance = hInst;
   else
       hInstance = GetModuleHandleW(NULL);

   if(!MyRegisterClass(hInstance))
       return FALSE;

   hWMain = CreateWindowW(TEXT("PROJECT"),L"PROJECT",DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU,
                           CW_USEDEFAULT, CW_USEDEFAULT,200,200,NULL,NULL,hInstance,NULL);
   if(!hWMain)
       return FALSE;

   hWButton = CreateWindowW(TEXT("BUTTON"),TEXT("CALL ADDRESS"),WS_CHILDWINDOW | WS_VISIBLE,
                           10,10,150,150,hWMain,NULL,hInstance,NULL);
   if(!hWButton)
       return FALSE;


   ShowWindow(hWMain, SW_SHOW);
   UpdateWindow(hWMain);
   MessageLoop();

   return FALSE;
}

BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpReserved )
{
   switch( fdwReason )
   {
   case DLL_PROCESS_ATTACH:
       CloseHandle(CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)InitDialog,hinstDLL,0,NULL));
       break;
   case DLL_THREAD_DETACH:
       break;
   case DLL_PROCESS_DETACH:
       break;
   }
   return TRUE;
}

Arkhin

Te agradezco muchisimo por el codigo, aunque lamentablemente tengo errores al momento de compilar, estoy usando Dev C++. En cada string que has insertado en el codigo, responde a un error: Cannot Convert const char[8] to const WCHAR* in assignment.
Deberia primero declararlas como string, asignarlas, y luego llamarlas?