私が以前に書いた同様の記事を見たことがあるかもしれませんが、なぜそれを繰り返さなければならないのですか?初心者がウイルスの逆分析とシステムセキュリティをよりよく理解し、前のシリーズを破壊することなくより体系的になりたいと思っています。そのため、このコラムを再開して、システムセキュリティ、逆分析、悪意のあるコードの検出に関する体系的かつ詳細な調査を準備しました。「システムセキュリティ」シリーズの記事は、より焦点を絞った、より体系的で、より詳細なものになります。これは、著者の成長の遅い歴史でもあります。専攻を変えるのは本当に難しいです。逆分析も難しい部分ですが、今後4年間でどれだけ学べるかも考えています。長い道のりが長く、湖山に行く傾向があります。プロセスを楽しんで、一緒に来てください〜
システムセキュリティシリーズの作者は、悪意のあるサンプル分析、逆分析、攻撃的および防御的な戦闘、Windowsの脆弱性の悪用などについて詳細な調査を行い、ブロガーからオンラインノートや実際の操作を通じて学び、進歩を遂げることを望んでいます。前回の記事では、IDA Pro分解ツールの基本的な使用法を紹介し、EXEリバースエンジニアリング復号化の実際的な方法について簡単に説明しました。この記事では、OllyDbgの基本的な使い方とCrakeMeのケース、「Yi Tian Shou Long」の逆分析について詳しく紹介しますので、始めたばかりの生徒の皆さんのお役に立てば幸いです。
それ以上の苦労なしに、新しい旅を始めましょう!あなたのいいね、コメント、お気に入りは私にとって最大のサポートになります。私は安全な道をずっと進んでいることに感謝しています。悪い書き込みがあれば、私に連絡して修正することができます。基本的な記事、お役に立てば幸いです。作者の目的は、安全担当者と一緒に進歩することです。さあ〜
著者のgithubリソース:
- システムセキュリティ:https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis
- ネットワークセキュリティ:https://github.com/eastmountyxz/NetworkSecuritySelf-study
前文分析:
- 【システムセキュリティ】1.逆解析とは何か、逆解析の基礎と古典的な地雷除去ゲームの逆
- [システムセキュリティ] 2。逆解析とLüBuchuanゲームの逆ケースを学ぶ方法
- [システムセキュリティ]III。IDAPro分解ツールの最初の知識とリバースエンジニアリング復号化の実際の戦闘
- 【システムセキュリティ】4.OllyDbg動的解析ツールの基本的な使い方とCrakemeの逆クラッキング
声明:私は犯罪を犯すための教育方法の使用に固く反対します。すべての犯罪行為は厳しく罰せられます。私たちは一緒にグリーンネットワークを維持する必要があります。それらの背後にある原則を理解し、それらをよりよく保護することをお勧めします。
1.OllyDbgツールの概要
OllyDbgは、IDAとSoftICEを組み合わせた新しい動的追跡ツールです。Ring3レベルのデバッガーは非常に使いやすく、今日最も人気のあるデバッグおよび復号化ツールの1つです。また、プラグイン拡張機能もサポートしており、現在最も強力なデバッグツールの1つです。
次の図に示すように、OllyDbgが開きます。これには、分解ウィンドウ、登録ウィンドウ、情報ウィンドウ、データウィンドウ、およびスタックウィンドウが含まれます。
- 分解ウィンドウ:アドレス、HEXデータ、分解、コメントなど、デバッグされたプログラムの分解コードを表示します
- レジスタウィンドウ:現在選択されているスレッドのCPUレジスタの内容を表示し、ラベルをクリックしてレジスタの表示方法を切り替えます。
- 情報ウィンドウ:分解ウィンドウで選択した最初のコマンドのパラメーター、ジャンプ先アドレス、文字などを表示します。
- データウィンドウ:メモリまたはファイルの内容を表示し、メニューを右クリックして表示モードを切り替えます
- スタックウィンドウ:現在のスレッドのスタックを表示します
次の図は、EXEを開いた後に表示されるインターフェイスです。
以下では、一般的に使用されるショートカットキーのデバッグ方法について簡単に説明します。
F2
下の図に示すように、ブレークポイント(赤い位置)を設定します。プログラムはこのポイントまで実行されると一時停止し、もう一度F2キーを押してブレークポイントを削除します。
F9
このキーを押してプログラムを実行します。対応するポイントが設定されていない場合、デバッグされたプログラムは直接実行を開始します。
F8
ステップスルーすると、このボタンを押すたびに、分解ウィンドウの命令が実行され、コードはCALLなどのサブルーチンに入力されません。
F7
シングルステップイン、機能はシングルステップオーバー(F8)に似ていますが、CALLなどのサブルーチンに遭遇すると、それが入力され、入力後、最初にサブルーチンの最初の命令で停止する点が異なります。以下に示すように、CALLサブルーチンに入ります。
F4
選択した位置まで実行します。つまり、カーソル位置まで実行して一時停止します。
CTRL + F9
実行して戻る。returnコマンドを実行するときは、このキーを押して一時停止します。これは、システムの空域からデバッグ中のプログラムの空域に戻るためによく使用されます。
ALT + F9
ユーザーコードを実行し、システムの空域からデバッグしたプログラムの空域にすばやく戻ります。
2.Crakemeの例1のOllyDbg分析
最初のケースは、「EncryptionandDecryption」という本のCrakemev3.0ファイルで、ユーザー名とシリアル番号を復号化する必要があります。
[今すぐ登録]ボタンをクリックすると、次の図に示すように、入力エラーに関するプロンプトが表示されます。
OllyDbg動的分析の基本的なプロセスは次のとおりです。
- 通常、ソフトウェアを入手した場合は、最初にソフトウェアを実行してみてください。ヘルプドキュメントがある場合は、ヘルプドキュメントを参照してソフトウェアの基本的な使用法を理解してから、間違った登録コードを入力してエラーメッセージを確認してください。
- 登録コードを入力する場所がない場合は、レジストリまたはキーファイルのどちらを読み取るかを検討してください(プログラムはファイルの内容を読み取って登録するかどうかを決定します)。これらは他のツールで分析できます。
- そうでない場合、元のプログラムは不完全な機能を備えた単なる試用版であるため、公式バージョンとして登録するには、手動で完成させるためのコードを作成する必要があります。
- 上図に示すように、登録コードを入力する必要がある場合は、シェルソフトウェアを呼び出して、プログラムがパックされているかどうかを確認します(PeiD、FIなど)。シェルがある場合は、それを解凍してから、分析とデバッグのためにOllyDbgを呼び出す必要があります。シェルがない場合は、ツールを直接呼び出してデバッグできます。
正式な分析を始めましょう。
ステップ1:PEiDを呼び出して、プログラムがパックされているかどうかを確認します。
フィードバックの結果は、Delphiがシェルなしで書き込んだファイル「BorlandDelphi4.0-5.0」です。
手順2:CrakeMe V3.0ファイルを実行し、[今すぐ登録]をクリックしてエラーメッセージを表示します。
ダイアログボックスに、「シリアルが間違っています。再試行してください」というエラーメッセージが表示されます。
ステップ3:OllyDbgソフトウェアを起動し、メニューの[ファイル]を選択して、CrackMe3ファイルを開きます。
このとき、ファイルは次の位置に留まります。コメント位置をダブルクリックして、カスタムコメントを追加します。
ステップ4:分解ウィンドウを右クリックして、[検索]-> [すべての参照テキスト文字列]を選択します。
次の図に示すダイアログボックスが表示されます。
ステップ5:右クリックして[テキストの検索]を選択し、[間違った]と入力して、[間違ったシリアル、再試行してください!]の位置を見つけます。
次の図に示すように、「間違ったシリアル」の位置を見つけます。
ステップ6:右クリックして[分解ウィンドウでフォロー]をクリックします。
次に、下の図に示す位置に移動します。
ステップ7:文を選択し、[参照の検索]-:[選択したアドレス](ショートカットキーCtrl + R)を右クリックします。
下図の「リファレンスページ」が表示されます。
手順8:デュアルマシンの2つのアドレス(00440F79、00440F93)の対応する場所に移動します。
分解ウィンドウを上にスクロールして、コアコードを確認します。
ステップ9:「シリアルが間違っています。再試行してください」という文字列にジャンプする指示を表示することにより、対応するプログラムにクエリを実行できます。
「デバッグオプション」->「CPU」->「ジャンプパスを表示」と「ジャンプが実装されていない場合は灰色のパスを表示」と「選択したコマンドへのジャンプパスを表示」をチェックします。
以下に示すように:
ステップ10:分解コードを詳細に分析します。
次の図では、F2を押してアドレス0040F2Cにブレークポイントを設定してから、F9を押してプログラムを実行します。
「テスト」と「754-GFX-IER-954」を入力し、「今すぐ登録!」をクリックすると、表示結果が下図のようになります。
プログラムはブレークポイントで停止し、入力した内容の入力を求めます。
出力内容は以下のとおりです。メモリアドレス02091CE0に「テスト」を入力します。
ステップ11:「ss:[0019F8FC] = 02091CE0、(ASCII "Test")」を左クリックし、右クリックして「データウィンドウの値に従う」を選択すると、データウィンドウに入力が表示されます。EAX = 00000004は、入力コンテンツの長さが4文字であることを意味します。
12番目のステップ:F8ボタンとF7ボタンを呼び出して、コードを段階的に分析します。
00440F2Cの下のコードの部分に戻り、F8を押してステップバイステップで実行し、以下のコアコードに注意してください。
00440F2C |. 8B45 FC mov eax,[local.1] ; 输入的内容送到EAX,即"Test"
00440F2F |. BA 14104400 mov edx,crackme3.00441014 ; ASCII "Registered User"
00440F34 |. E8 F32BFCFF call crackme3.00403B2C ; 关键点:用按F7进入子程序
00440F39 |. /75 51 jnz Xcrackme3.00440F8C ; 调走到这里就错误:Wrong serial
...
ステップ13:F8が「00440F34 |。E8F32BFCFFcall crackme3.00403B2C」まで実行されたら、F7を押してCALLサブルーチンに入り、カーソルは以下に示す位置(00403B2C)に留まります。
ここで、PUSH ebx、PUSH esiなどはすべて、サブルーチンを呼び出してスタックを保存するときに使用されるコマンドです。F8キーを押して、コードを段階的に実行します。基本的なアセンブリ言語であるコアの説明は次のとおりです(Kan Xue CCDebugerによる「OllyDBG入門チュートリアル」を参照)。
重要:次の図に示すように、プログラムがインターフェイスで実行されると、「テスト」と「登録ユーザー」の比較が表示されます。上の写真を分析すると、ユーザー名は「登録ユーザー」である必要があることがわかります。
手順14:次にF9キーを押してプログラムを実行すると、エラーダイアログボックスが表示されます。[OK]をクリックし、編集ボックスに[登録ユーザー]を再入力して、[今すぐ登録]ボタンをもう一度クリックして、プログラムを分析およびデバッグします。
F12キーが一時停止していることに注意してください。
コアコードは次のとおりです。アドレス00440F34のCALLが明確に分析され、F8に進んで次のステップを実行し、2番目のキーの場所である00440F51を確認し、F7を押してサブルーチンに入ります。注:コメントコンテンツのプロンプトは必ずしも存在しません。これは、プログラムをレジスターに動的にデバッグして、対応する登録コードを表示する正しい方法です。
00440F34 |. E8 F32BFCFF call crackme3.00403B2C
00440F51 |. E8 D62BFCFF call crackme3.00403B2C
上記の2つのコード文では、ユーザー名と登録コードの両方が同じサブルーチンを呼び出していることがわかります。CALL分析方法は上記と同じです。
15番目のステップ:F8を押してサブルーチンをデバッグし、cmpが2つの値を比較して、2つの値が等しいかどうかを確認し、0044102Cが登録コードの内容であることを確認します。
手順16:F12を押して一時停止し、F9を押して再起動し、正しいユーザー名とパスワードを入力すると、復号化が成功します。
- 登録ユーザー
- GFX-754-IER-954
難易度:ここでのCMP比較など、プログラムのコアコードをデバッグする方法、およびアセンブリコードもよりあいまいです。
3.Crakemeの例2のOllyDbg分析
このケースは、典型的な文字列シーケンスクラッキングプログラムであるCrakemeでAfkayas.1.EXEをクラッキングするためのものです。シリアルは、nameの値に従って起動されます。
ステップ1:VBで記述されたPEiDを介してシェルがないことを確認します。
ステップ2:次の図に示すように、OllyDbgツールはAfkayas.1.EXEファイルを開きます。
ステップ3:分解領域を右クリックして、[検索]-> [すべての参照テキスト文字列]を選択します。
ステップ4:ポップアップダイアログボックスで失敗したプロンプト文字「YouGet Wrong」を見つけ、「分解ウィンドウでフォロー」を右クリックします。
このとき、コード領域に戻り、失敗と達成の文字列を確認できます。
ステップ5:通常、成功と失敗のフィードバック文字列はそれほど離れていません。事前に判断する必要があります。入力シリアルが正しい場合は成功し、そうでない場合は失敗します。次に、文字列比較関数を呼び出すためのエントリポイントを見つけます。
このステップはより重要ですが、正確に特定するには長い経験と練習が必要だと個人的に感じています。
呼び出し元の関数をアセンブルする前に、パラメーターがスタックに配置され、CALL命令を使用して関数が呼び出されます。文字列比較機能の前にPUSHEAX命令がありますが、ここでのEAXは文字列の最初のアドレスであると推測できます。
手順6:F2キーを押して比較機能00402533にブレークポイントを設定し、F9キーを押して実行します。このとき、実行中のインターフェースがポップアップします。「Eastmount」と「12345678」を入力し、OKボタンをクリックします。
このとき、プログラムはブレークポイントに留まり、右下隅のスタック領域に正しいシリアルプロンプトが表示されます。
ステップ7:正しいユーザー名とシリアルを入力し、結果を登録します。
- イーストマウント
- AKA-877848
以下は、ゴーストハンドゴッドとハイチゴッドゴッドのブログ投稿と組み合わせた暗号化の基本ロジックの簡単な分析です。同時に、すべての人に記事を読むことを強くお勧めします。以前の参考資料を参照してください。これらの逆の経験は、一夜にして得られるものではありません。学ぶことや経験することが多すぎることを私は知っています。あなたと私は一緒に応援します。
基本的なプロセスは次のとおりです
。serial= 'AKA-' +逆順itoa(strlen(name)* 0x17CFB + name [0])
- ユーザー名の長さを見つける
- ユーザー名の長さに0x17CFBを掛けて結果を取得し、オーバーフローした場合はジャンプします
- ユーザー名の最初の文字のASCIIを結果に追加します
- 結果を10進数に変換します
- 結果とAKAを結合して、最終的なシリアル番号を取得します
Python復号化コードの一部を共有しましょう。
# encoding: utf-8
key = "AKA"
name = "Eastmount"
#获取用户名长度
nameLen = len(name)
print(u'获取用户名长度:')
print(nameLen)
#用户名长度乘以0x17CFB得到结果
res = nameLen * 0x17CFB
print(u'用户名长度乘以0x17CFB:')
print(res)
#将结果加上用户名的第一个字符的ASCII
print(name[0], ord(name[0]))
res = res + ord(name[0])
print(u'结果加上用户名第一个字符的ASCII:')
print(res)
#转换为十进制 省略
#拼接序列号
key = key + str(res)
print(u'最终结果:')
print(key)
異なるユーザー名を定義して、対応するシリアルを取得します。
4.まとめ
この時点で、この基本的な記事は終了です。アセンブリ、ネットワーク、オペレーティングシステム、暗号化と復号化、C / C ++、Pythonなど、幅広い範囲をカバーするネットワークセキュリティについて学ぶための知識は本当にたくさんあります。私はゆっくりと進歩し、研究と実践に等しく注意を払うことができることを願っています。また、読者がこの一連の要約ノートを気に入ってくれることを願っています。気に入らない場合は、スプレーしないで、一緒に歩いてください〜
今日は10万人のCSDNファンを突破しました。何年にもわたってあなたの会社とサポートに心から感謝します。あなたのことを知って感謝しています。今後も、より質の高い記事を共有し、より多くの人々が問題を解決し始め、楽しませ、励ましてくれることを願っています。 !
2020年8月18日に新しくオープンした「NazhangAISecurity Home」は、主にPythonビッグデータ分析、サイバースペースセキュリティ、人工知能、Web浸透、攻撃および防御技術に焦点を当て、論文のアルゴリズム実装を共有しています。Nazhang’s Houseはより体系的になり、すべての著者の記事を再構築し、Pythonとセキュリティをゼロから説明し、10年近く記事を書いてきました。私が学んだことと感じたことを共有したいと思います。また、アドバイスをお願いし、心から招待します。あなたの注意!ありがとうございました。
(作成者:Eastmount 2020-12-22 Wuhan https://blog.csdn.net/Eastmounで火曜日の午後10時に作成)