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?
Idea para una rutina de comparacion?
Comenzado por
c0lo
, jul 15 2011 11:26
6 respuestas en este tema
#1
Escrito 15 julio 2011 - 11:26
#2
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:
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.
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
s:= TFileStream.create(fichero, etc... ); largo:= length(mipalabra); count:= 0; result:= false; while (s.position < s.size) and (not result) do begin letra:= leeunbytedelstream(s); //s.read o lo que sea if letra=mipalabra[count] then //si [count] no es "zero based" necesitaria un +1 inc(count) else count:= 0; if (count=largo) then result:= true; 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.
#3
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.
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.
#4
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
No ingreso un archivo si no una cadena
#5
Escrito 15 julio 2011 - 01:30
Y en esa cadena ¿sólo aparece la ruta de un archivo?
Saludos.
Saludos.
#6
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:
La cual hace un buen trabajo al parecer:
Estoy intentando pulirlo o mejor dicho pasarlo a mejor pero no entiendo un poco de todo al parecer.
cpp
int __cdecl sub_10002126(int a1, int a2) { int result; // eax@1 int v3; // edi@1 int v4; // eax@3 __int16 v5; // dx@3 int v6; // ecx@4 int v7; // edx@5 result = a1; v3 = a1; if ( *(WORD *)a2 ) { if ( *(WORD *)a1 ) { v5 = *(WORD *)a1; v4 = a1 - a2; while ( 1 ) { v6 = a2; if ( v5 ) break; LABEL_8: if ( !*(WORD *)v6 ) goto LABEL_12; v3 += 2; v5 = *(WORD *)v3; v4 += 2; if ( !*(WORD *)v3 ) goto LABEL_10; } while ( 1 ) { v7 = *(WORD *)v6; if ( !(WORD)v7 ) break; if ( *(WORD *)(v4 + v6) == v7 ) { v6 += 2; if ( *(WORD *)(v4 + v6) ) continue; } goto LABEL_8; } LABEL_12: result = v3; } else { LABEL_10: result = 0; } } return result; }
La cual hace un buen trabajo al parecer:
cpp
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.
#7
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ó:
ejemplo:
Saludos.
cpp
wchar_t * wcsstr(const wchar_t *s1, const wchar_t *s2);
ejemplo:
cpp
if (wcsstr(AppName, ext) == 0) MessageBox(0, "SubCadena no encontrada" , "Error", MB_OK);
Saludos.