[Pascal+ASM] Funcion GetIp en asm

Iniciado por WarZ0n3, 6 Agosto 2013, 05:52 AM

0 Miembros y 1 Visitante están viendo este tema.

WarZ0n3

Hace no mucho había escrito una función en pascal usando WinSocks llamada GetIp, aquí les dejo el post: http://foro.elhacker.net/programacion_general/pascal_gathor_01_recolector_de_informacion-t396062.0.html

Básicamente conseguía la IP de un sitio pasado como parámetro, pero el ensamblado que le había hecho era bastante malo, hoy que tuve un rato, lo desensamble(bendito IDA  ;D)  y modificando el desensamblado logre reconstruir la función pero en assembler.
Reduje el código de la vez pasada para que quede bien legible, y se entienda.

Aquí la función (compilada en delphi 7), ojala les sirva  :rolleyes:

Código (pascal) [Seleccionar]

program Gathor;

{$APPTYPE CONSOLE}

(***********************************)
(*   Funcion GetIp por WarZ0n3     *)
(* Explicacion:                    *)
(* PoC usando Winsocks en assembly *)
(* Uso:                            *)
(* Consigue la IP de un sitio web  *)
(* pasado como argumento           *)
(***********************************)

uses
  SysUtils,
  Windows,
  WinSock;

var
  SITE : string;

(* Reporte por WarZ0n3
00408174  /$ 53             PUSH EBX
00408175  |. 81C4 70FEFFFF  ADD ESP,-190
0040817B  |. 54             PUSH ESP                                 ; /pWSAData
0040817C  |. 6A 01          PUSH 1                                   ; |RequestedVersion = 1 (1.0.)
0040817E  |. E8 91FFFFFF    CALL <JMP.&wsock32.WSAStartup>           ; \WSAStartup
00408183  |. 90             NOP
00408184  |. 90             NOP    // Solo para demostracion en el stack
00408185  |. 90             NOP
00408186  |. 68 B8814000    PUSH Project2.004081B8                   ; /Name = "www.youtube.com"
0040818B  |. E8 7CFFFFFF    CALL <JMP.&wsock32.gethostbyname>        ; \gethostbyname
00408190  |. 8B40 0C        MOV EAX,DWORD PTR DS:[EAX+C]
00408193  |. 33D2           XOR EDX,EDX
00408195  |. 90             NOP
00408196  |. 90             NOP   // Solo para demostracion en el stack
00408197  |. 90             NOP
00408198  |. 90             NOP
00408199  |. 8B0490         MOV EAX,DWORD PTR DS:[EAX+EDX*4]
0040819C  |. FF30           PUSH DWORD PTR DS:[EAX]
0040819E  |. E8 61FFFFFF    CALL <JMP.&wsock32.inet_ntoa>
004081A3  |. 8BD8           MOV EBX,EAX
004081A5  |. 90             NOP
004081A6  |. 90             NOP  // Solo para demostracion en el stack
004081A7  |. 90             NOP
004081A8  |. 90             NOP
004081A9  |. E8 6EFFFFFF    CALL <JMP.&wsock32.WSACleanup>           ; [WSACleanup
004081AE  |. 8BC3           MOV EAX,EBX
004081B0  |. 81C4 90010000  ADD ESP,190
004081B6  |. 5B             POP EBX
004081B7  \. C3             RETN
*)
function
  GetIP(): PChar; assembler;
asm
    PUSH EBX
    ADD ESP, 0FFFFFE70h
    PUSH ESP
    PUSH 1
    CALL WSASTARTUP
    NOP
    NOP
    NOP
    PUSH SITE // 04081B4h
    CALL GetHostByName
    MOV EAX, [EAX+0Ch]
    XOR EDX, EDX
    NOP
    NOP
    NOP
    MOV EAX, [EAX+EDX*4]
    PUSH DWORD PTR [EAX]
    CALL INET_NTOA
    MOV EBX, EAX
    CALL WSACleanup
    MOV EAX, EBX
    ADD ESP, 190h
    POP EBX
    RETN
end;

begin
  SITE:= ParamStr(1);
  WriteLn('[Sitio web]: ', SITE, #13#10+'[Ip]: ', GetIP());
 
end.