【・_・】Serial掲示板ウォッチング2【・_・】
まず、最初に解析系で度々出てくる倍直の説明です
倍直とはバイナリに直に書きこまれている事から倍直と誰かが名付けた造語です
バイナリエディタで調べたいファイル(主に実行ファイル)を開き
"パスワードが違います"等のメッセージで検索してみると
近くに怪しげな文字列が見つかる場合がよくあります
VBの場合は"Unicode文字列"が使われる事が多いです
多種な文字コードを使用出来るバイナリエディタも沢山ありますので
自分の使いやすいものを探してみるのもよいかと思います
検索ワード:"登録"・"ありがとうございました"・"パスワードが違います"等
実際に"OllyDbg"を使って調べてみたいと思います
このソフトはフリーですが素晴らしいデバッガです
現在の最新バージョンは1.06ですので暇な時にDLしておいて下さい
"Ollydbg"はDLしてありますか?
ロボット系のサーチエンジンでしたら殆どの場合
1番頭に目当てのHPが見つかった事と思います
見つからなかった方はもう少し頑張ってみて下さい
家の環境
現在はNT系でも動かす事が出来るようになってきたらしいですが
私の所では"SOFT ICE"の為にOSは"Win98Se"です
他のOSは殆ど詳しくない為質問には答えれない可能性ありますがご了承下さい
では、実際に"ollydbg"を立ち上げてみましょう
立ち上げたら、File→Opne(解析したいファイルを指定)
"Ollydbg.exe"を選択して下さい
少し待つとメニューと4分割された窓が起動したと思います
左上が"Disassembler window"で逆アセンブルされたコードを表示
右上が"Registers window"でレジスタを表示
左下は"Dump window"でメモリ等の内容を表示
右下が"Stack window"でスタックを表示
後は、使いながら少しずつ説明していきます
初めて起動した方はこんな意味不明な画面が出てきて本当に解析出来るのかと
思われた方も多いでしょうがコツを掴めばなんとかなるものです
一緒に頑張りましょう
設定
最初はコード上で日本語が表示出来ないので
CPUと書かれている窓の何処でもよいので
右クリック→Appearance→Font(all)→System fixed font
備考
"C:\WINDOWS\SendTo"にollyのショートカット入れておくと
右クリックで直接解析ファイルを呼び出せて便利かと思います
今回は前振りが長かった為、次回から実際の解析に入るわけですが
解析といっても最初に何をすればいいのか判らない人もいるかと思います
そういう場合は、そのソフトが実際どういった感じで動いているのか
起動してみるのがよいかと思います
今回使用ソフトを実行させてみると
設定1の中にパスワード入力というものがあるみたいですね
実際に適当な文字列を入力してみましょう
"123456789"と入力してOKボタンを押すと"パスワードが間違っています"と
表示された後に最初の画面に戻りました
更にオートプレイを行ってみると20プレイを過ぎた後にメッセージが出現後
強制的に終了しました
この事から何をすれば普通に遊べるのか考えてみます
・20プレイ終了の判断を無くす
・パスワードを解析する
・常にパスワード登録されている状態にする
これが解析の第1歩になる筈です
<例題> 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"は何なのでしょうか?
関数を過ぎた後に入力した文字列がレジスタに格納された所からも
推測出来るかもしれませんが、これは入力された文字列を取得する関数です
どちらもよく使われる関数なので覚えておいて下さい
"PenTiles"の方のエラーメッセージでOKを叩くまでは
ollydbgは止まったままなのでOKを押した後に
再度"ollydbg"に戻り進めていきます"F8"をどんどん押していくと
"RETN"を2回過ぎ、その後にもう一度"F8"を押した時点で
制御が"PenTiles"に戻ります
これで、取りあえず一区切り終了したのですが
先程推測した事と今回実際に試してみた結果を書いておきます
>まず文字列を取得し正解のパスワードと比較
>入力されたパスワードと正規のパスワードが同じなら登録
>違えばエラーメッセージを出力となっているのではないかと考えられます
"GetDlgItemTextA"で入力した文字列を取得
その後に何処かで比較分岐、パスワードが正規パスとは違っていた為
"MessageBoxA"でエラーメッセージ出力という感じです
今回は流して見ただけですので何となく判ってもらえれば結構です
アセンブラの文法に関しては今まで何も説明していなかったので
簡単に説明しますが、全部解説するにはどう考えても
種類が多すぎるのでよく使われているものだけです
MOV データ転送命令
ADD 加算命令
SUB 減算命令
MUL 掛け算
DIV 割り算
INC +1する命令
DEC -1する命令
CMP,TEST 比較命令
JMP 無条件ジャンプ
OR 論理和
AND 論理積
XOR 排他的論理和
PUSH スタックに保存
POP スタックから取り出し
CALL サブルーチン・コール
RET サブルーチンから復帰
比較ジャンプ命令(符号のある無しでも命令が違うので他にも沢山あります)
JZ 同じならジャンプ
JNZ 違えばジャンプ
JB,JL 小さければジャンプ
JA,JG 大きければジャンプ
"比較命令"と"比較ジャンプ命令"に関しては対になっているようなもので
"CMP(比較命令)"で文字列や数値等を比較し結果をレジスタにセットします
大概はそのすぐ後にある"比較ジャンプ命令(JZ等)"で分岐をするという
パターンが多いです
何となく文法が判った時点で今日の講座を
もう一度最初から試してみる事をお勧めします
次回は、正規パスと入力された文字列を比較している部分を見ていく予定です
全命令は下記の資料を見て下さい
*
ttp://www.intel.co.jp/jp/developer/design/intarch/pentium/docs_pentium.htm DLするのは、中巻:命令セット・リファレンス(日本語 PDF ファイル)
前回までで何となく流れとしては掴んで貰えたと思いますので
実際の正規パスとの比較の部分を見ていきます
解析の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が入り
サブルーチンから戻ってくる事が出来ます
是非自分の目で確かめてみて下さい
Q.EAXが1になる瞬間を見逃してしまいました・・・(汗)
もしお時間がありましたら、もう一度確認する方法(登録情報の削除?)を
ご教授願えないでしょうか?
A.[HKEY_CURRENT_USER\Software\Knum\Pentiles]
ここにパスが登録されているので、レジストリエディタで削除しませう!
Q.今回の方法が有効な確率と難易度(10段階中2くらいでしょうか?)を
提示してくださると幸いです。
A.今回の方法が有効な確率ですが
一文字ずつ比較というソフトに関してはそれ程多くは無いのですが
文字コードに関しては直接比較というよりも
文字列を使う色々な処理に使われる可能性があるので
最初に知っておいて損は無いものと考え今回講座に組み込みました
更にそれだけを使うのでは無く色々な手法と連携させて使われる事が多いです
例えば文字列を取得後、入力された文字列の長さを調べ
8文字以外ならば比較部分は飛ばしエラーメッセージを表示し終了
難易度に関しては、10段階中3くらいでしょうか
文字列をそのまま表示しているわけでは無い為です
ただ、一概に難易度というものは個人個人の知識というものもありますので
決めるのは難しいと思います、今回のものに関しても文字コードの
知識が全く無い人が見れば難易度は遥かに上昇すると思われます
それに、キージェネタイプのものでも最後に出された値を
比較している部分を見つけるだけなら10段階中2というものも多いです
キージェネ部分まで解読しようとすれば難易度は大幅に上がる事は確実ですが
ソフトの登録情報に関してですが
このような部分にも汎用的な知識を身につけておけば
後から色々と応用が効き便利だと思います
大きく分けるとレジストリに登録、ファイルに保存と2つしか無いです
基本的なものに関しては、ツールを使わずに調べる事が可能な為
各自で色々試してみて下さい
<レジストリ型>
触るのが怖いと言われる方も多いと思いますが
基本的には、削除する場合にはバックアップを取っておけば問題は無いと思います
怪しいと感じたら再起動の前に元に戻しておきましょう
保存の方法はレジストリエディタを起動、保存したい部分をクリックしておいて
レジストリ→レジストリファイルの書き出し
元に戻す場合は書き出したレジストリファイルをダブルクリックすればOKです
①レジストリエディタ起動して登録したパスワードで検索してみる
見つかったら、その怪しい部分を削除して立ち上げてみる
欠点:暗号化されていると検索に引っ掛からない
②レジストリは大体のソフトが何時も似たような場所を
使用しているので勘で探り当てる
[HKEY_CURRENT_USER\Software]
基本的にはこの後に追加されるのですが
直接ソフト名が入っているものや"会社名 or 製作者名"の後に
ソフト名となっているものが多いです
今回のソフトでしたら"Readme.txt"を読めば制作者名が書いてありますので
上記レジストリにその名前が無いか見てみればよいかと思います
<ファイル型>
①インストールしたフォルダに登録情報の入ったファイルが作成
登録完了後に新しいファイルが作成された場合はそれが登録情報の
格納場所である可能性が高いです
アンインストーラーが付いているソフトの場合は試しに実行してみましょう
殆どのソフトは、登録情報は残してアンインストールする為です
②Windowsのフォルダの中に作成
大概はソフト名の入ったファイルが作成される事が多いです
探し方としては、右クリック→アイコンの整列→日付順と並べ替えをしてみて
"ソフトを起動 or 登録完了"した日時に作成されたファイルを探してみて下さい
③"Win.ini"に追加
昔のソフトに多いのですが"C:\WINDOWS\Win.ini"の最後に
登録情報が追加されるものもあります
このファイルはWindowsを動かす為に必要なソフトの為、削除してはいけません
追加された登録情報だけを消さなければいけないので注意して下さい
よくある追加情報
[mogumogu]
pass=1234
この場合は上記の部分のみ削除
実際に"K"してみよう
"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の場合はジャンプしなくなりました
今回のパッチは単純に逆のジャンプにしただけですので
正規パスを入れると逆に間違っているとのメッセージが出ちゃいます・・・
こういうのは手抜きパッチと言われてしまう可能性ありますので
これから自分でパッチを当てる際は色々な方法を考えてみるのをお勧めします
もし書きかえる予定では無い部分まで変更してしまった場合の対処法は
変更された部分の1番上を左クリックで選択後
右クリック→Undo Selectionを元のプログラムになるまで繰り返して下さい
変更前
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そうです
では、再起動(メニューDebug→Restart)した後に
もう一度00402654の部分を見て下さい
先程変更した筈の部分が元のプログラムに戻っていると思います
これは何故かというと"ollydbg"がメモリ上にプログラムをロードして
デバッグしている性質上"ollydbg"を終了するとメモリ上のプログラムも
破棄されてしまいます、その為パッチもメモリ上のプログラムのみ変更している為
HDにあるソフトに関しては変更されていないという事になります
実際に変更する場合はバイナリエディタ等を使う必要があります
バイナリエディタでの変更箇所
1A54 0F843A000000
1A54 753E90909090
書き換えが終了したら起動してみましょう
ですが、色々試してみると何か変な事に気付くと思います
パッチを当てて登録済みの状態にした筈なのですが
レベルを変更しようとすると送金されていない事を伝えるメッセージが出た筈です
試しにもう一度パスワードを入力すると登録OKのメッセージはちゃんと出ますね
更にメッセージが出た後にレベルは変更出来る事からパッチの当て方を
失敗した訳でも無い事は確認出来ます
一応支障は無いようですが起動の度に毎回パスワードを
入力しなければいけないのでは不便ですね・・・
困りました、どうやら少々問題有りのパッチをしてしまったようです
このように問題が見付かった場合は変更した部分を元に戻しておいて下さい
バイナリエディタには変更した部分を元に戻したい時に使う機能として
Undoボタンが大概あると思いますのでそれを使えば便利です
大量に書き換えた場合などで元に戻すのが面倒な時はファイルを削除して
上書きインストールしてしまうのも一つの手です
時々パッチした部分を元に戻さずに再度パッチを当てる人がいますが
何度も繰り返していると何処を変更したか判らなくなったり
最初に変更した部分の為に後から問題が発生した際に
原因の特定が難しくなる可能性が高くなりますので
余りやらない方がいいと思います
今回のように登録された筈なのに再度立ち上げて確認してみると
登録失敗しているようなソフトの場合は起動時にも
再度パスチェックしていると考えて間違い無いです
ただ、チェックルーチンのように別のプログラムを作る必要性が少ない
部分に関しては使い回されている可能性が高いと思われますので
別の部分で同じサブルーチンが呼ばれていないか調べてみましょう
コマンドを検索する場合は、右クリック後Search for→Command
このソフトのチェックルーチンは"403734"にサブルーチンとしてありますので
それを呼び出している"CALL 00403734"をサーチしてみましょう
"Entire block"にチェック付いている場合は全てのブロックを検索します
サーチ終了後に同じワードで再度サーチする場合は
右クリックSearch for→Next
調べてみた所、サブルーチンは2個所からのみ呼ばれていました(4010D3 & 40264A)
更に2つ目は解析講座で説明した登録チェックルーチンという事が判っているので
怪しいのは先に見つかった方だと推測出来ます
ここまで確認したら実際に使われているのを確認してみたいので
4010D3のサブルーチンコール部にブレークポイントを設置します
設置の方法は関数へのブレークポイントと同じように4010D3の行を
左クリックで選択後"F2"を押します
設置後、再起動してみて下さい
予想通り起動途中にブレークしました
更に、先程登録OKのメッセージが出た際に入力した
パスワードが4010CEの所に表示されています
どうやらこれを元に起動途中に正規パスか再度判断しているようです
この部分が起動途中に呼ばれている事から先程のパッチでは不完全だと判ります
このソフトのように、登録時にレジストリに登録しておき起動時に
再度チェックしているようなソフトは結構ありますので覚えておいて下さい
今回は単純にサーチのみで見つかったのですが通常はレジストリオープン処理等
別の方面から見ていくのですが初心者講座には適さない為説明は省いてあります
これまでの事を総合的に見て、何処にパッチあてればよいかと考えてみると
毎回呼ばれる部分にパッチを当ててしまうのが問題が少なそうです
では、"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
よく同じソフトでもバッチが何種類かあるのを見た事があると思います
それは何故かというと人によってパッチを当てる部分や方法が違ってしまう為です
例を上げるとすれば、文字列を比較した後の"JE命令"15個全部を
逆ジャンプの"JNE命令"に変更する人もいるでしょうし
サブルーチンの頭でEAXに1を格納した後に即"RET"でサブルーチンを抜けてみる等
パッチの当て方は幾らでも考える事が出来るかと思います
各自で色々なパッチ当ててみて下さい
最後に、よくある"K"のパターンとしては出力されたエラーメッセージを検索し
そのメッセージの直前の比較ジャンプを逆ジャンプに変更すると
結構な確率で登録メッセージが出力されたりします
知識として知っておくのもいいでしょう