deliriun
28-12-2015, 22:19:59
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:::
.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:::
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.
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:::
.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:::
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.