Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Traduciendo código ASM a Delphi (https://www.clubdelphi.com/foros/showthread.php?t=89621)

deliriun 28-12-2015 22:19:59

Traduciendo código ASM a Delphi
 
Hola muy buen día a todos.

Estaba con un grupo de personas haciendo un programa y hubo una equivocación en una de las Dll, del error nos dimos cuenta
después porque no era muy llamativo, y ya no teníamos el código de la Dll.

Por ende alguien hizo una Dll en ASM (Usando RadAsm) para "Reparar" de una manera sencilla y practica el error en uno de los valores...
Sin embargo por motivos personales decidió dejar el proyecto, aunque dejando sus códigos.

Y bueno el código en asm funciona bien, yo no sé prácticamente nada de asm, por ende considere traducir el código de Asm a Delphi para
tener un poco más de control.

El código en Asm es similar al siguiente:::

Código:

.386

.model flat,stdcall
option casemap:none
      include windows.inc
include user32.inc
include kernel32.inc
includelib user32.lib
includelib kernel32.lib
         
          Tarea1 PROTO
   
    .data
       
        Libreria                db        "DatosHWDER.dll",0
 Funcion1 db "Valor1_HWDER",0
        Funcion2 db "Valor2_HWDER",0
       
 .data?

.code
Punto_de_Inicio proc hInstance:HINSTANCE, reason:DWORD, reserved1:DWORD
       
        .IF (reason == DLL_PROCESS_ATTACH)
                mov eax,TRUE
               
                invoke CreateThread,NULL,NULL,ADDR Tarea1 ,NULL,NULL,NULL
               
                .ELSEIF (reason == DLL_PROCESS_DETACH)
                invoke ExitProcess, NULL
        .ENDIF
        ret
Punto_de_Inicio Endp

Tarea1 proc
LOCAL x:DWORD
LOCAL Aux1:DWORD
LOCAL Aux2:DWORD

        tecla:
       
 jz tecla
   
        invoke GetModuleHandle, addr Libreria
        invoke GetProcAddress, eax, addr Funcion1
        mov Aux1,eax
       
        invoke GetModuleHandle, addr Libreria
        invoke GetProcAddress, eax, addr Funcion2
        mov Aux2,eax
       
        mov esi,Aux2
        mov edi,Aux1
        mov ecx,96
        xor edx,edx
               
        .REPEAT

                mov dl, byte ptr [esi]
                mov byte ptr [edi],dl
                inc esi
                inc edi
               
        .UNTILCXZ
       
        jmp tecla
       
        ret

Tarea1 endp


End Punto_de_Inicio


Y con mi poca experiencia en Asm lo he intentado traducir un poco en Delphi:::

Código Delphi [-]
 library Project5;

uses
  Vcl.Dialogs,
  Windows;

var
 Funcion1:AnsiString;
  Funcion2:AnsiString;
  Libreria:AnsiString;
  Retorno: Cardinal;

procedure Reserved1();
   var
   Aux1:procedure;
   Aux2:procedure;

begin
  Aux1:= GetProcAddress(GetModuleHandleA(PAnsiChar(Libreria)), PAnsiChar(Funcion1));
  Aux2 := GetProcAddress(GetModuleHandleA(PAnsiChar(Libreria)), PAnsiChar(Funcion2));

while(true) do begin

asm

  mov esi,Aux2
  mov edi,Aux1

   end;

asm

  mov dl, byte ptr [esi]
  mov byte ptr [edi],dl
  inc esi
  inc edi

      end;
    end;
  end;

procedure DllMain(reason: Integer);
begin
  if reason = DLL_PROCESS_ATTACH then begin

  Funcion1 := 'Valor1_HWDER';
  Funcion2 := 'Valor2_HWDER';
  Libreria :=  'DatosHWDER.dll';

CreateThread(nil,0,Pointer(@Reserved1),nil,0,Retorno);

end;
end;

begin
 DllProc := DllMain;
 DllMain(DLL_PROCESS_ATTACH);
end.

Sin embargo al momento de compilar el código en RadAsm todo bien, la Dll funciona, pero cuando uso la Dll en Delphi no me resulta...

¿A qué se debe esto, he omitido algo en la traducción que hace que no ande?

De antemano, muchas gracias.

Casimiro Notevi 28-12-2015 23:25:23

Cita:

Empezado por deliriun (Mensaje 500858)
... pero cuando uso la Dll en Delphi no me resulta...

Hola, ¿qué quiere decir "no me resulta"?

deliriun 28-12-2015 23:35:28

Cita:

Empezado por Casimiro Notevi (Mensaje 500861)
Hola, ¿qué quiere decir "no me resulta"?

Hola Casimiro, pues cuando cargo la Dll hecha en Delphi simplemente no efectúa su función, en resumen no hace aparentemente nada

Osorio 29-12-2015 14:50:51

Sin profundizar en nada, por aqui se ve un ciclo infinito. Como para revisar.

Código Delphi [-]
while(true) do begin

deliriun 29-12-2015 17:41:13

Osorio,

Si, supuse que el ciclo infinito era esto en ASM:::

Código:

.REPEAT

                mov dl, byte ptr [esi]
                mov byte ptr [edi],dl
                inc esi
                inc edi
               
        .UNTILCXZ


ecfisa 30-12-2015 05:00:57

Hola deliriun.
Cita:

Empezado por deliriun (Mensaje 500885)
...
Si, supuse que el ciclo infinito era esto en ASM:::
Código:

  .REPEAT

      mov dl, byte ptr [esi]
      mov byte ptr [edi],dl
      inc esi
      inc edi
               
  .UNTILCXZ


No se trata de un ciclo infinito, el registro CX entra con un valor decimal igual a 96 en la línea:
Código:

  ...
  mov ecx, 96  ; CX = 96
  ...

Mientras que la sentencia UNTILCXZ decrementa automáticamente el valor de CX en cada iteración, finalizando el ciclo cuando CX es igual a 0.

Saludos :)

escafandra 30-12-2015 13:36:31

Una pregunta. ¿Para que quieres una dll que cambie en tiempo de ejecución valores de funciones o variables de un proceso?
Creo que si buscas ayuda deberías comentar con sinceridad tu problema, ten en cuenta que la ayuda que se te preste requiere un tiempo altruista para dedicarte. La ayuda en el foro se basa en la confianza mutua. El código que expones hace cosas que no son habituales, bueno, lo son en técnicas de hacking o craking.

Saludos.


La franja horaria es GMT +2. Ahora son las 08:44:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi