Maestro proudly presents:
[ Tutorial: „How2Code“ ]
„warme Worte“:
Dieses Tutorial widmet sich an alle, die ein „sicheres“ Programm schreiben wollen. Das sicher steht in „“, weil es für ein Profi kein Problem ist ,ein Kopierschutz zu knacken. Aber es hält kleine Lamer & dumme Newbies ab, unser Programm zu modifizieren. Leider kann ich nicht sagen, ob dieses Tutorial für Anfänger geeignet ist, aber ein bisschen Wissen in Delphi solltet ihr schon haben...
Ich verwende Delphi v4.0. Da ich aber „System-Nah“ programmiere, d.h. Win32 API`s verwende, sollte es kein Problem sein, den Code in VB oder/und in C++ zu portieren. Achja, der grüne Text ist Source-code.
OK, nun geht es auch schon los...
Content:
1. Einführung
2. Win32DASM ausschalten
3. ANTi-SiCE Tricks
4. CRC32-Checks einbauen
5. Serialabfrage programmieren
6. das Tool packen
7. <einige „Profitips“>
„Einführung“:
Als erstes müßt ihr wissen, was ihr schreiben wollt. Soll ein CrackMe oder Shareware werden?! Bei einem CrackMe ist der „Sinn“ (und das Programmdesign) ziemlich egal... Aber Shareware sollte schon sinnvoll durchdacht sein... was aber nicht meine Aufgabe ist *g*
„Win32DASM ausschalten“:
Der Win32DAM lebt von String-Ref., d.h. ohne diese ist er ziemlich „machtlos“. Der integrierte Debugger ist zwar schön, aber dahingehend ziemlich nutzlos. Auch könnte man das Tool mit einen Crypter packen, aber zu jedem Crypter gibt es ein Programm, was diesen Vorgang wieder rückgängig macht. Also schreiben wir unsere eigene Methode, String’s in der Delphi .EXE zu verstecken. Und das geht so:
Procedure EnDeCrypt(Var InString: String);
Var x: Byte;
Begin
RandSeed := Length(InString);
FOR x := 1 To Length(InString) Do
InString[x] := Chr(Ord(InString[x]) Xor (Random(128) Or 128));
End;
Also diese Routine ist die altbekannte (oder auch nicht) XOR Methode um String‘s zu verschlüsseln. Sie ist zwar klein, aber sehr kraftvoll. Ich würde zwar kein .TXT-Crypter damit schreiben, aber unser Ziel ist doch nur, dass der Win32Dasm die Strings nicht lesen kann, oder?! Nun folgt die Erklärung: der Befehl RandSeed berechnet eine Zufallszahl aus der Länge des gegeben String’s InString. Dieser wird als Parameter der Procedure übergeben & dann mit der XOR Routine verschlüsselt. Nun ist ein Sinnvoll, ein kleines Programm zu c0den, was wir als „Werkzeug“ benutzen, d.h. es parallel laufen lassen. Damit können wir schon während der Entwicklungszeit verschlüsselte String’s erzeugen, die wir als Const pro Procedure benutzen. Damit können wir z.B. folgende MsgBox definieren:
Procedure Meldung;
Var dStr: String;
Begin
dStr := `Œ’äÈ™ÁÌŠûú÷׷İ÷ö`
EnDeCrypt(dStr);
Messagebox(form1.handle,Pchar(dStr),‘Achtung...‘,0);
End;
Diese Procedure wurde eine Messagebox ausgeben, die die Überschrift „Achtung...“ hat & mit den Text „Dies ist ein Test.“ ausgibt. Warum?! Hää? Warum mit den Text „Dies ist ein Test.“ ausgibt? Das ist ganz einfach, der Variable dStr wird der Wert `Œ’äÈ™ÁÌŠûú÷׷İ÷ö` zugewiesen. Dieser wird beim Starten des Programm decodiert & als, für uns, lesbaren Text ausgeben. Nur leider sieht das der Win32DASM nicht... denn der String wird erst während des Startens dekodiert. Kewl, huu?! Es ist zwar ein aufwendige Methode, aber sie fkt. perfekt. Damit sollten wir alle wichtigen Strings dekodieren, z.B.: die in Fehlerboxen, wenn der Serial falsch war. Also, man könnte eigentlich alle Strings in einem Programm verschlüsseln, was aber sehr aufwendig ist. Darum sollten wir uns mit den wichtigsten String’s begnügen. Ihr könnt es gleich mal testen, eine .EXE erzeugen & das ganze in Win32DASM betrachten. Ihr findet euren String nicht... Auch kann keiner die Strings in der .EXE wiederherstellen.
Damit sollten eure String’s erstmal geschützt sein vor Lamer & Newbie’s.
( siehe SOURCE\CRYPTER\String_CRYPTER.DRP)
„ANTi-SiCE Tricks“:
Auch hier sei am Anfang gewarnt, dass diese Methode ziemlich leicht zu knacken ist. Ich zeige euch zwei verschiedene Methoden, um SiCE zu entdecken. Eine davon, bekannt als „MeltIce“ von David Eriksson's, wird von einem Tool namens FrogSiCE erkannt & „gepatched“. Aber welcher Newbie kennt schon FrogSiCE?!
Also, „MeltIce“ basiert auf der Methode, eine VxD (VxD = virtueller Geräte Treiber) von SiCE zu „öffnen“. Es gibt zwei Stück: SiCE & NTICE. Diese öffnen wir mit CreateFile(`\\.\<Name der VxD>`, win32 stuff)!
Um SiCE für Windows9x zuerkennen nehmt diese Methode:
Function Is_Sice: Boolean;
Var xSiCE,SiCE: String;
Begin
xSiCE := '÷¹Ÿ%S'; //ist unser \\.\SICE *g*
EnDeCrypt(xSiCE);
SiCE := xSice;
xFile := CreateFile(PChar(SiCE),GENERIC_READ + GENERIC_WRITE, FILE_SHARE_READ + FILE_SHARE_WRITE,NIL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
If xFile = INVALID_HANDLE_VALUE Then
Begin Is_Sice := False End
Else Begin Is_Sice := True End;
CloseHandle(xFile);
End;
Wie ihr schon seht, benutze ich wieder den EnDeCrypt(). Denn sonst würde in unserer .EXE „//./SICE“ stehen & das wollen wir nicht. Denn einfach mit HIEW öffnen & in z.B.: „//./SICT“ umändern und alles wäre für die Katz. Denn dann würde das Programm versuchen, die VxD SICT zu öffnen & würde Erfolg haben. Die MeltIce Methode basiert darauf, dass es einen Fehler gibt, wenn die VxD geöffnet wird. Also, einfach mit:
If Is_Sice Then ReBootPC Else LoadProg;
starten. Wenn SiCE installiert ist, bekommt die Funktion den Wert True (wahr). Ist dies der Fall, wird die Procedure ReBootPC aufgerufen. Ist SiCE nicht installiert, so wird die Procedure LoadProg aufgerufen & unser Programm lädt ohne Probleme hoch. Wie ich Eingangs schon erwähnt hatte, gibt es ein Programm was das alles „patcht“. fR0GsiCE heißt dieses geniale Tool. Leider läßt sich dieses Programm nicht im Speicher aufspüren L. Aber halb so wild, denn a) ein Newbie kennt fROGSiCE nicht & b) wir haben noch ein weitere Tricks im Ärmel...
„CRC32-Checks einbauen“:
Ein weitere cooler Code ist einen CRC-Check bei jedem start des Programmes durchlaufen zu lassen. Dann wird der Wert, der mir XOR verschlüsselt ist, aus einer Datei gelesen & mit dem akt. CRC-Wert verglichen. Stimmen diese nicht überein, lassen wir das Programm beenden. Das „coole“ an der ganzen Sache ist, wird auch nur ein JE -> JNE geändert so läuft das Programm nicht mehr.
Die Delphi-Unit liegt bei. Sie muß einfach nur kompiliert werden... That`s all.
Wie ihr sie in eurer Programm einbindet, dass zeig ich euch jetzt:
FUNCTION ProcessFile(CONST Path: STRING): DWORD;
VAR CRCTemp : DWORD;
CRCValue : DWORD;
CRCValueHex: STRING;
Error : WORD;
TotalBytes : TInteger8;
BEGIN
RESULT := 0;
Application.ProcessMessages;
CRCVAlue := 0;
CalcFileCRC32(Path, CRCValue, TotalBytes, Error);
RESULT := CRCValue;
CRCValueHex := IntToHex(CRCvalue,

;
CRCTemp := DirCRC32;
CalcCRC32 (@CRCValueHex[1], SizeOf(CRCValueHex), CRCTemp);
DirCRC32 := CRCTemp;
CRCTemp := AllCRC32;
CalcCRC32 (@CRCValueHex[1], SizeOf(CRCValueHex), CRCTemp);
AllCRC32 := CRCTemp;
melticecrc32 := IntToHex(NOT AllCRC32,

;
END;
Ihr müßt aber noch vorher die Variable <melticecrc32> global als String def.!!
Mit dieser Function könnt ihr den CRC-Wert einer Datei bestimmen. Das geht so:
Processfile(ParamStr(0));
ParamStr(0) ist die akt. Datei, also eure .EXE Datei. Mit der folgendem TForm1.FormShow habt ihr alles im Griff *g*...
procedure TForm1.FormShow(Sender: TObject);
var errorcode: word;
crcvalue: cardinal;
bytes: int64;
f: textfile;
dStr,dupecrc,egal: String;
begin
If Is_Sice Then Close;
If Is_Sice_NT Then Close;
Processfile(ParamStr(0));
dStr := 'Áñ£ˆ½‡®“ž³Ç'; // unsere `meltice.dat`
EnDeCrypt(dStr);
assignfile(f,dStr);
{$i-}
reset(f);
dStr:='ê¿®ñÐÍ纑³ˆîñ€¯ÂÀ¼ÔœÐêÊí¦²Æ–ô¤´£ðÙÖþÿú®Ü';
// unsere Fehlermeldung!!
EnDeCrypt(dStr);
if ioresult <> 0 then
begin
messagebox(form1.handle,pchar(dstr),'',0);
close;
end;
readln(f,dupecrc);
closefile(f);
endecrypt(dupecrc);
Assignfile(f,'debug.dat');
rewrite(f);
writeln(f,melticecrc32);
closefile(f);
if dupecrc <> melticecrc32 then
begin
close;
end;
messagebox(0,'Aufgabe: <siehe CrackMe_#4.nf0>!!','',0);
if dupecrc <> melticecrc32 then
begin
close;
end;
end;
Nun wird also bei jedem Start die Datei `meltice.dat`geöffnet. In dieser Datei steht die akt. CRC verschlüsselt drinn, die ihr vorher eingegeben habt. Der Wert wird ausgelesen, entschlüsselt & mit der akt. CRC verglichen. Stimmen diese NICHT überein, so wird das Programm beendet. Bitte benutzt keine MsgBox für Fehlermeldungen, diese kann man im DASM leicht per Imp-Fkt. Finden & man patcht den Sprung, also das Programm wird nicht beendet. Laßt lieber eine <Error.log> erstellen & schreibt dort euere Fehlermeldung rein... Das ist besser.
Ach ja, bitte kompiliert euer Programm & laßt für euch den CRC ausgeben. Erst wenn euer Programm fix & fertig ist, aktiviert ihr den CRC-Check. Wie gesagt, der muß per Hand am Ende (und durch die XOR-Routine) in die Datei `meltice.dat`eingegeben werden.
DA DIESES THEMA SEHR HEIKEL IST, SCHREIBT MIR BEI FRAGEN EINE e-MaiL AN:
Maestro.Hacks@gmx.net !
Auch schaut euch den Source unter SOURCE\HACKME an...
„Eine gute Serialabfrage programmieren“:
Hier möchte ich nun nicht einen Source präsentieren, sondern lieber euch Vorschläge unterbreiten. Wenn ich hier einen Source veröffebtliche, und ihr den 1 zu 1 übernehmt, dann ist ein KeyGen für euer Programm schnell & bald geschrieben.... Also, es gibt verschiede Wege, eine „intelligente“ Serial zu proggen. Mann könnte einfach den Namen, der als String vorliegt, in einen HEX Wert umrechen. Viel Besser ist aber, und das verwende ich, eine CRC32-Modifizierte Variente zu nehmen. Dann beträgt der KEY ca. 8-12 Zeichen, die in keinerlei sichtbarer relation stehen mit dem Usernamen! Natürlich könnte man auch einfach die XOR Routine verwenden. D.h. den Username in XOR Verschlüsseln & dann vergleichen lassen. Oder denckt euch selber was aus & schreibt mir euren Weg per e-mail J.
„das Tool packen“:
Dies liegt nun echt in eurer Entscheidung. Es gibt zu jedem öffentl. erhältlichen Packer ein Gegenstück. Ich würde es nur verwenden, um die .EXE zu verkleinern. Oder ihr schreibt euch selber einen

. Einen guten .EXE Packer, egal ob für PE oder DOS findet ihr unter SOURCE\PACKER. Das ist ein DOS Tool was gleiche Cmd-Line Eigenschaften hat.
„ein paar Profitip`s...“:
1. KEINE Nag-Screen’s, ohne CRC32 Check -> sind einfach zu patchen!
2. viele CRC-Checks einbauen, Abbruch OHNE Fehlermeldung
3. viele XOR-Strings einbauen, auch in MsgBox!!
4. Nie das akt. Datum per API checken, lieber an Systemdateien!
5. ANTi-SiCE Tricks benutzen
6. < einen eigenen ANTi-fROGSiCE schreiben

>
So, das war es erstmal von mir. Ich hoffe ihr hattet Spaß & könnt dies als „ultimative“ Hilfe benutzen. Kommentare jeder Art, also Lob,Kritik etc. ist gern gelesen unter
maestro.hacks@gmx.net.
All rights reserved @ Maestro, fRACTUs`99.
/\/[ don’t be destructive – be creative ]\/\
Gr33tz: all @ fRACTUs`99 | AmoK | EVC | r!SC | MS_Jessica J | Pr0g | Crazy-Andy | Crazyfoxy | SiR Dynamite & alle die ich vergessen habe...