Crackme026

Crackme026の逆解析 

1.観測プログラム

 
プログラムは、ユーザ名は少なくとも5つの文字でなければなりません求められます。

 シリアル番号が間違っている場合は、点滅しますボックスの名前、ないポップヒントを入力します。

 

2.単純な検索ケース

 

VB5プログラムは、何のシェルを書かないために使用しています。

3.プログラムの解析

プログラムはVB5を使用して書かれているので、それでは、VBの逆コンパイラの使用を見てみましょう

 

 あなたは、プログラムは、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 }

 

 

 

 

 

 

 

私のGithubでの関連文書

おすすめ

転載: www.cnblogs.com/white-album2/p/11694357.html