Ir al contenido


Foto

Idea para una rutina de comparacion?


  • Por favor identifícate para responder
6 respuestas en este tema

#1 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 15 julio 2011 - 11:26

Hola a todos mi idea es la siguiente hacer una funcion con dos entradas de tal forma:

Analizar(LPCWSTR Source, LPCWSTR QueBuscar)

o algo asi, de tal modo que lo que se ingresa que podria ser una direccion de un archivo me analice si dentro de el esta la palabra QueBuscar.

Analizar('D:\Escritorio\Delphi Tools\Hola.exe',L".dll";

Me dira que no e cargado una dll .. o algo asi ejemplos pleasE?

  • 0

#2 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 15 julio 2011 - 11:48

Si como he entendido lo que quieres es buscar un literal dentro de un fichero binario, yo lo abriria como stream y leeria los bytes de uno en uno buscando el primer byte de mi palabra a buscar, cuando lo encuentre, miro a ver si ell siguiente es el que debe... si lo es, el siguiente, etc.

Si usas un contador de bytes que coinciden hasta ahora, es te diria por que letras vas, y si llega a ser length(mypalabra), acabarias... en medio pseudocodigo:


delphi
  1. s:= TFileStream.create(fichero, etc... );
  2. largo:= length(mipalabra);
  3. count:= 0;
  4. result:= false;
  5. while (s.position < s.size) and (not result) do begin
  6.   letra:= leeunbytedelstream(s); //s.read o lo que sea
  7.   if letra=mipalabra[count] then //si [count] no es "zero based" necesitaria un +1
  8.     inc(count)
  9.   else
  10.     count:= 0;
  11.   if (count=largo) then result:= true;
  12. end;

Escrito "de memoria", seguramente hay algun fallo tonto en ese codigo, pero bueno, es la idea, simple y eficiente.

nota: ojo segun que version de delphi has de tener en cuenta el tema de los unicode, un byte podria no ser lo mismo que unas letra de un string, yo uso d7 y no tengo estos problemas.
  • 0

#3 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 julio 2011 - 11:57

No termino de entender tu propósito. Intuyo que quieres saber si un ejecutable importa una dll...

Eso se puede saber analizando el PE del ejecutable. Hace algún tiempo escribí y publique una potente herramienta que explora el PE. El código para hacer eso está aquí: Explorar datos y funciones exportadas e importadas en el formato PE y en los enlaces que aparezcan.


Saludos.
  • 0

#4 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 15 julio 2011 - 12:05

No un fichero, si no ingreso una cadena y que me lea dentro de la cadena si dicho archivo que esta indicando o que la cadena tiene es o tiene extension que yo pueda variar tal como .dll, .exe, .dat or quizas .ave

No ingreso un archivo si no una cadena
  • 0

#5 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 julio 2011 - 01:30

Y en esa cadena ¿sólo aparece la ruta de un archivo?

Saludos.
  • 0

#6 c0lo

c0lo

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 241 mensajes
  • LocationLima-Peru

Escrito 15 julio 2011 - 02:38

Desamblando un archivo y usando el IDA para reconstruirlo en C. Encontre o mejor dicho agarre prestado esta funcion:


cpp
  1. int __cdecl sub_10002126(int a1, int a2)
  2. {
  3.   int result; // eax@1
  4.   int v3; // edi@1
  5.   int v4; // eax@3
  6.   __int16 v5; // dx@3
  7.   int v6; // ecx@4
  8.   int v7; // edx@5
  9.  
  10.   result = a1;
  11.   v3 = a1;
  12.   if ( *(WORD *)a2 )
  13.   {
  14.     if ( *(WORD *)a1 )
  15.     {
  16.       v5 = *(WORD *)a1;
  17.       v4 = a1 - a2;
  18.       while ( 1 )
  19.       {
  20.         v6 = a2;
  21.         if ( v5 )
  22.           break;
  23. LABEL_8:
  24.         if ( !*(WORD *)v6 )
  25.           goto LABEL_12;
  26.         v3 += 2;
  27.         v5 = *(WORD *)v3;
  28.         v4 += 2;
  29.         if ( !*(WORD *)v3 )
  30.           goto LABEL_10;
  31.       }
  32.       while ( 1 )
  33.       {
  34.         v7 = *(WORD *)v6;
  35.         if ( !(WORD)v7 )
  36.           break;
  37.         if ( *(WORD *)(v4 + v6) == v7 )
  38.         {
  39.           v6 += 2;
  40.           if ( *(WORD *)(v4 + v6) )
  41.             continue;
  42.         }
  43.         goto LABEL_8;
  44.       }
  45. LABEL_12:
  46.       result = v3;
  47.     }
  48.     else
  49.     {
  50. LABEL_10:
  51.       result = 0;
  52.     }
  53.   }
  54.   return result;
  55. }

La cual hace un buen trabajo al parecer:


cpp
  1. v13 = sub_10002126((int)lpApplicationName, (int)L".dll") != 0;

Estoy intentando pulirlo o mejor dicho pasarlo a mejor pero no entiendo un poco de todo al parecer.
  • 0

#7 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 15 julio 2011 - 03:09

En C ya existe una función que busca una subcadena en una cadena. Devuelva un puntero al inicio de la subcadena o nulo si no la encontró:




cpp
  1. wchar_t * wcsstr(const wchar_t *s1, const wchar_t *s2);


ejemplo:

cpp
  1. if (wcsstr(AppName, ext) == 0)
  2.   MessageBox(0, "SubCadena no encontrada" , "Error", MB_OK);


Saludos.
  • 0




IP.Board spam blocked by CleanTalk.