*****解析講座
----------はじめに
A シリアルを入力出来るもの

* シリアルを入力しないと、一定期間で起動できなくなる。
* シリアルを入力しないと、一部機能制限がある。

B シリアルを入力出来ない体験版

* 機能制限がなく、一定期間で起動できなくなる。
* 機能制限があるが、サイズは製品版と同じ。
* 機能制限があり、サイズが製品版より小さい。

 C 特別なファイル、ソフトが必要なもの
※ まずは、シリアルを入力出来るものについてを考えます。

----------アナライズ
対象がどのようにコンパイルされているかで、解析方法にも定石がありこれを確認するツールもありますが、バイナリエデッタを利用して確認できます。

* 文字列「C++」で検索
 o Visual C++ でヒット Microsoft Visual C++
 o Borland C++でヒット Borland C++
* 文字列「MFC」で検索
 o MFC42.DLL でヒット Microsoft Visual C++
* 文字列「VB」で検索
 o VB40016.DLL でヒット Microsoft Visual Basic4(16bit)
 o VB40032.DLL でヒット Microsoft Visual Basic4(32bit)
 o MSVBVM50.DLL でヒット Microsoft Visual Basic5
 o MSVBVM60.DLL でヒット Microsoft Visual Basic6
* 文字列「Boolean」で検索
 o Boolean でヒット Borland Delphi
* 文字列「pack」で検索
 o aspack、packedなどでヒット パックされてますので難解です!

などが定番で他、EXEファイルには、自己解凍ファイル、インストーラファイルなどいろいろあります。それらを判定するツールとしてFile scanners/analyzersがあり Protools の「PE iDentifier 0.7 (99K)」を使用して @関数電卓PRO v1.63 を見てみます。

PE iDentifier設定
* Scan method(スキャンモード)->Hardcore method 2(完全なスキャン)
* Misc options(オプション)->すべて選択

PEiDは対象を、OpenFileで指定、アイコン上にドラッグでもファイルをスキャンできますが、 Misc optionsのShell Extensionをチェックすることで右クリックメニューに登録されます。 @関数電卓PRO.exe 上で「右クリック」->「Scan with PEiD」としてみましょう。

日本語は文字化けするようですが、大切なのはInformation Microsoft Visual Basic 5.0 の部分です。これでコンパイラーが確認できました。もうひとつ、EP Section が 「.text」になってる部分も大切です。ここが、「UPX1」とか「.text」以外の表示になっていたら、そのファイルはパックされてます。今後ふえ ることでしょう。
※ アナライザーとは、ウィルスチェックと同じくパターンチェックをしてるだけで、パターンが登録されてなければ判別できません。最新版を入手しましょう。

----------バイナリ
バイナリ(倍直)とは、バイナリエディタで表示される文字列がそのままパスワードになってるもので、内部では、そのまま全部一度に比較してる場合と、一文 字づつ比較してる場合があります。なかには、文字列+内部計算数字などもあります。

@関数電卓を Stirling(スターリング) を使用してを見てみます。

Stirling.exeのショートカットをC:\WINDOWS\SendToに入れておけば、
@関数電卓PRO.exe 上で「右クリック」→「送る」→「Stirling」ですね。
文字列「登録」で検索

それらしい文字列「frmEntry」「Command1」「Command2」「mnuTouroku」「mnuShare」などを、
「PRO」→「ヘルプ」→「シュアウェア登録」で登録してみます。
だめですね〜!?
では、文字列「パスワード」で検索

ヒットしません!?このソフトはVisual Basicでコンパイルされているのを思い出してください。 VBの場合Unicode文字列(WidCharFormat:)が使われる事があります。
Unicode文字列を探す設定にします。
文字列「登録」で検索

とっても怪しい文字列があります!
「G R 8 0 4 9 1 6 F #」Unicodeでは2バイトで1文字なので「GR804916F#」で登録してみます。みごと、登録できました。
※ 倍直だとしてもキーワードから正規パスが離れている場合も有ります。
バイナリエディタ(2進編集器)とは和製英語で、正式にはヘックエディタ(HexEditor)です。


*****解析講座・初歩のOLLY
----------パッチとは
パッチ(Patch)とは、ソフトウェアを修正する差分情報のことです。

実行形式パッチと、各掲示板などでお馴染みのテキスト形式パッチがあります。
海外では実行形式パッチでUPが主流ですが、日本ではテキスト形式パッチを自分で処理するのが一般的です。
FILENAME aaa.exe
0004123: 74 EB

これは、「aaa.exeファイル」 をバイナリエディタで開き「アドレス 0004123」
番地のデータ「74」を「EB」 に書き換えることを表しています。
数箇所なら、かまいませんがパッチャー(Patcher)を使用したほうが効率的です。
「FireFiower by FCJ」、「PatchManager by vernichten」、「NeZuPat by ねずみ」など有名です。
読込みさせるには、上記2行をテキストファイルで拡張子を*** .patと名前をつけ保存します。
パッチャーに読込む形式として

* 大文字、小文字は区別しない。
* 空白行を入れないこと。
* 先頭に空白を入れないこと。
* 同一フォルダにある複数のファイルを指定できる。

