はじめに |
まずはじめに、対象にどのような制限があるか、README.TXTなどをよく読み確認しましょう。
A シリアルを入力出来るもの
- シリアルを入力しないと、一定期間で起動できなくなる。
- シリアルを入力しないと、一部機能制限がある。
B シリアルを入力出来ない体験版
- 機能制限がなく、一定期間で起動できなくなる。
- 機能制限があるが、サイズは製品版と同じ。
- 機能制限があり、サイズが製品版より小さい。
C 特別なファイル、ソフトが必要なもの
※ まずは、シリアルを入力出来るものについてを考えます。
アナライズ |
対象がどのようにコンパイルされているかで、解析方法にも定石がありこれを確認するツールもありますが、バイナリエデッタを利用して確認できます。
日本語は文字化けするようですが、大切なのはInformation Microsoft Visual Basic 5.0 の部分です。これでコンパイラーが確認できました。もうひとつ、EP Section が 「.text」 になってる部分も大切です。ここが、「UPX1」とか「.text」以外の表示になっていたら、 そのファイルはパックされてます。今後ふえることでしょう。
文字列「C++」で検索
- Visual C++ でヒット Microsoft Visual C++
- Borland C++でヒット Borland C++
文字列「MFC」で検索
- MFC42.DLL でヒット Microsoft Visual C++
文字列「VB」で検索
- VB40016.DLL でヒット Microsoft Visual Basic4(16bit)
- VB40032.DLL でヒット Microsoft Visual Basic4(32bit)
- MSVBVM50.DLL でヒット Microsoft Visual Basic5
- MSVBVM60.DLL でヒット Microsoft Visual Basic6
文字列「BOOLEAN」で検索
- Boolean でヒット Borland Delphi
文字列「PACK」で検索
- aspack、packedなどでヒット パックされてますので難解です!
PE IDENTIFIER設定

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

※ アナライザーとは、ウィルスチェックと同じくパターンチェックをしてるだけで、 パターンが登録されてなければ判別できません。最新版を入手しましょう。
バイナリ |
バイナリ(倍直)とは、バイナリエディタで表示される文字列がそのままパスワードになってるもので、 内部では、そのまま全部一度に比較してる場合と、一文字づつ比較してる場合があります。 なかには、文字列+内部計算数字などもあります。
@関数電卓を Stirling(スターリング) を使用してを見てみます。
Stirling.exeのショートカットをC:\WINDOWS\SendToに入れておけば、
@関数電卓PRO.exe 上で「右クリック」→「送る」→「Stirling」ですね。


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

とっても怪しい文字列があります!
「G R 8 0 4 9 1 6 F #」Unicodeでは2バイトで1文字なので「GR804916F#」で登録してみます。 みごと、登録できました。※ 倍直だとしてもキーワードから正規パスが離れている場合も有ります。
海外では実行形式パッチでUPが主流ですが、日本ではテキスト形式パッチを自分で処理するのが 一般的です。
FILENAME aaa.exe
0004123: 74 EB
これは、「aaa.exeファイル」 をバイナリエディタで開き「アドレス 0004123」
番地のデータ「74」を「EB」 に書き換えることを表しています。
数箇所なら、かまいませんがパッチャー(Patcher)を使用したほうが効率的です。
「FireFiower by FCJ」、「PatchManager by vernichten」、「NeZuPat by ねずみ」など有名です。
読込みさせるには、上記2行をテキストファイルで拡張子を*** .patと名前をつけ保存します。
※ パッチは生ものですから、製品名、バージョン、OS、作成日は必ず記入しましょう。
今後、Win98では動くのに?WinXPでは出来ないなどが増えるとおもわれます。
OllyDbgのフォントの設定をしましょう。
Terminal 6 を Font 5 に選択を変えて、 「Rename」ボタンを押します。
Font 5 を MS ゴシックに変更します。 ※ 文字化けは気にしないでください。
「Change」ボタンを押し下記のように設定します。


