Signaturen Scanner

03/31/2009 15:28 mileseven#1
Ich stell mal hier mein Code zum meinem Signaturen Scanner rein. Damit könnt bestimmte Werte/Signaturen scannen, worauf die Adresse wiedergegeben wird.

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 *signaturechar *sigmaskunsigned 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(
0;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(== len)
            return 
this->offset;
        else if(
0)
            
offset += ofc;
 
        
// Offsets erhöhen
        
ofc 0;
        
this->offset++;
    }

Beispiel:

PHP Code:
include "CSigScan.h"

int main(int argccharargv[])
{
    
// 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;