Crackme026の逆解析
1.観測プログラム
シリアル番号が間違っている場合は、点滅しますボックスの名前、ないポップヒントを入力します。
2.単純な検索ケース
3.プログラムの解析
あなたは、プログラムは、2つの機能ボタンがあり、2つのクリックイベントがあり、見ることができます。
アドレス402B10に行き、ODローダーを使用してください。ブレークポイントは、402B10で、プログラムをチェックボタンをオフにクリックしてください。そうでなければなりません。このコードは、コードを確認することです。
ダウンコードを見て続行
1。
入力されたプログラム名の長さが決定された5文字未満場合は、ポップのプロンプトが表示されますが、上記表示されます。
2。
リサイクルプログラムの確立、ユーザー名の長さのサイクル数。
プログラムは、Iビットのユーザー名のASCII値を取得します。
私はそれが最初のサイクルである場合、1のASCII値のユーザ名を取得する、すなわち名サイクル数[0] ASCII値。
432.4プログラム文字列がフローティングに変換し、その後、ASCII(名は[I-1])浮動小数点、2つの数の乗算、浮動小数点数に変換し、17.79を掛けました。
すなわち 432.5 * ASCII(名[I- 1])* 17.79
プログラム15、即ちによって上記結果 (432.5 * ASCII(名前[I -1])* 17.79)/ 15
そして、その結果は文字列に変換されます。
したがって、サイクルの終わり。
3。
最後のサイクルの結果を除去した後に浮動小数点に変換され、その文字列に変換されます。
4。
プログラムは、名前の最初の文字のASCII値が浮動小数点に変換されますかかります。その後、3が一緒に浮いた結果、2に変換されます。
5。
0x19を乗じた最初の文字のASCII値を、名前を付けてください。
次に3.結果を浮動小数点数に変換され、その後、前のステップを減算し、結果は、16進数の値に変換されます。
6。
3つの結果は、16進数に変換します。
7。
名前の長さは、マイナスとして0x1Bを掛け[0] ASCII値の名前を、取ります。
8。
4. 結果と5. 結果が一緒にスプライスされています。
上記スプライシングの結果と6の結果は一緒にスプライスされます。
上記スプライシングの結果及び7の結果は一緒にスプライスされます。
文字列に名前の長さ、そして一緒にスプライシングされた上記スプライシングの結果。
結果と一緒にスプライシングされた「-CM」上記のモザイク。
最後に、比較
4. RI
1の#include <stdio.hの> 2の#include < ストリング・H> 3の#include <はWindows.h> 4 5 6 INT keygenの() 7 { 8 CHAR szName [ 20 ] = { 0 }。 9 チャー szSerial [ 100 ] = { 0 }。 10 CHAR szSerial1 [ 20 ] = { 0 }。 11 INT NAMELEN = 0 。 12 __int64結果= 0 。 13 __int64結果1 = 0 ; 14 15 16 のprintf(" あなたの名前を入力してください" ); 17 scanf_s(" %S "、szName、20 ); 18はされ =のnamelenをSTRLEN(szName); 19 20は、 結果=(szName [NAMELEN - 1。 ] * 432.4 * 17.79)/ 15 ; 21は 22である 結果1 szName = [ 0 ] + 結果、 23である (szSerial1、sprintfの" %I64d " 、結果1)。 24 STRCAT(szSerial、szSerial1)。 25 26 結果1 =結果- szName [ 0 ] * 0x19 。 27 はsprintf(szSerial1、" %I64X " 、結果1)。 28 STRCAT(szSerial、szSerial1)。 29 30 のsprintf(szSerial1、" %I64X " 結果)。 31 STRCAT(szSerial、szSerial1)。 32 33 結果1 = szName [ 0 ] * 0x5 - として0x1B 。 34 はsprintf(szSerial1、" %I64d "、結果1)。 35 STRCAT(szSerial、szSerial1)。 36 37 結果1 = NAMELEN。 38 はsprintf(szSerial1、" %I64d " 、結果1)。 39 STRCAT(szSerial、szSerial1)。 40 41 STRCAT(szSerial、" -CM " )。 42 43 のprintf(" %sにする\ n " 、szSerial)。 44 45 戻り 0 ; 46 } 47 48 INTメイン(int型 ARGC、CHAR *ARGV []) 49 { 50 keygenの()。 51 システム(「一時停止」)。 52 リターン 0 。 53 }