Use Parent's font in dialogs をチェック。

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

これは、実行ファイルがメモリ内部に展開されて、メモリ全体を一つの町とすると、
メニューの「Debug」→「Run」か「F9」ボタンを押し、
練習1が起動したら、適当なPasswordを入れ「OK」ボタンを押します。

「パスワードが違います!!」とのメッセージが出てしまいました。
リスタートします。「Debug」→「Restart」 か 「Ctrl+F2」
右上の適当な部分で「右クリック」→「Search for」→「All referenxed text strings」


今回は、文字列が二つしかありませんが本来はかなりの文字列があるもので、
カーソルを文字列「パスワードが違います!!」上で「左ダブルクリック」しましょう。
この文字列を利用してるコードウィンドウが表示されます。逆アセが読みやすいようにウィンドウを調節します。
004010FD の CALL から戻ったときEAXの値が変化すれば正解のようです。
パッチとして考えられるのは
00401104を選択して「右クリック」→「Binary」→「Fill with NOPs」
これは選択行をNOP(なにもしない)命令に換えます



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


「00000704 7407 JE SHORT 0000070D」 00000704 がバイナリエデッタでのアドレスです。
* LastMod. : 2002/05/18
FILENAME EX1.exe
00000704:74 90
00000705:07 90
SUB DWORD PTR DS:[EDI],58837083
これは、「DS:[EDI]」(データセグメントのEDI番地を先頭にして)
「DWORD」(4バイト)のデータから「58837083」16進を「SUB」(引く)ことを表してます。
@関数電卓を Stirling(スターリング) を使用してを見てみます。
Stirling.exeのショートカットをC:\WINDOWS\SendToに入れておけば、
@関数電卓PRO.exe 上で「右クリック」→「送る」→「Stirling」ですね。
文字列「登録」で検索




「PRO」→「ヘルプ」→「シュアウェア登録」で登録してみます。
だめですね~!?
では、文字列「パスワード」で検索
ヒットしません!?このソフトはVisual Basicでコンパイルされているのを思い出してください。 VBの場合Unicode文字列(WidCharFormat:)が使われる事があります。UNICODE文字列を探す設定にします。

文字列「登録」で検索


「G R 8 0 4 9 1 6 F #」Unicodeでは2バイトで1文字なので「GR804916F#」で登録してみます。 みごと、登録できました。
※ 倍直だとしてもキーワードから正規パスが離れている場合も有ります。
バイナリエディタ(2進編集器)とは和製英語で、正式にはヘックエディタ(HexEditor)です。
パッチとは |
パッチ(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)上で「右クリック」→「全般」「属性」 の読み取り専用にチェックが無いことを確認します。起動中のファイルには、パッチ出来ません。再起動してもシステムが 利用してるファイルなども、パッチ出来ません。どうしても、止められないファイルを パッチしたい場合は、名前を換えたり、移動すると出来ます。
「Config」ボタンを押して、環境設定のチェックを確認して終了します。
これで、.pat ファイルが FireFlower3 に関連付けされました。ollydbg107j.patをOLLYDBG.EXEのあるフォルダで左クリックすれば、FireFlower3 が起動してパッチが完了します。

※ OllyDbgのメニューを日本語化するものではありません。
まずは、ウイルスチェックをしてください、常識ですね!
次に、パッチ対象ファイル(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 をやってみましょう!
解析の流れとして
- ウイルスチェックをする。
- バックアップをとる。
- 制限を確認する。
- ファイルアナライザーなどで、ファイルの全体像を確認する。
- パスチェック、日数チェックなとの処理場所を探す。 一箇所とは限りません!
- 文字列から探す。
- WinAPI(関数)から探す。
- 逆アセを眺めカンで探す。
- 制限を解除する。
ここでは文字列から処理ルーチンを探してみましょう。
「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」(引く)ことを表してます。