1

cdbを使用して、次の条件付きブレークポイントがあります

bp 004bf9f8 ".if (@eax = 0) {.echotime;.echo Breakpoint 004bf9f8;r};gc"

これは断続的な問題を調査するためのものであるため、かなりの時間アタッチされたままにしておく必要がありますが、条件付きブレークポイントにより、アプリケーションの全体的なパフォーマンスが許容範囲をはるかに超えて低下します。

  • 条件付きブレークポイントを最適化する方法を知っている人はいますか? チェックするだけeax=0です。条件付きブレークポイントが非常に遅くなる理由を説明するいくつかの 投稿 を読みましたが、それらは完全に理にかなっているので、これは行き止まりだと思います。
  • メモリ内イメージでやりたいことはほとんどできます。に無条件のブレークポイントをif eax = 0 { <whatever>}追加できるように、何かを挿入するようにいくつかの命令にパッチを当てることは可能でしょうか?<whatever>

編集

コメントから、行動計画は次のようにスクリプト化することです

.dvalloc <bytes>結果をpatchという変数に格納します。

a 004bfa08 JMP patch
a patch MOV eax,esi
a patch+x CMP eax,0
a patch+y JNE 004bfa0a
a patch+z JMP 004bfa0a

patch+zこれで、無条件のブレークポイントを追加して、アプリケーションを停止することなく必要な情報をダンプできるはずです。

bp patch+z ".echotime;.echo Breakpoint patch+z;~.;r;!dpx;gc"

編集 2

次の POC はライブ デバッグ セッションで機能しますが、これはアプリケーションを停止せず、キー押下などを待機しないスクリプトに変換する必要があります。

実行されたコマンド

.dvalloc 1000

a 004bfa00
JMP 0x0c570000
NOP

a 0xc570000
mov edi,edx
mov esi,eax
mov ebp,edi
cmp eax,0
jne 0x004bfa06
jmp 0x004bfa06

bp 0c570011 ".echo Hello World"

出力/コンテキストを含む実行されたコマンド

0:010> .dvalloc 1000
Allocated 1000 bytes starting at 0c570000

0:010> u 004bf9f8 LD
application+0xbf9f8:
004bf9f8 53              push    ebx
004bf9f9 56              push    esi
004bf9fa 57              push    edi
004bf9fb 55              push    ebp
004bf9fc 51              push    ecx
004bf9fd 890c24          mov     dword ptr [esp],ecx
004bfa00 8bfa            mov     edi,edx |
004bfa02 8bf0            mov     esi,eax |-> these get overwritten so repeat in patch
004bfa04 8bef            mov     ebp,edi |
004bfa06 8bd5            mov     edx,ebp
004bfa08 8bc6            mov     eax,esi
004bfa0a e8e5feffff      call    application+0xbf8f4 (004bf8f4)

0:010> a 004bfa00
JMP 0x0c570000
NOP

0:010> u 004bf9f8 LD
application+0xbf9f8:
004bf9f8 53              push    ebx
004bf9f9 56              push    esi
004bf9fa 57              push    edi
004bf9fb 55              push    ebp
004bf9fc 51              push    ecx
004bf9fd 890c24          mov     dword ptr [esp],ecx
004bfa00 e9fb050b0c      jmp     0c570000
004bfa05 90              nop
004bfa06 8bd5            mov     edx,ebp
004bfa08 8bc6            mov     eax,esi
004bfa0a e8e5feffff      call    application+0xbf8f4 (004bf8f4)

0:010> a 0xc570000
0c570000 mov edi,edx
mov edi,edx
0c570002 mov esi,eax
mov esi,eax
0c570004 mov ebp,edi
mov ebp,edi
0c570006 cmp eax,0
cmp eax,0
0c57000b jne 0x004bfa06
jne 0x004bfa06
0c570011 jmp 0x004bfa06
jmp 0x004bfa06
0c570016 

0:010> u 0x0c570000 L6
0c570000 8bfa            mov     edi,edx
0c570002 8bf0            mov     esi,eax
0c570004 8bef            mov     ebp,edi
0c570006 3d00000000      cmp     eax,0
0c57000b 0f85f5f9f4f3    jne     application+0xbfa06 (004bfa06)
0c570011 e9f0f9f4f3      jmp     application+0xbfa06 (004bfa06)

0:010> bp 0c570011 ".echo Hello World"

編集 3

実行中の 7 つの実行可能ファイルに手動でパッチを適用することは成功しましたが、によって返されたアドレスによって.dvallocは、アセンブルさJMPれた命令に別の命令が含まれています。取得したアドレスからジャンプ先のアドレスを差し引くのと同じくらい簡単だと思っていまし.dvallocたが、そうではないようです。

   -------------------------------------------------------------
   .dvalloc+0x11 |a jmp 004bfa06 |opcode |cd       |LE
   --------------|---------------|-------|---------|------------
1. 00df0011      |e9f0f96cff     |e9     |f0f96cff |ff 6c f9 f0
2. 00e30011      |e9f0f968ff     |e9     |f0f968ff |ff 68 f9 f0
3. 00f00011      |e9f0f95bff     |e9     |f0f95bff |ff 5b f9 f0
4. 00ff0011      |e9f0f94cff     |e9     |f0f94cff |ff 4c f9 f0
5. 093a0011      |e9f0f911f7     |e9     |f0f911f7 |f7 11 f9 f0
6. 0c570011      |e9f0f9f4f3     |e9     |f0f9f4f3 |f3 f4 f9 f0
7. 0ce70011      |e9f0f964f3     |e9     |f0f964f3 |f3 64 f9 f0
   -------------------------------------------------------------

最初fはおそらく符号ビットですか?

編集 4

結局、計算は簡単ですが、十分に時間がかかりました。最初fは確かにサインです。

  • ジャンプするアドレスを取得します。私の場合004bfa06
  • 命令のメモリ位置の末尾を減算しjmp 004bfa06ます。私の場合、それは常に.dvalloc+0x16.dvalloc+0x11命令の開始です)

最後の試行 (7) に適用すると、

004fba01 - 0ce70016 = f3 64 f9 f0. 
The instruction to edit the memory at 0ce70011 then becomes e9f0f964f3.

以下は、ブレークポイントを設定している関数プロローグです。での命令004bfa08 (MOV param_1,ESI)は、前のでの命令のために冗長である004bfa02 (MOV ESI,param_1)ため、役立つかもしれませんが、ここから先に進む方法についての知識が不足しています。

                     **************************************************************
                     *                          FUNCTION                          *
                     **************************************************************
                     int * __register FUN_004bf9f8(int param_1, int param_2, 
     int *             EAX:4          <RETURN>
     int               EAX:4          param_1
     int               EDX:4          param_2
     int               ECX:4          param_3
     undefined4        Stack[-0x14]:4 local_14

004bf9f8 53              PUSH       EBX
004bf9f9 56              PUSH       ESI
004bf9fa 57              PUSH       EDI
004bf9fb 55              PUSH       EBP
004bf9fc 51              PUSH       param_3
004bf9fd 89 0c 24        MOV        dword ptr [ESP]=>local_14,param_3
004bfa00 8b fa           MOV        EDI,param_2
004bfa02 8b f0           MOV        ESI,param_1
004bfa04 8b ef           MOV        EBP,EDI
004bfa06 8b d5           MOV        param_2,EBP
004bfa08 8b c6           MOV        param_1,ESI
004bfa0a e8 e5 fe        CALL       FUN_004bf8f4
         ff ff
004bfa0f 8b d8           MOV        EBX,param_1
4

4 に答える 4