.exe Datei über CFile auslesen!
-
Hallo Leute!
Ich versuche einen Kopierschutzscanner zu basteln. Da ich aber meistens nur .exe und .dll Dateien zu scannen habe kommt es zu Problemen. Der nachfolgende Quellcode versucht den string "BoG" in einer Datei zu finden. Das Problem ist, dass das Programm nur Teile von der Datei ließt, soll heißen dort wo "BoG" vorkommt würd nicht gelesen. Das liegt scheinbar daran das unmittelbar vor "BoG" ein Haufen voller "00" Zeichen kommt also in Hexadezimal ausgedrückt. Einfach mal ne .exe mit nem Hexeditior öffnen und dann sieht man es.
Ich habe versucht heraus zu finden woran es liegen könnte und bin mir sicher, dass es mit den "nOpenFlags" zu tun hat. Hab davon aber keine Ahnung. Wäre nett wenn mir einer eine Lösung schreiben könnte oder ne andere Klasse als CFile die besser binär einlesen kann.
Kopierschutz = ""; // ist ein CString char str[1024]; int bytes = sizeof(str); // bytes würd auf 1024 gesetzt CFile datei(adresse, CFile::modeRead | CFile::osNoBuffer); //adresse ist ein CString while (bytes == sizeof(str)) { bytes = datei.Read(str, sizeof(str)); //1024 Zeichen werden in str eingelesen und es würd die Zahl der tatsächlich gelesenen bytes auf die Variable bytes übertragen Kopierschutz = str; if (Kopierschutz.Find("BoG", 0) != -1) //Es würd im string Kopierschutz nach "BoG" gesucht. { textbox.AddString("SafeDisc gefunden!"); } }
-
Ich versteh zwar jetzt nicht wirklich, warum er aufhoert zu lesen, aber wenn du schon selbst meinst, es seien die Opening Flags dann teste doch mal CFile::typeBinary. Damit öffnet man die Datei binaer. Vllt bringt dich das ja weiter.
Ansonsten kannst du das Einlesen auch mit der Klasse fstream machen. Ich würde aber nicht sagen, dass das jetzt viel an deinem Problem aendern wuerde.
Gruss,
DeSoVoDaMU
-
Erstmal danke für die Antwort. Ich habe es mit CFile::typeBinary probiert, hat sich leider nichts geändert. Danach hab ich es mit fstream versucht, zwar läuft fstream scheinbar schneller als CFile, allerdings klappts es auch nicht richtig. Kennt jemand vielleicht noch ein Atribut welches ich hinzufügen muss, oder kennt jemand ne andere Dateiklasse.
Hier erstmal mein Code für fstream
Kopierschutz = ""; char str[1024]; ifstream datei; datei.open(adresse, ios::binary | ios_base::in); while (datei.eof() != true) { datei.read(str, sizeof(str)); Kopierschutz = str; if (Kopierschutz.Find("BoG", 0) != -1) { textbox.AddString("SafeDisc gefunden!"); } } datei.close();
-
EricP88 schrieb:
Hallo Leute!
Ich versuche einen Kopierschutzscanner zu basteln. Da ich aber meistens nur .exe und .dll Dateien zu scannen habe kommt es zu Problemen. Der nachfolgende Quellcode versucht den string "BoG" in einer Datei zu finden. Das Problem ist, dass das Programm nur Teile von der Datei ließt, soll heißen dort wo "BoG" vorkommt würd nicht gelesen. Das liegt scheinbar daran das unmittelbar vor "BoG" ein Haufen voller "00" Zeichen kommt also in Hexadezimal ausgedrückt. Einfach mal ne .exe mit nem Hexeditior öffnen und dann sieht man es.
Ich habe versucht heraus zu finden woran es liegen könnte und bin mir sicher, dass es mit den "nOpenFlags" zu tun hat. Hab davon aber keine Ahnung. Wäre nett wenn mir einer eine Lösung schreiben könnte oder ne andere Klasse als CFile die besser binär einlesen kann.
Kopierschutz = ""; // ist ein CString char str[1024]; int bytes = sizeof(str); // bytes würd auf 1024 gesetzt CFile datei(adresse, CFile::modeRead | CFile::osNoBuffer); //adresse ist ein CString while (bytes == sizeof(str)) { bytes = datei.Read(str, sizeof(str)); //1024 Zeichen werden in str eingelesen und es würd die Zahl der tatsächlich gelesenen bytes auf die Variable bytes übertragen Kopierschutz = str; if (Kopierschutz.Find("BoG", 0) != -1) //Es würd im string Kopierschutz nach "BoG" gesucht. { textbox.AddString("SafeDisc gefunden!"); } }
Das Problem liegt meiner Meinung nach nich bei den opening Flags sondern an der Variable 'Kopierschutz' vom Typ string bzw. CString! Du liest binäre Daten in 'str' ein. ok. ABER, wenn jetzt in 'str' z.B. die folgenden Daten sind: 0x32, 0x00, 0x61, 0x60... dann ist in der CString variable nur der Wert 0x32. Der Grund: CString ist selbstterminierend. und kann somit keine Binärdaten aufnehmen. Oder anders: Sobald ein Terminalsymbol gelesen wird, wird das Kopieren in die Variable beendet.
Da du aber bewusst Binärdaten öffnest (eben z.B. aus *.exe), dann wirst du auch 0x00er lesen etc.Fazit: Dein Code funktioniert nur mit ASCII Files.
hope that input helped
-
Besten Dank für die Antwort.
Muss ich mal schauen, ob ich es schaffe in einem char array, einen string zu suchen. Nettes Forum da werd ich mich doch gleich mal registrieren.
-
Also ich habe ne Lösung gefunden allerdings ist die sinnlos. Es ist möglich mit datei.get(zeichen) jedes Zeichen einzeln ein zu lesen und dann mit einer riesigen if Verschachtelung letzendlich zum Ziel zu kommen. (zeichen ist char und datei ifstream) Kennt jemand eine string Klasse die nicht "selbstterminierend" ist?
-
EricP88 schrieb:
Also ich habe ne Lösung gefunden allerdings ist die sinnlos. Es ist möglich mit datei.get(zeichen) jedes Zeichen einzeln ein zu lesen und dann mit einer riesigen if Verschachtelung letzendlich zum Ziel zu kommen. (zeichen ist char und datei ifstream) Kennt jemand eine string Klasse die nicht "selbstterminierend" ist?
hmm nein kenne ich leider auch nicht.
aber weshab eine riesige If-Else Verschachtelung anwenden?
Stelle ich mir das nun so zu einfach vor?//pseudo code for(long i=0; i<chardatalength; i++){ if(input[i]=='B'){ if(input[i+1]=='o'){ if(input[i+2]=='G'){ //success } } } }
-
Genau so wie du es geschrieben hast meine ich es auch, allerdings ist BoG nur ein Test gewesen, der wirkliche SafeDisc String ist viel größer (BoG_ *90.0&!! Yy>) und danach kommt noch die Versionsnummer X.XX.XXXX und dann isses ne riesen if Verschachtelung und braucht recht lange zu dem gibt es ja nicht nur SafeDisc sondern noch mindestens 10 andere Kopierschutzmechanismen. Somit dauerts dann mit einer if Verschachtelung zu lang. Aber da mir nichts anderes übrig bleibt werd ich so machen und für das suchen in einem char Array ne eigene Methode aufstellen.