• ベストアンサー

デバッグ<命令の無効化>

ソフトを起動する度に表示されるタイトルロゴや 使用上あまり必要の無い部分を機能させないようにしたいと思い 逆アセンブルをして解析を始めたのですが 必要の無い命令を無効にするにはどうしたらいいのでしょうか? 例えば :0047D3EA push 000055F2 のようなダイアログ呼び出し(?)の命令があったとして このダイアログの表示は必要無いので表示させないようにしたい この場合どの様にして書きかえればよいのでしょうか? バイナリエディタ等で開き書き換えるのだと思いますが どのようにしてよいのかわかりません また、ソフトウェア改造の違法性についても知っている方教えて下さい アセンブリ言語初心者ですので質問に意味不明なところがあるかもしれませんが そのへんもフォローしてお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • ashizawa
  • ベストアンサー率42% (3/7)
回答No.1

まず、基本的に、市販のソフトウェアの場合、逆アセンブルをすることは、著作権などの関係で禁止されている場合がほとんどです。(使用許諾書を見て下さい。音楽などと違って個人での使用時でも禁じていることが多い) 上記がクリアされているとして、いらない命令はNOP(No Operation)命令(CPUによって違う名前かもしれません)で置き換えればいいと思います。ただし、置き換える命令の長さが、代わってしまうと旨く行かないので、NOPを必要な数だけ入れる必要が在るかもしれません。また、スタックの数もきちんと考える必要が有ります。 出来れば、自分で小さなアプリケーションを作成して、テストしてみると一番解りやすいと思います。

j-hiphop
質問者

お礼

回答ありがとうございます ご指摘の通り自作アプリケーションでやってみたいと思います できればもう一つ教えていただきたいのですが NOP命令にして置き換えるとします その場合、バイナリを直接 バイナリエディタなどで書き換えて やる事はできるでしょうか? 可能でしたら方法についても教えて下さい

その他の回答 (2)

  • selenity
  • ベストアンサー率41% (324/772)
回答No.3

まずソフトウェアの使用許諾所を読んで ディスアセンブルなどのリバースエンジニアリングを 一切禁止するなどと書かれていないことを確認しましょう。 もし、本当にSplashWindowがうっとおしければ 開発元に文句を言いましょう。 正規ユーザなのだから、、、

j-hiphop
質問者

お礼

その通りですね 文句言ってもなかなか改善されないでしょうけど・・・・

  • ashizawa
  • ベストアンサー率42% (3/7)
回答No.2

先ほどの追加です。もちろん、バイナリエディタで、該当するコードの場所をNOPのコードに変更すれば問題有りません。たとえば、例に有った、 :0047D3EA push 000055F2 は、4バイトですので、NOPコードが2バイトのAA22だった場合、0047D3EAをAA22AA22にすれば、無効化が出来ます。ただし、該当するコードが3バイトでNOPコードが2バイトの場合など、前後のほかのコードを同じ動きをする別のコードに置き換えて調整をし、他からのジャンプなどにも注意を払う必要が有ります。 他に作業に当たっては、失敗することを考えて、元のプログラムのコピーに作業することと、数字が一つずれても一つ間違えてもおかしな動作を起こす可能性が在るので(OSを壊すとか、ハードディスクに不正にアクセスするなど)完全に安全な(壊れても良い)環境で行うことがベストだと思います。気をつけて取り組んで下さい。

j-hiphop
質問者

お礼

大変わかりやすい回答ありがとうございました とても参考になりました また質問することがあるかもしれませんが その時はよろしくお願いします

