25

以前の雇用主では、基本的にDLLとヘッダーファイルだけのサードパーティコンポーネントを使用していました。その特定のモジュールはWin32で印刷を処理しました。しかし、コンポーネントを作成した会社が破産したため、見つけたバグを報告できませんでした。

そこで、自分でバグを修正してデバッガーを起動することにしました。いつものように、ほとんどどこにでもデバッグ防止コードを見つけて驚いたIsDebuggerPresentが、私の注意を引いたのはこれだった。

    ; some twiddling with xor 
    ; and data, result in eax 
    jmp eax 
    mov eax, 0x310fac09 
    ; rest of code here 

一見したところ、2回呼び出されたルーチンを踏んだだけで、その後はバナナになりました。しばらくして、ビットをいじる結果は常に同じであることに気付きました。つまり、jmpeaxは常に命令に直接ジャンプしましたmov eax, 0x310fac09。バイトを分析すると、DLL内のいくつかの呼び出しの間に費やされた時間を測定するために使用され0f31た命令がありました。rdtsc

だから私のSOへの質問は:あなたの好きなデバッグ防止のトリックは何ですか?

4

10 に答える 10

27

私のお気に入りのトリックは、あいまいなマイクロプロセッサ用の簡単な命令エミュレータを作成することです。

次に、コピー防止機能とコア機能の一部がマイクロプロセッサ用にコンパイルされ (ここでは GCC が非常に役立ちます)、バイナリ blob としてプログラムにリンクされます。

この背後にある考え方は、コピー防止は通常の x86 コードには存在しないため、逆アセンブルできないということです。プログラムからコア機能が削除されるため、エミュレーター全体を削除することもできません。

プログラムをハッキングする唯一の方法は、マイクロプロセッサ エミュレータが行うことをリバース エンジニアリングすることです。

私がエミュレーションに MIPS32 を使用したのは、エミュレートが非常に簡単だったからです (単純な C コードで 500 行しかかからなかったからです)。さらに分かりにくくするために、生の MIPS32 オペコードは使用しませんでした。代わりに、各オペコードはそれ自身のアドレスで xor されました。

コピー防止のバイナリはガベージ データのように見えました。

強くお勧めします!クラックが発生するまでに 6 か月以上かかりました (ゲーム プロジェクトのためでした)。

于 2009-02-21T15:08:01.723 に答える
6

私は多くのRCEコミュニティのメンバーであり、ハッキングとクラッキングをかなりの割合で行ってきました。私の時代から、そのような薄っぺらなトリックは通常不安定で、かなり無駄であることに気づきました。一般的なデバッグ防止のトリックのほとんどはOS固有であり、「ポータブル」ではありません。

前述の例では、おそらくインラインアセンブリとnaked関数を使用しています__declspecが、どちらもx64アーキテクチャでコンパイルするときにMSVCでサポートされていません。もちろん、前述のトリックを実装する方法はまだありますが、十分長い間逆転している人は誰でも、ほんの数分でそのトリックを見つけて打ち負かすことができます。

IsDebuggerPresentしたがって、一般的には、検出にAPIを利用する以外にデバッグ対策のトリックを使用しないことをお勧めします。代わりに、スタブや仮想マシンをコーディングすることをお勧めします。私は自分の仮想マシンをコーディングし、それを長年にわたって改善してきました。正直なところ、これまでのコードの保護に関して、これまでで最高の決断を下したと言えます。

于 2009-02-21T14:46:18.233 に答える
6

デバッガーとして親にアタッチし、主要な変数を変更する子プロセスをスピンオフします。子プロセスを常駐させ、特定の重要な操作の一種の IPC としてデバッガーのメモリ操作を使用するためのボーナス ポイント。

私のシステムでは、2 つのデバッガーを同じプロセスに接続することはできません。

これのいいところは、何かを改ざんしようとしない限り、何も壊れないことです。

于 2009-02-21T16:50:20.197 に答える
4

初期化されていないメモリを参照してください! (そして他の黒魔術/ブードゥー教...)

これは非常にクールな読み物です: http://spareclockcycles.org/2012/02/14/stack-necromancy-defeating-debuggers-by-raising-the-dead/

于 2012-02-28T18:39:06.780 に答える
3

最も最新の難読化方法は、仮想マシンのようです。