などですがコメント ("*"が先頭につく行) を入れておくと管理しやすいです。
* PATNAME : AAA v1.00 Win98/* パッチ対象ファイル製品名、バージョン、OS
* LastMod. : 2002/01/01/* パッチ対象ファイル作成日
* AUTHOR : MAYI /* パッチ作者名
* URL : http: /* パッチ対象ファイル関連URL
* FileSize : 831bytes /* パッチ対象ファイルサイズ
* CRC : C48D8FF4 /* パッチ対象ファイル整合性チェック
* MESSAGE : 期間解除 /* メッセージ
FILENAME aaa.exe /* パッチ対象ファイル(ターゲットファイル)
0001234: 74 EB /* オフセット: 元のバイト 新しいバイト

※ パッチは生ものですから、製品名、バージョン、OS、作成日は必ず記入しましょう。
今後、Win98では動くのに?WinXPでは出来ないなどが増えるとおもわれます。

----------パッチを当てる
FireFlower3 を利用して、DokoDonさん提供の ollydbg107j.pat を OllyDbg v1.07 (2002/05/05)に当てて日本語文字列を表示できるようにしてみましょう。

まずは、ウイルスチェックをしてください、常識ですね!
次に、パッチ対象ファイル(OLLYDBG.EXE)上で
「右クリック」→「全般」「属性」 の読み取り専用にチェックが無いことを確認します。
起動中のファイルには、パッチ出来ません。再起動してもシステムが利用してるファイルなども、パッチ出来ません。どうしても、止められないファイルをパッ チしたい場合は、名前を換えたり、移動すると出来ます。
ではFireFlower3 を起動してみましょう。

「Config」ボタンを押して、環境設定のチェックを確認して終了します。
これで、.pat ファイルが FireFlower3 に関連付けされました。
ollydbg107j.patをOLLYDBG.EXEのあるフォルダで左クリックすれば、
FireFlower3 が起動してパッチが完了します。
※ OllyDbgのメニューを日本語化するものではありません。

----------OllyDbgの設定
OllyDbgのフォントの設定をしましょう。
「Options」→「Appearance」→「Fonts」
* Terminal 6 を Font 5 に選択を変えて、 「Rename」ボタンを押します。
* Font 5 を MS ゴシックに変更します。 ※ 文字化けは気にしないでください。
* 「Change」ボタンを押し下記のように設定します。
* 「Options」→「Appearance」→「General」
* Use Parent's font in dialogs をチェック。

ツールバーを消したいならShow toolbarのチェックを消します。
Default font を先のFont 5 の位置の文字化けを選択します。



----------練習1
OllyDbg を利用して 練習1をやってみましょう!
解析の流れとして
1. ウイルスチェックをする。
2. バックアップをとる。
3. 制限を確認する。
4. ファイルアナライザーなどで、ファイルの全体像を確認する。
5. パスチェック、日数チェックなどの処理場所を探す。 一箇所とは限りません!
 * 文字列から探す。
 * WinAPI(関数)から探す。
 * 逆アセを眺めカンで探す。
6. 制限を解除する。

ここでは文字列から処理ルーチンを探してみましょう。
「C:\WINDOWS\SendTo」に「OllyDbgのショートカット」を入れておけば、「EX1.exe」上で「右クリック」→「送る」→ 「OllyDbg」で読込んで起動します。
これは、実行ファイルがメモリ内部に展開されて、メモリ全体を一つの町とすると、
各大字(セグメント)のようすを表しています。
左上 : Disassembler window    コードセグメントの内容を表示
右上 : Registers window    レジスタの内容を表示
左下 : Dump window    データセグメントの内容を表示
右下 : Stack window    スタックセグメントの内容を表示
各部分で表示形式を変化することができ、コードとレジスタ部が大切です。
まず練習1を起動して、どのような事が起こるか確認します。
メニューの「Debug」→「Run」か「F9」ボタンを押し、
練習1が起動したら、適当なPasswordを入れ「OK」ボタンを押します。

「パスワードが違います!!」とのメッセージが出てしまいました。
今回は、このメッセージから処理ルーチンを探すのが目的です。
リスタートします。「Debug」→「Restart」 か 「Ctrl+F2」
右上の適当な部分で「右クリック」→「Search for」→「All referenxed text strings」



今回は、文字列が二つしかありませんが本来はかなりの文字列があるもので、
通常は「右クリック」→「Search for text」で文字列「パスワードが違います!!」をさらに検索します。
カーソルを文字列「パスワードが違います!!」上で「左ダブルクリック」しましょう。
この文字列を利用してるコードウィンドウが表示されます。
逆アセが読みやすいようにウィンドウを調節します。
004010D6 の GetDlgItemTextA で文字を得
004010F8 MOV EDI,EX1.0040208A 入力した文字の場所をEDIに入れ
004010FD CALL EX1.00401138 401138番地の処理に移動して
00401102 TEST EAX,EAX EAXの値が同じか調べ
00401104 JE SHORT EX1.0040110D 同じなら違いますへジャンプ
00401106 MOV EBX,EX1.00402021 正解です!!
0040110B JMP SHORT EX1.00401112 メッセージ表示へ
0040110D MOV EBX,EX1.00402008 パスワードが違います!!
004010FD の CALL から戻ったときEAXの値が変化すれば正解のようです。
CALL の後 TESTしてジャンプは定番です。
パッチとして考えられるのは

 * CALL先に行きEAXの値を変える
 * EAXの値が同じか調べない
 * 違いますへジャンプしない

ここでは、「違いますへジャンプしない」で、試してみます。
00401104を選択して「右クリック」→「Binary」→「Fill with NOPs」
これは選択行をNOP(なにもしない)命令に換えます

試しに実行してみます。「F9」ボタンを押してみます。

うまくいきました、しかし、これはメモリ上の変化で試したのであって、
実際のファイルは換わってません。換えるためにパッチをつくりましょう。
パッチの為にメモリ上のアドレス(00401104)じゃなく
実アドレス(バイナリエデッタでのアドレス)を知る必要があります。
00401104を選択して「右クリック」→「View」→「Executable file」

「00000704 7407 JE SHORT 0000070D」 00000704 がバイナリエデッタでのアドレスです。
パッチはこうなります。
* PATNAME : EX1 Win98
* LastMod. : 2002/05/18
FILENAME EX1.exe
00000704:74 90
00000705:07 90

ところでパスワードは?
パスワードが知りたい場合はCALL EX1.00401138を調べます。
00401138 XOR EAX,EAX    EAXを初期化=0にする
0040113A SUB DWORD PTR DS:[EDI],58837083    データから58837083引く
00401140 JNZ SHORT EX1.00401159    ゼロフラグが立たないとジャンプ
00401142 ADD EDI,4    EDIに4加え読み込むデータの位置を変える
00401145 SUB DWORD PTR DS:[EDI],5B818F83    データから5B818F83引く
0040114B JNZ SHORT EX1.00401159    ゼロフラグが立たないとジャンプ
0040114D ADD EDI,4    EDIに4加え読み込むデータの位置を変える
00401150 SUB DWORD PTR DS:[EDI],48816883    データから48816883引く
00401156 JNZ SHORT EX1.00401159    ゼロフラグが立たないとジャンプ
00401158 INC EAX    EAXに1加える
00401159 RETN    戻る

SUB DWORD PTR DS:[EDI],58837083
これは、「DS:[EDI]」(データセグメントのEDI番地を先頭にして)
「DWORD」(4バイト)のデータから「58837083」16進を「SUB」(引く)ことを表してます。
つまり、パスワードを4バイト(半角なら4文字、全角なら2文字)だけ比較してることになります。ここでは、3回処理してますからパスワードは半角なら 12文字、全角なら6文字です。
「58837083」は16進の文字コードで、メモリでは1バイトごと逆(リトルエンディアン) に表示されます。「83708358」としてバイナリーエディタで、 EX1.exeを16進データ検索してみましょう。これも倍直とよべるかもしれません

-------------------
解析講座第1回
投稿者:dori 投稿日:2002/04/01 21:13:23

今回の解析講座を始めるわけですが
多少汎用性を持たせて書きますので自分で色々試してみるのが1番
勉強になると思います、そこで疑問に思った事をすぐ人に聞くのではなく
自分なりに調べてみる事が力となります(バイナリエディタの使い方等)

まず、最初に解析系で度々出てくる倍直の説明です
倍直とはバイナリに直に書きこまれている事から倍直と誰かが名付けた造語です
バイナリエディタで調べたいファイル(主に実行ファイル)を開き
"パスワードが違います"等のメッセージで検索してみると
近くに怪しげな文字列が見つかる場合がよくあります

VBの場合は"Unicode文字列"が使われる事が多いです
多種な文字コードを使用出来るバイナリエディタも沢山ありますので
自分の使いやすいものを探してみるのもよいかと思います

検索ワード:"登録"・"ありがとうございました"・"パスワードが違います"等

倍直だとしてもキーワードから正規パスが
離れているようなソフトの場合探すのは難しいです
このようなソフトの場合は解析終了後に正規パスで
検索してみたら実は倍直だったという事も良くあります

次回は"OllyDbg"の使い方から説明していきたいと思います
このソフトはフリーですが素晴らしいデバッガです
現在の最新バージョンは1.06ですので暇な時にDLしておいて下さい

-------------------
Re:解析講座第1回
投稿者:dori 投稿日:2002/04/02 13:37:41

"ollydbg"はDL出来ましたか?
ロボット系のサーチエンジンでしたら殆どの場合
1番頭に目当てのHPが見つかった事と思います
見つからなかった方はもう少し頑張ってみて下さい

家の環境
現在はNT系でも動かす事が出来るようになってきたらしいですが
私の所では"SOFT ICE"の為にOSは"Win98Se"です
他のOSは殆ど詳しくない為質問には答えれない可能性ありますがご了承下さい

では、実際に"ollydbg"を立ち上げてみましょう
立ち上げたら、File→Open(解析したいファイルを指定)
今回は練習ですので"Ollydbg.exe"を選択して下さい
少し待つとメニューと4分割された窓が起動したと思います
左上が"Disassembler window"で逆アセンブルされたコードを表示
右上が"Registers window"でレジスタを表示
左下は"Dump window"でメモリ等の内容を表示
右下が"Stack window"でスタックを表示
他の部分に関しては講座の途中で使いながら少しずつ説明していきます

初めて起動した方はこんな意味不明な画面が出てきて本当に解析出来るのかと
思われた方も多いでしょうがコツを掴めばなんとかなるものです
一緒に頑張りましょう

設定
最初はコード上で日本語が表示出来ないので
CPUと書かれている窓の何処でもよいので
右クリック→Appearance→Font(all)→System fixed font

備考
"C:\WINDOWS\SendTo"にollyのショートカット入れておくと
右クリックで直接解析ファイルを呼び出せて便利かと思います

今回は前振りが長かった為、次回から実際の解析に入るわけですが
解析といっても最初に何をすればいいのか判らない人もいるかと思います
そういう場合は、そのソフトが実際どのように動いているのか
起動して確認してみるのが一番良い方法です

例えば適当なソフトを実行させてみます
このソフトの場合は、メニューにパスワード入力というものがありましたので
適当な文字列を入力してみます
"123456789"と入力してOKボタンを押すと"パスワードが間違っています"と
表示された後に最初の画面に戻りました

更にゲームを始めてみると20プレイを過ぎた後にメッセージが出現後
強制的に終了しました

この事から何をすれば普通に遊べるのか考えてみます
・20プレイ終了の判断を無くす
・パスワードを解析する
・常にパスワード登録されている状態にする

これが解析の第1歩になる筈です

-------------------
Re:解析講座第1回
投稿者:dori 投稿日:2002/04/05 23:14:34

今回のターゲット
PenTiles Ver1.01
*ttp://www.vector.co.jp/soft/win95/game/se060423.html

まずは、前回説明した通り
実際に一度立ち上げて何をすればよいのか考えてみましょう

ヘルプ→バージョン→登録
適当な文字列"123456789"を入力しOKを押して下さい
"パスワードが違います"と出た後にバージョン画面に戻りました

この事から推測すると、まず文字列を取得し正解のパスワードと比較
入力されたパスワードと正規のパスワードが同じなら登録
違えばエラーメッセージを出力となっているのではないかと考えられます

これから実際にデバッガを使っていくのですが頻繁に出てくる機能に
"ブレークポイント"というものがあります
これは、プログラムの中で使われている関数等に罠を仕掛けるようなものです

例えば、メッセージを出力する関数にブレークポイントを仕掛けておくと
実際にその関数をプログラムが使用した際にプログラムを停止させる事が出来ます
ブレークポイントの使い方も色々あるのですが実際に使う際に随時説明していきます

まずは、解析したいソフトの実行ファイルを読みこんで下さい
File→Open(Pentiles.exe)

右クリックSearch for→Name(label)
出てきた画面は、このソフトで実際に使っている関数の一覧です
この中で"GetDlgItemTextA"を左クリックで選択後
(見つからない場合は、右クリックSort by→Nameで判りやすくなります)
右クリック"Find references to import"
これで、選択した関数が何処のアドレスで使われているか表示されます

この画面でブレークポイントも仕掛ける事が出来ますので実際試してみましょう
仕掛ける際は左クリックで選択後"F2"です
解除するにはもう一度"F2"を押して下さい
アドレスの部分が赤くなれば登録OKです
"GetDlgItemTextA"は、3つありますので全部を登録しておいて下さい

次に同じ様にして、"MessageBoxA"にもブレークポイントを仕掛けるんですが
一つ一つセットしていってもよいのですが
ollydbgには結構便利な機能が色々ありますので使っていきましょう
ブレークポイントの一括セットの方法は
関数一覧表示の所でセットしたい関数を選択した後に
右クリック"Set breakpoint on every reference"で可能です
実際に"MessageBoxA"を選択してやってみて下さい

これで取りあえずブレークポイントを仕掛けるのは終了です
今現在ブレークポイントとして登録してあるものを確認するには
View→Breakpointsです
"GetDlgItemTextA"が3つ
"MessageBoxA"が5つ
ちゃんとセットされている事を確認して下さい

全部セットされているのを確認したら"F9"を押して下さい
"PenTiles"が通常通り立ち上がったと思います
"F9"はプログラムを走らせる時に押します

先程と同じように、ヘルプ→バージョン→登録と押し
パスワードの欄に適当に"123456789"などと埋めてOKを押して下さい
今度はエラーメッセージが出ずに、ollydbgの方に制御が移ったと思います

最初はどんなものか感覚的に掴む為にアセンブラの文法などは説明しないので
取りあえず解説通りに動かしてみて下さい

現在はブレークポイントを仕掛けた"GetDlgItemTextA"で止まっていると思います
判らない場合は、下記のような表示になっていればOKです
00402640 . FF15 94624000 CALL DWORD PTR DS:[<&USER32.GetDlgItemTe>

OKでしたら先に進みましょう、"F8"を2回押してみて下さい
するとEAXのレジスタに入力した文字列が格納された事が確認出来ると思います
"F8(Step over)"は、コードを1行ずつ実行していく場合に使用します

"F8"を押して進めていくと"CALL"という部分を過ぎて
"JE PENTILES.00402694"という部分を過ぎた後で画面が切り替わったと思います
更に"F8"を押して進めていくとアドレス4026A6の"MessageBoxA"の部分に
辿り着きます、そこの部分で"F8"を押すと
"PenTiles"の方でパスワードのエラーメッセージが表示されます

この事から何となく想像出来ると思いますが
"MessageBoxA"という処理はメッセージを出力する関数です
では、最初にブレークポイントをセットした方の
"GetDlgItemTextA"は何なのでしょうか?
関数を過ぎた後に入力した文字列がレジスタに格納された所からも
推測出来るかもしれませんが、これは入力された文字列を取得する関数です
"GetWindowTextA"というのも文字列取得ではよく使われます
この3つの関数はよく使われますので覚えておいて下さい

"PenTiles"の方のエラーメッセージを消すまで
"ollydbg"は止まったままなのでOKを押した後に
再度"ollydbg"に戻り進めていきます"F8"をどんどん押していくと
"RETN"を2回過ぎ、その後にもう一度"F8"を押した時点で
制御が"PenTiles"に戻ります

これで、取りあえず一区切り終了したのですが
先程推測した事と今回実際に試してみた結果を書いておきます
>まず文字列を取得し正解のパスワードと比較
>入力されたパスワードと正規のパスワードが同じなら登録
>違えばエラーメッセージを出力となっているのではないかと考えられます
"GetDlgItemTextA"で入力した文字列を取得
その後に何処かで比較分岐、パスワードが正規パスとは違っていた為
"MessageBoxA"でエラーメッセージ出力という感じです

今回は流して見ただけですので何となく判ってもらえれば結構です

-------------------
Re:解析講座第1回
投稿者:dori 投稿日:2002/04/05 23:28:18

アセンブラの文法に関しては今まで何も説明していなかったので
簡単に説明しますが、全部解説するにはどう考えても
種類が多すぎるのでよく使われているものだけです

MOV      データ転送命令
ADD      加算命令
SUB      減算命令
MUL      掛け算
DIV      割り算
INC      +1
DEC      -1
CMP,TEST 比較命令
JMP      無条件ジャンプ
OR       論理和
AND      論理積
XOR      排他的論理和
PUSH     スタックに保存
POP      スタックから取り出し
CALL     サブルーチン・コール
RET      サブルーチンから復帰

比較ジャンプ命令(符号のある無しでも命令が違うので他にも沢山あります)
JE,JZ    同じならジャンプ
JNE,JNZ  違えばジャンプ
JB,JL    小さければジャンプ
JA,JG    大きければジャンプ

"比較命令"と"比較ジャンプ命令"に関しては対になっているようなもので
"CMP(比較命令)"で文字列や数値等を比較し結果をレジスタにセットします
大概はそのすぐ後にある"比較ジャンプ命令(JZ等)"で分岐をするという
パターンが多いです

何となく文法が判った時点で今日の講座を
もう一度最初から試してみる事をお勧めします

次回は、正規パスと入力された文字列を比較している部分を見ていく予定です

全命令に関しては下記の資料を見て下さい
*ttp://www.intel.co.jp/jp/developer/design/intarch/pentium/docs_pentium.htm
DLするのは、中巻:命令セット・リファレンス(日本語 PDF ファイル)

-------------------
Re:解析講座第1回
投稿者:dori 投稿日:2002/04/07 01:36:48

前回までで何となく流れとしては掴んで貰えたと思いますので
実際の正規パスとの比較の部分を見ていきます
解析の1番面白い部分です、皆さんワクワクしませんか?

ブレークポイントに関しては前回設定したまま特に何もせずに終了させていれば
登録されたままですので再度設定はしなくていいです
何時ものようにパスワードを入力してブレーク後、"F8"を3回
右側のレジスタウインドウのEAXに入力した文字列が格納されました
今はアドレス40264Aの"CALL"文の上にいると思います
ここまでは前回と一緒ですね

この状態で"F8"を押すとサブルーチンの中を内部で処理してしまい
次の行に行くのですが、今回はサブルーチンの中で何が行われているか
調べてみたいので"F7"を押して下さい
"F7"を押すと新しい画面に切り替わったと思います

"F8"と"F7"はどちらもコードを1行ずつ実行していくという点では同じなのですが
"F7"の方はすべての命令を実行
"F8"の場合は"CALL処理"や"繰り返し"はジャンプするという違いがあります
(ジャンプするだけで内部実行はしています)

どんどん先に進めて行きたいのですがその前に少し
知っておかなければいけない事があります

現在EAXレジスタにASCII "123456789"となっているのは見れば判りますが
これは目で判りやすいように"ollydbg"が表示してくれているだけです
メモリ上では文字列が実際はどう格納されているのか勉強してみましょう

EAXレジスタの右側に8桁の数字がありますがこれが実際に格納されている
メモリのアドレスを表しています
そのアドレスを左クリックして選択後、右クリック"Follow in Dump"
これで左下のダンプウインドウに文字列のメモリ状態が表示されました

ダンプウインドウは左側からアドレス、実際のダンプ、アスキー文字列を表示です
まず、メモリ上では文字というものは下記のような16進数で表される
文字コードに変換されて格納されています(対応を覚える必要は無いです)
0(30),1(31),2(32)・・・・9(39)
A(41),B(42),C(43)・・・Z(5A)
a(61),b(62),c(63)・・・・z(7A)
制御文字(水平タブ、改頁、復帰等)
終端記号(00)

ダンプウインドウをもう一度確認して貰えれば判ると思いますが
文字列の終わりは、終端記号(00)という事が確認出来ます

元々文字にも英語、日本語、中国語のような色々な文字があるのと同じように
文字コードにも色々な規格があります
最初は、"ASCII"というものが作られその後に各国で様々な規格が作られました
日本でよく使われているものとしては"ASCII","JIS","Unicode"辺りだと思います
興味があれば"文字コード"で検索すれば参考になるHPは
沢山ありますので覗いてみて下さい

では、解析の方に戻りましょう
40373Dで入力した文字列の最初の1文字をEAXに格納
MOV命令は転送命令でしたね
403740でEAX(入力した1文字目)と43とを比較(CMP命令)
403743で同じものだと判断出来れば403750にジャンプ
違っていたならジャンプせず403749へ(比較ジャンプ命令)

43と比較と言われても何をしているか判らない方が大半だと思いますが
さっきの文字コードの話を思い出してみて下さい
パソコンの内部では文字も数字のように扱っている事が判っていますので
入力した文字列の1文字目がEAXに格納された事から推測してみると
入力された文字の1文字目「1(31)」と正規パスの1文字目「43(C)」
を比較しているのではないかと考える事が出来ます

ここらへんの理屈は最初は感性で判って下さい
文法やその他諸々を最初から完全に把握しようとすると逆に判らなくなります

続きを見ていきましょう
勿論、1(31)とC(43)は違いますのでジャンプはしません
次のアドレス403749に"XOR EAX,EAX"というものがあると思います
XOR命令ですが同じレジスタ同士で処理すると
必ず0になるという特徴があります
これに関しては解析していると至る所で目につきますので覚えておいて下さい

どんどん先に行きましょう
後は無条件ジャンプした後に"RETN"でサブルーチン抜けます(CALLの次の行に出現)
重要な部分だけ見ていけばよいので、"POP"や"LEAVE"は取りあえず無視

サブルーチンを抜けた所にある"ADD"も見て見ぬ振りをして
次の"TEST EAX EAX"で比較、今回はEAXが0だったのでジャンプ
その後も進んでいくとエラーメッセージを出力して終了

そこまで見終えた段階で少し考えてみて下さい
402654の部分でジャンプしてしまうとその後には比較ジャンプ命令は無い為に
必ず登録エラーメッセージが出てしまう所に注目して下さい
という事はエラーメッセージを出さないようにするには、
ジャンプをさせたく無いわけですから、402654の比較の時点で
EAXに0以外の数字が入っていなければならないわけです

更に遡って考えてみると今回は、1(31)とC(43)を比較して違っていたので
"XOR EAX EAX"を処理してEAXが0、その後は"RETN"で戻ってくるだけだった為
EAXに0以外が入る筈が無い事も判ります
という事は最初の1文字目にC(43)を入力していた場合どうなるんだろうと
思われた方は勘が冴えていますよ

今までの説明で判らなかった方も焦らずに
もう一度最初からエラーメッセージの出力までを何度も流してみて下さい
何度も言っているように全部判る必要はありません
重要な部分をポイント事に把握していって下さい
技術は後から必ず付いてきます

では、再度"C123456789"などとパスワードを入力してコードを
各自で追ってみて下さい

残りの比較部分に関しては殆ど同じ処理を繰り返しているだけなので
判らないという事は無いと思いますので確認しながら見ていって下さい
403892まで辿り着ければ今までと違いEAXに1が入り
サブルーチンから戻ってくる事が出来ます
是非自分の目で確かめてみて下さい

これで解析講座第1回は終了させて頂きます

今回の説明に関しても至らない点は多数あったと思いますが
見て下さった方ありがとうございます

これから解析の世界に羽ばたく方々に対して
最後に私からの言葉を書いておきます

ここは裏世界だという事を何時も忘れずに
At own your risk


解析講座第1回 Q&Aコーナー

Q.今回の方法が有効な確率と難易度(10段階中2くらいでしょうか?)を
提示してくださると幸いです。

A.今回の方法が有効な確率ですが
一文字ずつ比較というソフトに関してはそれ程多くは無いのですが
文字コードに関しては直接比較というよりも
文字列を扱う色々な処理に使われる可能性があるので
最初に知っておいて損は無いものと考え今回講座に組み込みました

更にそれだけを使うのでは無く色々な手法と連携させて使われる事が多いです
例えば文字列を取得後、入力された文字列の長さを調べ
8文字以外ならば比較部分は飛ばしエラーメッセージを表示し終了する等

難易度に関しては、10段階中3くらいでしょうか
文字列をそのまま表示しているわけでは無い為です

ただ、一概に難易度というものは個人個人の知識というものもありますので
決めるのは難しいと思います、今回のものに関しても文字コードの
知識が全く無い人が見れば難易度は遥かに上昇すると思われます

それに、キージェネタイプのものでも最後に出された値を
比較している部分を見つけるだけなら10段階中2というものも多いです
キージェネ部分まで解読しようとすれば難易度は大幅に上がる事は確実ですが

<XPでの動作報告>
sasさん提供
「PenTiles」WinXP上ではエラーメッセージが表示されない等
動作がおかしい部分があるようですがパス出しなどは一通りできたそうです


解析講座 補足第一回
投稿者:dori 投稿日:2002/04/08 10:11:25

ソフトの登録情報に関してですが
このような部分にも汎用的な知識を身につけておけば
後から色々と応用が効き便利だと思います

大きく分けるとレジストリに登録、ファイルに保存と2つしか無いです
基本的なものに関しては、ツールを使わずに調べる事が可能な為
各自で色々試してみて下さい

<レジストリ型>
触るのが怖いと言われる方も多いと思いますが
基本的には、削除する場合にバックアップを取っておけば問題は無いと思います
怪しいと感じたら再起動の前に元に戻しておきましょう

保存の方法はレジストリエディタを起動、保存したい部分をクリックしておいて
レジストリ→レジストリファイルの書き出し
元に戻す場合は書き出したレジストリファイルをダブルクリックすればOKです

@レジストリエディタ起動して登録したパスワードで検索してみる
見つかったら、その怪しい部分を削除して立ち上げてみる
欠点:暗号化されていると検索に引っ掛からない

Aレジストリは大体のソフトが何時も似たような場所を
使用しているので勘で探り当てる

[HKEY_CURRENT_USER\Software]
基本的にはこの後に追加されるのですが
直接ソフト名が入っているものや"会社名 or 製作者名"の後に
ソフト名となっているものが多いです

今回のソフトでしたら"Readme.txt"を読めば制作者名が書いてありますので
上記レジストリにその名前が無いか見てみればよいかと思います

<ファイル型>
@インストールしたフォルダに登録情報の入ったファイルが作成
登録完了後に新しいファイルが作成された場合はそれが登録情報の
格納場所である可能性が高いです

アンインストーラーが付いているソフトの場合は試しに実行してみましょう
殆どのソフトは、登録情報は残してアンインストールする為です

AWindowsのフォルダの中に作成
大概はソフト名の入ったファイルが作成される事が多いです
探し方としては、右クリック→アイコンの整列→日付順と並べ替えをしてみて
"ソフトを起動 or 登録完了"した日時に作成されたファイルを探してみて下さい

B"Win.ini"に追加
昔のソフトに多いのですが"C:\WINDOWS\Win.ini"の最後に
登録情報が追加されるものもあります
このファイルはWindowsを動かす為に必要なソフトの為、削除してはいけません
追加された登録情報だけを消さなければいけないので注意して下さい

よくある追加情報
[mogumogu]
pass=1234

この場合は上記の部分のみ削除


解析講座 補足第二回 実際に"K"してみよう
投稿者:dori 投稿日:2002/04/14 04:51:00

だぁくねこねこさんとの話しの中で少しだけ話題が出ていましたが
"K"というのは通称"Software Krack Patch"を縮めて使っている言葉です
よく使われてる意味としてはデモ版を正規版に変更する等のパッチが多いと思います

戯言としては、頭文字がCの場合は"Crack"でサーバー等に侵入し、
改竄や破壊活動を行う事を指していますので"Krack"とは別の意味合いです
たまに同じものとして扱ったり間違えて覚えていたりする人も見受けられるので
知識として覚えておくのもいいでしょう

パッチというものは、実際のプログラムをアセンブラレベルで変更する際に当てる
バイナリレベルでの変更点が書かれているものやプログラムを指しています
これに関してはUG界だけのものでは無く通常のソフトでもバージョンアップの際に
アップグレードする事はよくありますので皆さんにも馴染みは深いと思います

これから、実際にパッチの当て方を見ていくのですが
最初から"K"を考えるのでは無く
パス出しに一度は挑戦してみる事をお勧めします
見た感じ難しそうでもじっくり解析すれば判る場合もありますし
何より出た時に気持ち良いです

では、"K"のやり方を見ていきましょう
1番確実なのはパスの生成部分を見つけ最後に何が行われているのか
完全に把握する方法です、この方法ならパスワードのチェックルーチンが
難しい場合でも最後のチェックの方法さえ判れば登録出来てしまいます

今回のソフトの場合はサブルーチンの最後でEAXに1を格納し
サブルーチン後にジャンプしなければ登録となっていたのを思い出してみて下さい
忘れた方は今回の講座を最初からもう一度試してみて下さい

登録前の最後の分岐ジャンプは下記の部分です、この部分を実際に変更してみます
00402652 . 85C0                TEST EAX,EAX
00402654 . 0F84 3A000000  JE PENTILES.00402694

402654の行を左クリックで選択後
右クリック→Assemble
"JNE 402694"と変更して"Assemble"を押す

"Fill with NOP's"にチェックが付いていれば余った部分には
nop(何もしない命令)が自動的に追加されます

変更済みの場所は赤色に変化されます
"JNE命令"は"JE命令"の逆のジャンプ命令です
元々のプログラムは、EAXが0の場合ならジャンプしていたのですが
パッチ後は逆になりましたのでEAXが0の場合にジャンプしません

変更前
00402652 85C0                  TEST EAX,EAX
00402654 0F84 3A000000    JE PENTILES.00402694

変更後
00402652 85C0   TEST EAX,EAX
00402654 75 3E  JNZ SHORT PENTILES.00402694
00402656 90       NOP
00402657 90       NOP
00402658 90       NOP
00402659 90       NOP

上記のようにパッチを当てた事を確認後
早速パスワードを入力してみましょう
登録OKのメッセージが確認出来ましたか?
レベルの変更も問題無く出来た事から考えてもOKそうです

ただ、今回のパッチは単純に逆のジャンプにしただけですので
正規パスを入れると逆に間違っているとのメッセージが出ちゃいます・・・
こういうのは手抜きパッチと言われてしまう可能性ありますので
これから自分でパッチを当てる際は色々な方法を考えてみるのをお勧めします

もし書きかえる予定では無い部分まで変更してしまった場合の対処法は
変更された部分の1番上を左クリックで選択後
右クリック→Undo Selectionを元のプログラムに戻るまで繰り返して下さい

では、再起動(メニューDebug→Restart)した後に
もう一度00402654の部分を見て下さい
先程変更した筈の部分が元のプログラムに戻ってしまっています

これは何故かというと"ollydbg"がメモリ上にプログラムをロードして
デバッグしている性質上"ollydbg"を終了するとメモリ上のプログラムも
破棄されてしまいます、パッチもメモリ上のプログラムのみ変更している関係上
HDにあるソフトに関しては変更されていないという事になります

その為、実際の実行ファイルにパッチを当てる場合は
バイナリエディタ等を使う必要がありますので適当なものをDLして下さい

書き換える際に必要なメモリアドレスとオフセットアドレスの違いに関しては
解析講座の途中でだぁくねこねこさんに解説して貰いましたので省かせて貰います
調べる方法は、変更するメモリアドレス"402654"を左クリックで選択後
右クリックView→Executable file、新たなウインドウが表示され
変更するオフセットアドレスは"1A54"だという事が判ります
<だぁくねこねこさんの発言は解析講座(仮)を見て下さい>

バイナリエディタでの変更箇所
変更前 1A54 0F843A000000
変更後 1A54 753E90909090

書き換えが終了したら保存後に実行して下さい
起動後に色々試してみると何か変な事に気付くと思います
パッチを当てて登録済みの状態にした筈なのですが
レベルを変更しようとすると送金されていない事を伝えるメッセージが表示されてしまいました
試しにもう一度パスワードを入力すると登録OKのメッセージはちゃんと出ます
更にメッセージが出た後にレベルは変更出来る事からパッチの当て方を
間違えた訳でも無い事は確認出来ます

一応支障は無いようですが起動の度に毎回パスワードを
入力しなければいけないのでは不便ですね・・・

困りました、どうやら少々問題有りのパッチをしてしまったようです
このように問題が見付かった場合は変更した部分を元に戻しておいて下さい

バイナリエディタには変更した部分を元に戻したい時に使う
Undoが付いているソフトも多いのでそれを使えば便利です
大量に書き換えた場合などで元に戻すのが面倒な時は変更済みの
ファイルを削除して上書きインストールしてしまうのも一つの手です

時々パッチした部分を元に戻さずに再度パッチを当てる人がいますが
何度も繰り返していると何処を変更したか判らなくなったり
最初に変更した部分の為に後から問題が発生した際に
原因の特定が難しくなる可能性が高くなりますので
余りやらない方がいいと思います

今回のように登録された筈なのに再度立ち上げて確認してみると
登録されていないようなソフトの場合は起動時にも
再度パスチェックしていると考えられます

ただ、チェックルーチンのように別のプログラムを作る必要性が少ない
部分に関しては使い回されている可能性が高いと思われますので
プログラム中の別の場所で同じサブルーチンが呼ばれていないか調べてみましょう

コマンドを検索する場合は、右クリック後Search for→Command
このソフトのチェックルーチンは"403734"にサブルーチンとしてありますので
それを呼び出している"CALL 00403734"をサーチしてみましょう
"Entire block"にチェック付いている場合は全てのブロックを検索します
サーチ終了後に同じワードで再度サーチする場合は
右クリックSearch for→Next

調べてみた所、サブルーチンは2個所から呼ばれていました(4010D3 & 40264A)
2つ目に関しては解析講座で説明した登録チェックルーチンという事が既に判っているので
怪しいのは先に見つかった方だと考えられます

ここまで確認したら実際にどう使われているのか確認する為に
4010D3のサブルーチンコール部にブレークポイントを設置します
設置の方法は関数へのブレークポイントと同じように4010D3の行を
左クリックで選択後"F2"を押します

設置後、再起動(メニューDebug→Restart)してみて下さい
予想通り4010D3の部分で起動途中にブレークしました
更に、先程登録OKのメッセージが出た際に入力した
パスワードが4010CEの所に表示されています
どうやらこれを元に起動途中に再度正規パスか判断しているようです
この部分が起動途中に呼ばれている事から先程のパッチでは不完全だと判ります
「起動時には登録チェックルーチン(40264A)は呼ばれていない為」

このソフトのように、登録時にレジストリに登録しておき起動時に
再度チェックしているようなソフトは結構ありますので覚えておいて下さい
(他にはファイルに入力されたパスワードを保存しておくものもあります)

今回は単純にサーチのみで見つかったのですが通常はレジストリオープン処理等
別の方面から見ていくのですが初心者講座には適さない為説明は省いてあります

これまでの事を総合的に見て、何処にパッチあてればよいかと考えてみると
毎回呼ばれる部分にパッチを当てるのが確実でしょう

このソフトの場合ですと"403734"から始まるサブルーチンですね
適度に見た感じチェックの部分は飛ばしてもよさそうな感じだった為
最初の部分から最後のチェックが終わる部分まで無条件ジャンプさせました

変更前
00403743 0F84 07000000  JE PENTILES.00403750
00403749 33C0                XOR EAX,EAX

変更後
00403743 E9 4A010000   JMP PENTILES.00403892
00403748 90                  NOP
00403749 33C0              XOR EAX,EAX

バイナリエディタ
変更前 2B43 0F8407000000
変更後 2B43 E94A01000090

変更後起動して確認してみると登録済みの状態です
レベルの変更も問題無く行えた事からOKだと判断しました

よく同じソフトでもバッチが何種類かあるのを見た事があると思います
それは何故かというと人によってパッチを当てる部分や方法が違ってしまう為です
今回のソフトを例に上げるとすれば、文字列を比較した後の"JE命令"15個全部を
逆ジャンプの"JNE命令"に変更する人もいるでしょうし(変更箇所が多いので大変)
サブルーチンの頭でEAXに1を格納した後に即"RET"でサブルーチンを抜けてみる等
パッチの当て方は幾らでも考える事が出来るかと思います
各自で色々なパッチを当てて確認してみて下さい

最後に、よくある"K"のパターンとしてはエラーメッセージが出力(MessageBoxA)された際に
そのメッセージから遡り直前にある比較ジャンプを逆ジャンプに変更すると
結構な確率で登録メッセージが出力されたりします
知識として知っておくのもいいでしょう



メモリアドレスとオフセットアドレスの違いについての説明
だぁくねこねこ さん提供
おおざっぱに言えば
アドレス、メモリアドレスといえば実行中の実行ファイル上のアドレスのこと。
00400000ぐらいから始まっているやつね。
解析の説明で出てくる「アドレス」といえば普通こちら。
デバッガを使うときのアドレスのこと。

オフセット、オフセットアドレスといわれれば一般的にハードディスク上の
ファイル(イメージ)のアドレス。これは00000000hから始まっている。
パッチを当てるときに「アドレス」といわれたらこっち。
バイナリエディタを使うときのアドレスのこと。

オフセットという通り、オフセットアドレスは
メモリアドレスの始点(イメージベース)からの距離を示す・・・んだが実際はズレが生じる。
まあこれはPEを学ぶ時まで気にしなくていいです。

早い話が、デバッガ上でnopはje,jneを書き換えるメモリアドレスを特定したら
ハードディスクにパッチを当てるでしょう?
その時にメモリアドレスからオフセットアドレスを知る必要があるわけ。

w32dasmなら下のステータスバーに「@offset 0000069ch」などと出てきます。
olldbgならView→Executable fileで出てきます。