Foro de elhacker.net

Programación => Programación General => Mensaje iniciado por: WarZ0n3 en 11 Mayo 2013, 23:47 pm



Título: [Pascal+ASM] función ExtractMemString
Publicado por: WarZ0n3 en 11 Mayo 2013, 23:47 pm
Hace mucho que no hago nada en ASM y ya que hoy en la mañana tuve 2 horas libres y estaba aburrido, retome un pequeño manual de ASM que tenia y en 30 minutos me hice esto, demasiado simple pero muy útil en programación con sockets, espero les sirva.

Lo que hace esta función es extraer un string de otro string defectuoso, puede usarse por ejemplo, para guardar muchas listas defectuosas(en un TStringList claro esta) e ir limpiandolas.
Como explicaba esto es uno de los tantos usos que se le pueda dar, hace no mucho hice una función parecida... aquí la pueden encontrar: http://foro.elhacker.net/programacion_general/funcion_extractstring_pascal-t388927.0.html , solo que esta trabaja más a bajo nivel y con muchas mas rapidez y rendimiento.
Les dejo el código

Código
  1. program ExtractMemString;
  2.  
  3. {$APPTYPE CONSOLE}
  4.  
  5. uses
  6.  SysUtils,
  7.  Classes;
  8.  
  9. {/*******************************************\}
  10. {        ExtractMemString @Por WARZ0N3        }
  11. { Explicacion:                                }
  12. { Extrae una palabra de un string defectuoso, }
  13. { muy util en programacion con Sockets.       }
  14. { Pascal+ASM ejecuta el codigo mas optimo y   }
  15. { mucho mas rapido...                         }
  16. {/*******************************************\}
  17. { Uso:                                        }
  18. { __ExtractMemString(                         }
  19. { 'Desde_char_a_remover', variable_defectuosa,}
  20. { 'Hasta_char_a_remover', Lista_strings);     }
  21. {\*******************************************/}
  22. { Ejemplo:                                    }
  23. { __ExtractMemString('!', '&%!PALABRA-$@', '-', TStringList);}
  24. { devuelve: PALABRA                           }
  25. {/*******************************************\}
  26. function __ExtractMemString(from_s:Char; Param:pChar; to_s:Char; TsStrMem:TStringList):pChar;
  27. var
  28.  tos, fms:integer;
  29.  lnStr:integer;
  30.  
  31.  StrMem:pchar;
  32.  CpyStrMem:pchar;
  33.  allocStrMem:pchar;
  34.  lenStr:integer;
  35.  Delim:integer;
  36.  sPos:integer;
  37. begin
  38.  StrNew(@StrMem);
  39.  StrMem:=Param; { palabra defectuosa }
  40.  lenStr:=StrLen(pChar(StrMem));
  41.  
  42.  Delim:= LastDelimiter(from_s, StrMem); { desde }
  43.  sPos:=Pos(to_s, StrMem); { hasta }
  44.  asm
  45.    @@startup:
  46.      XOR EAX, EAX
  47.      MOV EAX, sPos
  48.      PUSH EAX
  49.      POP tos
  50.      DEC tos
  51.  
  52.      CMP EAX, 00000000h
  53.      JZ @plSum
  54.      JMP @pSum
  55.  
  56.      @plSum: ADD tos, EAX
  57.      @pSum:
  58.        XOR EBX, EBX
  59.        MOV EBX, lenStr
  60.        MOV lnStr, EBX
  61.  
  62.        XOR ECX, ECX
  63.        MOV ECX, delim
  64.        MOV fms, ECX
  65.        SUB tos, ECX
  66.  end;
  67.  allocStrMem:=StrAlloc(lnStr);
  68.  StrLCopy(allocStrMem, fms+StrMem, tos); //-$00000003
  69.  TsStrMem.Add(allocStrMem);
  70.  StrDispose(allocStrMem);
  71. end;
  72.  
  73. var TsStrMem:TStringList;
  74. begin
  75.  TsStrMem:= TStringList.Create;
  76.  {*** Llamada a la funcion ***}
  77.  __ExtractMemString('!', '**-!PALABRA?**', '?', TsStrMem); { devuelve PALABRA }
  78.  WriteLn(TsStrMem[0]);
  79.  TsStrMem.Free;
  80.  sleep(3500);
  81. end.
  82.