基本的に、オブジェクト コードの一部を取得し、それを独自のバイトコード形式に変換します。次に、小さな仮想マシンを追加して、このコードを実行します。このコードを適切にデバッグする唯一の方法は、VM の命令形式に合わせてエミュレーターまたは逆アセンブラーをコーディングすることです。もちろん、パフォーマンスも考慮する必要があります。バイトコードが多すぎると、プログラムの実行がネイティブ コードより遅くなります。

ほとんどの古いトリックは今では役に立ちません:

  • Isdebuggerpresent : 非常に不自由で、パッチを適用しやすい
  • その他のデバッガー/ブレークポイントの検出
  • Ring0 のもの : ユーザーはドライバーをインストールするのを好みません。実際にシステムの何かを壊す可能性があります。
  • 誰もが知っている、またはソフトウェアを不安定にするその他の些細なこと。クラックが原因でプログラムが不安定になったとしても、それでも動作する場合、この不安定さはあなたのせいになることを忘れないでください。

本当に VM ソリューションを自分でコーディングしたい場合 (販売用の優れたプログラムがあります)、1 つの命令形式だけを使用しないでください。コードのさまざまな部分にさまざまな形式を持たせることができるように、ポリモーフィックにします。このようにして、エミュレーター/逆アセンブラーを 1 つだけ作成しても、すべてのコードが壊れることはありません。たとえば、MIPS 命令形式は十分に文書化されており、IDA などの分析ツールは既にコードを逆アセンブルできるため、一部の人々が提供する MIPS ソリューションは簡単に壊れてしまうようです。

IDA pro 逆アセンブラーがサポートする命令フォーマットのリスト

于 2009-02-21T15:21:21.597 に答える
3

私は、堅実で信頼性が高く、宣伝されていることを実行するソフトウェアを作成することを望んでいます。彼らはまた、合理的なライセンスで合理的な価格でそれを販売していること.

私は、顧客とベンダーだけに問題を引き起こす複雑なライセンス スキームを持つベンダーとの取引に、あまりにも多くの時間を無駄にしてきたことを知っています。これらのベンダーを避けることを常にお勧めします。原子力発電所で働いていると、特定のベンダーの製品を使用することを余儀なくされ、したがって、彼らのライセンス スキームに対処しなければならなくなります。動作するライセンス製品を私たちに提供しようとして失敗した試みに対処するために私が個人的に浪費した時間を取り戻す方法があればいいのにと思います. 質問するのは小さなことのように思えますが、自分の利益のために巧妙になりすぎる人にとっては難しいことのようです.

于 2009-02-21T16:32:11.583 に答える
2

私の個人的なお気に入りは、プロセッサから独立して大規模なデータ転送を行うコプロセッサ( Blitter )があるAmigaでした。このチップは、すべてのメモリをクリアし、タイマーIRQからリセットするように指示されます。

アクションリプレイカートリッジを取り付けた場合、CPUを停止すると、Blitterは引き続きメモリをクリアします。

于 2012-03-09T07:21:45.750 に答える
2

2番目に仮想マシンの提案をします。mipsel-elf-gccで生成されたバイナリを(現在)実行できるMIPSIシミュレーターを実装しました。そのコード/データ暗号化機能(AESまたは任意の他のアルゴリズムを使用)、自己シミュレーション機能(ネストされたシミュレーターを持つことができる)に加えて、かなり優れたコード難読化ツールがあります。

MIPS Iを選択することの優れた機能は、1)実装が簡単で、2)Cでコードを記述し、デスクトップでデバッグし、完了したらMIPS用にクロスコンパイルできることです。カスタムオペコードをデバッグしたり、カスタムVMのコードを手動で記述したりする必要はありません。

于 2009-02-21T15:01:54.343 に答える
1

正当な見た目の真ん中に計算されたジャンプがありますが、実際の命令命令を実際に隠している命令命令は私のお気に入りです。いずれにせよ、それらは人間にとって非常に簡単に検出できますが、自動化されたツールはしばしばそれを台無しにします。

また、スタックの戻りアドレスを置き換えることは、時間を無駄にします。

于 2009-02-21T16:13:50.083 に答える
0

nopを使用してデバッガーを介してアセンブリを削除するのは便利なトリックです。もちろん、コードを元に戻すのは非常に困難です!!!

于 2009-02-21T14:33:15.330 に答える