Funktion der Mask:
"?" = egal was für ein Wert
"x" = der vorgegebene Wert wird gesucht
Beispiel:
Signatur "0F 25 34 FF"
Maske "xx?x"
Folglich sucht es sich alle Signaturen aus die mit 0F25 anfangen und dann einen beliebigen Wert. Es muss dann mit FF aufhören. Beispiele für dich gefundenen Resultate:
0F25AAFF
0F2543FF
0F2511FF
0F2534FF
PHP Code:
#include "CSigScan.h"
CSigScan::CSigScan(char *newFile)
{
this->file = newFile;
this->length = 0;
this->offset = 0;
}
int CSigScan::FindSignature(unsigned char *signature, char *sigmask, unsigned int len)
{
// Definiere Private Member der , der Parameter
this->sig = signature;
this->mask = sigmask;
this->length = len;
// Lokale Variable deklarieren
unsigned char result;
int ofc = 0; // Offset beim Übeprüfen
unsigned int i; // Counter beim Überprüfen
// Datei Laden ( Binär Modus )
ifstream data(this->file,ios_base::binary);
// Falls Datei nicht exisitiert
if(!data.is_open())
cout << "Can´t find file to open";
// Falls Datei exisiert, auslesen und nach der Signatur übeprüfen
while(data)
{
for(i = 0;i < len;i++)
{
result = data.get();
if((mask[i] != '?') && (sig[i] != result))
break;
else
ofc++;
}
// Falls Zähler gleich der Länge ist, ist die Signatur gefunden worden und kann returned werden.
if(i == len)
return this->offset;
else if(i > 0)
offset += ofc;
// Offsets erhöhen
ofc = 0;
this->offset++;
}
}
PHP Code:
include "CSigScan.h"
int main(int argc, char* argv[])
{
// Datei vom Parameternamen laden
CSigScan S(argv[1]);
int result = S.FindSignature((unsigned char *)
"\x48\xBF\x41\x00\xD0", // Signatur
"xx??x", // Mask
5); // Bytes länge
// Offset ausgeben in HEX
cout << uppercase << hex << result << endl;
cin.get();
/* Exitcode */
return 0;
}