関連するQ&A

  • CASIOのポケコンZ-1GRのRET命令について。

    CASIOのポケコンZ-1GRのRET命令について。 いつもお世話になっております。 小生、現在CASIOのポケコンZ-1GRにて8086アセンブリを勉強している、 アセンブリ初心者です。 今回質問させて頂きたいのは、Z-1GRのアセンブリでラベル内にRET命令を記述し、 アセンブル、実行するとZ-1GRが終了してしまう現象についてです。 再現手順は以下のようになります。 1.Z-1GRを起動。 2.CREAR ,200と入力し、エンターキー押下。 3.menuキー押下し、メニュー画面を表示。 4.キー5を押下し、アセンブリモードに推移。 5.キーSを押下し、エディタを起動。 6.下記のプログラムを記述 ORG 2000H START: MOV AX, 0001H MOV DX, 000FH CMP AX,DX JC LABEL_1 MOV CX, 000FH JMP EXIT LABEL_1: MOV CX,0001H RET EXIT: IRET END 7.Shift+menuキーでアセンブリモードに推移。 8.キーAでアセンブル。 9.アセンブル完了画面が表示される。 10.BRKキー押下、monと入力、エンターキー押下。 11.デバッグ画面に推移し、G2000 ,2014と入力しエンターキー押下。 12.Z-1GRが終了する。 以上です。 もしかして、Z-1GRの仕様でラベル内ではRET命令を使えない事になっているのでしょうか? お忙しい中、大変申し訳ございませんが、先輩方ご教示宜しくお願い致します。

  • コーディングについて。

    コーディングとは、コンピュータにコード入力する事を言います。 転じてプログラミングの意味で使われますが、プログラムコードを書くこと全般を言います。 プログラムコードはふつうソースコードと呼びます。 ソースコードとは普通はテキストファイルの形で保存されるコードのことです。 アセンブリ言語もテキストファイルに書き込んでゆきます。 マシン語は、基本的にはテキストファイルではなく、実行形式のバイナリファイルそのままをバイナリエディタや専用エディタで編集します。 C言語中のインラインアセンブラのように、そこにマクロ命令でマシン語を書き込む事も出来るには出来ます。 勿論、マクロアセンブラ(MASM)のようなアセンブリ言語でもマクロ命令でマシン語コードを記述出来ます。 大昔まで言えば、穿孔テープを使っていた頃のコンピュータなら、テープに穴を空ける作業もコーディングです。 穿孔テープは穴の有無を2進数で示していて、そこに必要に応じてチェックサムなどを付けたものですが、これは紛れもなくマシン語です。 これら全てを総じてコーディングと呼びます。 ですから、アセンブリ言語もマシン語もそれを書くことはコーディングです。 以下四つの質問に答えていただけると幸いです。 ①テキストファイルとは何でしょうか? ② マシン語は、基本的にはテキストファイルではなく、実行形式のバイナリファイルそのままをバイナリエディタや専用エディタで編集します。 C言語中のインラインアセンブラのように、そこにマクロ命令でマシン語を書き込む事も出来るには出来ます。 勿論、マクロアセンブラ(MASM)のようなアセンブリ言語でもマクロ命令でマシン語コードを記述出来ます。 ここの意味がわかりません。もう少し詳しく教えて頂きたいです。 ③チェックサムとは何でしょうか? よろしくお願いします。 と ④テキストは文字コードが割り当てられた、16進数でいう0x20~7f のものです。 マシンコードは8bitなら全部 0x00~oxff 全部の値があり得ます よろしくお願いできればと思います。

  • プログラミングについて。

    コンピュータは電圧の高い(H)と低い(L)を2進数としてCPUがクロック信号の入力を受けて処理します。 2進数はそのままだと扱いづらいので、数値的に親和性のある2のn乗進数を使います。 一般にコンピュータは1オクテットを1バイト、1ワードとしています。 その時16進数2桁で1バイトとなることから16進数表記が使われています。 なので、極論で言えば16進数2桁ではなく256進数1桁でも良かったという事です。 実は、大抵のアセンブリ言語は2進数表記を扱えます(8進数も使えるかも)。 アセンブラは16進数でも2進数でもそのまま対応するマシン語に置き換えていくものです。 アセンブリ言語とマシン語は一体一で対応しているので、実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。 マクロアセンブラの場合はマクロ命令までは再現されませんが、ここでは関係無いので割愛します。 つまり、マシン語とアセンブリ言語は本質的に全く同じものです。 単に、人間に読みやすく見せているものアセンブリ言語です。 マシン語もアセンブリ言語も低水準言語です。 高水準言語とは、C言語などのコンパイルを必要とするものや、BASICやJavaScriptのようにインタープリタを必要とするもののことです。 こちらは、CPUが直接解釈できるマシン語とは全く違う人間の都合に合わせた表現でコーディングし、後からマシン語に変換する仕組みのものです。 人間に読みやいコードをマシン語に変換するので、関係は一体一ではありません。 つまりコンパイルやインタープリットすると元の情報(ソースコード)は失われます。 で、① インタープリタとインタープリットとは何でしょうか?教えていただけないでしょうか?すみません。 ② マクロアセンブラの場合はなぜマクロ命令が再現されないのでしょうか?教えていただけないでしょうか?すみません。 ③ 実行ファイルがあれば、逆アセンブルで完全なアセンブリコードを復元出来ます。とはどういう事でしょうか?つまり、実行ファイルというのは、プログラマーが書いたソースコードのことでしょうか?教えていただけないでしょうか?すみません。 教えていただけないでしょうか?すみません。

  • BASICのPRINT#命令

    必要にかられ、ベーシックでプログラムを記載していま す。ファイルに書き出す命令で「PRINT #」を使ってる のですが、最終のレコードを書き出した一番最後の位置に 化け文字がついてしまいます。 以下のようにコーディングしています。 ================================================== 20 OPEN "a" FOR INPUT AS #1 30 OPEN "b" FOR OUTPUT AS #2 32 INCNT=0 40 IF EOF(1)=-1 THEN 100 51 D128A$=INPUT$(128,1):D128B$=INPUT$(128,1):CRLF$=INPUT$(2,1) 52 IF LEFT$(D128A$,1)="S" THEN PRINT #2,LEFT$(D128A$,128); 57 IF LEFT$(D128B$,1)="E" THEN PRINT #2,LEFT$(D128B$,128); 58 INCNT=INCNT+1 90 GOTO 40 100 CLOSE #1,#2 ================================================== バイナリエディタで内容を見ると「1A」となっています。 これをつけたくないのですが、、、、 簡単に言えば、INPUTのファイルから128バイトずつの データを抜き出し、横一列に並べたいのです。 古い人の作成したもので、資料が手元になくて困って います。 ご存知の方がいれば教えてください。

  • NTVDM CPU は不正命令を検出しました

    XP Home SP2です。 起動直後から以下のエラーダイアログが提示されます。 16ビットMS-DOSサブシステム C:\WINDOWS\system32\wuauclt.exe NTVDM CPU は不正命令を検出しました。 CS:***** IP:****** OP:******* アプリケーションを終了するには、[閉じる]を選択してください。 「閉じる」と「無視」のボタンがあり、どちらを押してもダイアログは消えません。問題を解消して、このダイアログを表示させなくする方法を教えてください。 他の症状として、タスクマネージャが起動しない、レジストリエディタが起動しないことがあります。関連しているのでしょうか? このダイアログを無視して画面の端に追いやって、他のプログラム実行やネット接続は可能です。 調べたところ、このメッセージは、ウィルスやハードディスクかマザーボードの障害ということもあるらしいですが、ウィルスは検出されていません。msconfigでスタートアッププログラムを全部削除しても駄目です。ハードウェア的な可能性は否めません、というのはノートPC(2年経過、毎日酷使)が異常な高熱になり、ファンの回転音がガガガと異常になることがあります。HDD自体は、HDD HealthというソフトではHealth(健全)ということですが実際のところ詳しくは分かりません。 アドバイスまたは考えられる原因を教えてください。ありがとうございます。

  • アセンブリ:FCのファイルオープンについて

    アセンブリ:FCのファイルオープンについて ファイルオープンのファンクションコールについて質問させてください。 うまく伝えられるか不安なので、いま陥っている現象を順番に書かせていただきます。 まずエディタで、 ---------------------------------- MOV AH , 3DH MOV AL , 00H MOV DX , offset FNAME INT 21H FNAME DB 'C:\xyz.txt',00H ---------------------------------- という簡易なプログラムを記述しました(擬似命令は省いています) これをアセンブルすると、 --------------------------------------- CS:0100 B43D MOV AH,3D CS:0102 B000 MOV AL,00 CS:0104 BA0901 MOV DX,0109 (*注) CS:0107 CD21 INT 21 CS:0109 43 INC BX ・ ・ --------------------------------  となるのですが、このとき AX=0003  CY となり、ファイルオープンに失敗してしまいます。 理由がまったくわからないので、デバックの直打ちで 0200 DB 'C:\xyz.txt' と格納してから、(*注)である命令を MOV DX,0200 に打ちかえれば、 AX=0005  NC となって無事にオープンできるみたいです。 なお、ファイルオープンに限らず、ファイル作成でも同じでした。 エディタでアセンブル( DX , 0109 ) だと失敗し、 デバッグ直打ち( DX , 0200 ) だと成功します。 これはいったい、どういう理由からなのでしょうか? 何冊か本を読んでみたのですが、書かれているのはコードの記述のみなので困っています。 わかる方がおられましたら、ご教授ください。 WINXP:MASM32で行っています。

  • オブジェクトファイルのファイルフォーマット

    オブジェクトファイルのファイルフォーマット ELF/DWARF2形式について調べています。 C言語で作ったプログラムをコンパイルし生成されるオブジェクトファイルをバイナリエディタで開き、アセンブリ言語と比較すると、オブジェクトファイルの最初と最後にプログラムの内容(命令)と直接関係ないものが含まれていることが分かりました。 例えば、オブジェクトファイルのある場所や、コンパイルされた日時などです。(これらの情報はテキストだったので判別ができました。) インターネットで調べたところ、生成されたオブジェクトファイルがELF/DWARF2形式とうフォーマットで作られているというところまでは分かりました。 実際のオブジェクトファイルのヘッダとフッタ(命令の前後)を除いて、純粋な機械語(命令)の部分を取り出したいのですが、このELF/DWARF2形式というフォーマットでは、どうすれば、純粋な機械語の始まりと終わりを読み取ることができるでしょうか? よろしくお願いいたします。

  • アセンブリ言語について。

    >2進数の羅列では人間にはあまりに読み書きしにくいからです。 >それを命令単位に区切って、英単語を元にした名前を与えたのが、 >アセンブリ言語です。 ニーモニックとは、その命令の名前の事です。 簡潔に要点がまとまっている、すばらしい説明ですね。その通りです。 これで理解できないなら、追加の説明のしようがありません。 (なお、このように、他人の発言は引用符を付けて引用すると、わかりやすくなります。是非そうしてください。) まあ具体例を挙げるならこんな感じ。 (機械語データ) (アセンブリ言語) b8 57 61 6b 61 mov $0x616b6157,%eax 53 push %ebx 50 push %eax ba 04 00 00 00 mov $0x4,%edx bb 01 00 00 00 mov $0x1,%ebx b8 04 00 00 00 mov $0x4,%eax 89 e1 mov %esp,%ecx cd 80 int $0x80 58 pop %eax 31 c0 xor %eax,%eax 5b pop %ebx c3 ret 人間がCPUを直接動かすプログラムを書こうとするとき、アセンブリ言語を使って書きます(右側の部分)。 mov $0x616b6157,%eax push %ebx push %eax mov $0x4,%edx mov $0x1,%ebx mov $0x4,%eax mov %esp,%ecx int $0x80 pop %eax xor %eax,%eax pop %ebx ret そしてこれをアセンブルすると、1対1対応した機械語のデータ列が出来ます。 それが b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 この部分。 機械語には改行なんてありませんから、実際は一連の b8 57 61 6b 61 53 50 ba 04 00 00 00 bb 01 00 00 00 b8 04 00 00 00 89 e1 cd 80 58 31 c0 5b c3 と言うデータ列になります。 これをCPUが実行していきます。 相当熟練した人で無ければ、このデータ列を見るだけでプログラム構造を理解する、というわけに行きません。 なので、人間が機械語レベルでプログラミングする際には、アセンブリ言語を使います。 ※この回答のプログラムはこちらから引用しました。 >31バイトでつくるアセンブラプログラミング アセンブラ短歌の世界 >https://book.mynavi.jp/support/pc/4946/c01_assembra.pdf で、機械語データは、なぜ、0と 1だけではないのでしょうか?教えていただけないでしょうか?すみません。

  • エラーダイアログが頻繁に表示されて困っています。

    アプリケーションを終了すると、必ず(毎回)といっていいほどアプリケーションエラーのダイアログが表示されて困っています。 エラーダイアログの内容は、「0x011072eaの命令が0x00000418のメモリを参照しました。メモリがreadになることはできませんでした。プログラムを終了するにはOKをクリックしてください」と表示されます。 終了するとエラーが出るアプリケーションは、Lunascape3(ver3.6.5)です。時々なら仕方ないですが、終了する度に毎回なので困っています。 スパイウェアやウイルスはスキャンしてみましたが、特に何も見つかりませんでした。 これは、Lunascapeの致命的なバグか何かでしょうか?使いやすいブラウザなのでなるべくなら、アンインストールはしたくありません。 OSはWindowsXP SP2で、PCは東芝のTX650LSです。 どなたか、ご教授よろしくお願いします。

  • マシン語(MS-DOS)の実行過程がわかりません

    LSI C-86 Ver 3.30 試食版を利用して、「hello, world」を表示するプログラムをコンパイルしました。 出来上がったhello.exeがどのように実行されるのか知りたくて、SYMDEBコマンドでステップ実行してみることにしました。 その前にバイナリエディタでhello.exeを開くと、ヘッダは512バイトあり、200hからは最初のマシン語命令「B8 8B 02」が確認できました。 アセンブリ言語では「MOV AX,028Bh」となり、AXレジスタに028Bhがセットされるはずです。 しかし、実際にエミュレータ上で「SYMDEB hello.exe」実行してみると、次のような結果になりました。 -------------------- Microsoft (R) Symbolic Debug Utility Version 4.00 Copyright (C) Microsoft Corp 1984, 1985. All rights reserved. Processor is [8086] -r AX=4B01 BX=0000 CX=2CC1 DX=0000 SP=09C4 BP=0000 SI=0000 DI=0000 DS=117A ES=117A SS=146E CS=118A IP=0000 NV UP EI PL NZ NA PO NC 118A:0000 B81514 MOV AX,1415 -u 118A:0003 8ED0 MOV SS,AX 118A:0005 BC540F MOV SP,0F54 118A:0008 368C1E5800 MOV SS:[0058],DS 118A:000D B430 MOV AH,30 ;'0' 118A:000F CD21 INT 21 118A:0011 36A34500 MOV SS:[0045],AX 118A:0015 8A1E8000 MOV BL,[0080] 118A:0019 32FF XOR BH,BH -------------------- 最初のマシン語命令が、「MOV AX,1415」と書き換わっています。以降の命令はバイナリエディタで見た通りのようです。 なぜ最初の命令が書き換わってしまうのでしょうか?