西へのポケットジャーニースタディノート

オンラインのクラスの先生は、70以上のクラスの時間数がブロックされたと言いました。ODのレビューと考えてください

ODレビュー

e:モジュールリスト、
tと呼ばれるすべてのDLLを表示できます:スレッド行:実行中のすべてのスレッドを表示できます
k:スタックリスト:
bと呼ばれるすべての呼び出しを表示できます:ブレークポイントリスト:設定されたすべてのブレークを表示できますポイント
c: CPUウィンドウ/コードウィンドウ

入口:メイン/開始ウィンドウの作成が完了しました/サブプログラムの作成が完了しました
ODは次のようにメインプログラムの入口を開きます:
00B755E2> / $ 55 push ebp

プレス次のようにELEMENTCLIENT.EXEエントリを見つけるために、上記Eボタン:
実行可能モジュール、項目32
ベースアドレス= 00400000
サイズ=0095万(9764864.)
エントリ= 00B755E2 ELEMENTC。
名= ELEMENTCの
パス= D:\ kdxy \セットアップ\ポケット西向きjourney \ element \ ELEMENTCLIENT.EXE
ce追加プロセスを開いた、00400000から00D50000の範囲で、すべて緑色のアドレスを検索します。

追加のプロセスを実行できない場合は、
上のtボタンを押して右クリックし、すべてのスレッドを再起動します。

上のcボタンを押してメインインターフェイス
ctrl + gに戻り、アドレスを
入力して宛先アドレスに直接ジャンプし
ます。sendと入力し送信機能を直接検索します。sendが見つからない場合、WS2_32.sendと入力してEnterキーを押します。

中断する人がいない場所を見つけて、送信せずにパッケージを保持します。
薬を服用し、パッケージを中断すると、ctrl + F9で送信機能の最後の命令にジャンプできます
。Enterキーを押して次の命令に戻ります。呼び出し送信0x00666850

00666830   .  53            push ebx
00666831   .  56            push esi
00666832   .  8BF1          mov esi,ecx
00666834   .  57            push edi
00666835   .  6A 00         push 0x0                                 ; /Flags = 0
00666837   .  8B46 10       mov eax,dword ptr ds:[esi+0x10]          ; |
0066683A   .  8B48 04       mov ecx,dword ptr ds:[eax+0x4]           ; |
0066683D   .  8B50 08       mov edx,dword ptr ds:[eax+0x8]           ; |
00666840   .  8B46 04       mov eax,dword ptr ds:[esi+0x4]           ; |
00666843   .  8BD9          mov ebx,ecx                              ; |
00666845   .  2BD3          sub edx,ebx                              ; |
00666847   .  52            push edx                                 ; |DataSize = 856FDDC (139918812.)
00666848   .  51            push ecx                                 ; |Data = 0A29A465
00666849   .  50            push eax                                 ; |Socket = 0x3
0066684A   .  FF15 B868BE00 call dword ptr ds:[<&WS2_32.#send_19>]   ; \send
00666850   .  8BD8          mov ebx,eax

もう一度ctrl + f9を押して関数の最後にジャンプし、Enterキーを押して前の呼び出しの次の命令にジャンプします。間違ったキーを押した場合は、-キーを使用して前のポイントした命令に戻ることができます(またはctrl + f9またはenterにジャンプできます。先ほどの命令に戻ります)
このようにして、ループ内に複数の呼び出しを見つけ、1番目、2番目、3番目の呼び出しブレークポイントを指定し、上のbボタンを押してブレークポイントに
到達したすべてのブレークポイントを確認し、元に戻し、食べます。ドラッグエントリのブレークポイントはあなたが探しているものです!薬を服用しているときにのみ入ることができるブレークポイントである限り、それはスレッドにリモートで呼び出すことができます!最初の数行のプッシュを観察し、コードインジェクションでデバッグしてください!

通話中の通話を見つける方法:薬で通話する、つまり薬を通話に置き換える
通話をすばやく見つける:送信機能で停止して通話し、上のkボタンを押してすべての通話を分析します

送信関数の先頭で割り込み、右下隅のスタックアドレスをダブルクリックすると、− −>、->、になります。>> + 4、$ + 8など。
ソケット、データ、データサイズ、フラグの4つのパラメーターが渡されていることがわかります。各パラメーターのアドレスを分析できれば、さまざまな種類の呼び出しを実装できます。
送信関数の先頭の割り込みは、[ESP + 0x0C] == 0x0Bなどの条件付き割り込みに変更されます。1つずつ試してください!
ウォーキングブレイク、モーションレスブレイク、クリックブレイク、アタックブレイク、メディシンブレイクにはさまざまなデータサイズがあります。対応するブレイク値を書き留めてください。

eaxは通常、呼び出しの戻り値です。小さな部分はecxです
。ecxは通常、オブジェクトのベースアドレスを格納するために使用されます(新しい剣士の愛のDugu Swordのように)
ebxとedxは読み取りと書き込みが高速で、特別なことは何もありません。

プロセスをアタッチした後、デバッグを終了します。コード領域を右クリックします-strongOD-
ODを切り離します基本的なスキル:実行するf7とf8とf9を知っている、ctrl + f9と入力して-ジャンプするには、コードセグメントint3と割り込み条件、データセグメントメモリ(検出された場合は使用しないでください)とハードウェア(メモリデータにアクセスするための命令の次の行で中断)を中断します。上のボタンは、さまざまなウィンドウインターフェイスの
アセンブリの基本機能を示しています:mov(値を渡す)とlea(アドレスを渡す)、push x(sub esp、4 + mov [esp]、x)およびpop x(mov x、[esp] + add esp、4)、call x(push eip + jmp x)およびretn(pop eip )およびretn x(pop eip + add esp、x)

コード領域を右クリックして検索し、ユーザー定義のコメント(すべてのコードコメントを表示できます)、
コード領域を右クリックして検索し、すべての定数(緑色のアドレスを使用するすべてのコードを表示できます)

ODに[ebp + 2C]が表示されたら、最初にebpが関数スタックの最下位であるかオフセットであるかを判断する必要があります。ebpと右下隅のスタック領域はスタックの一番上にプルされ(push eipを呼び出し)、上の行(関数ヘッダーpush ebp)は
右下隅のスタック領域と同じです。新しくジャンプされた呼び出しでは、スタックの一番上にある命令の右側が「call return xxx」になり、渡されたパラメーターを次の行とともに囲むための括弧があります。この関数がプッシュされた後、 「
callreturnxxx 」はスタックトップではありません。コードretnを検索するときに表示されます。retnを区別するには、コードの次の行が関数エントリではありません。コード分析をクリックして、それを指すjmp矢印の上にあるかどうかを確認します。 、はい、それは同じ関数です(通常、中央はint3ではありません同じ関数)
コードを検索すると、retnが表示されます。retnの次の行が関数エントリであるかどうかを区別するように注意してください。ctrl+ f9-carriage return -前の行は呼び出しを指しています-関数の入り口のキャリッジ入力、今のretnの次の行と比較してくださいそれらは同じですか(通常、上記はint3が関数ヘッダーです)

ODに[esp + 10]が表示されたら、コードを見て4番目のプッシュを探す必要があることを理解する必要があります(espはスタックの一番上で、の右下隅にある4つのアドレスを探します)。スタック領域(単位として4B)。値)

ODについては、mov edx、[eax + 2C]を参照してください。前の行はcallです。おそらく、eaxがcallの戻り値であることに注意してください。

リモート呼び出しを呼び出す場合、呼び出し前のmovレジスタは、レジスタの値が関数本体で呼び出されるか、パラメータであるかによって異なります。
リモート呼び出しを呼び出す場合、呼び出し後のespの動作は、関数本体は自動かどうか。retn10などのフラットスタック、またはODを使用してCALLの前後にF8を実行し、プッシュ前と呼び出し後のespが等しいかどうかを確認すると、スタックが自動的にフラット化されるかどうかもわかります。

假设现在的场景如下(所有指令与值都假设为1B)
设10处指令执行时ebp与esp的值都是08
11    push eax
12    push ecx
13    push edx
14    call 0xF4
15    inc a
      ....
F4    push ebp
F5    mov ebp,esp
      ....
FE    pop ebp
FF    retn 3

我们知道call x(push eip + jmp x)
所以在执行F4处的指令前栈顶会有一个大括号括着四行
依次是eip的值即15,edx的值,ecx的值,eax的值
当前栈:(ebp=08,esp=04)
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

F4处压入ebp保护起来,此时栈顶的值是08,然后是15
当前栈:(ebp=08,esp=03)
03  08
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

我们知道esp永远是指向栈顶的,即此时esp的值是03
F5处把esp赋给ebp,则ebp的值也是03,指向本段函数的栈底
此时就回到了esp与ebp相等的情况(开始时的两个值都是08)
当前栈:(ebp=03,esp=03)
03  08
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

假设本段函数没有再调用子函数,没有对栈进行操作,一直到FE处
FE处pop ebp还原ebp的值为08,即上层函数的栈底,esp由于退栈地址增加变成04
当前栈:(ebp=08,esp=04)
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...

我们知道retn x相当于pop eip + add esp,x
首先eip=15,esp由于退栈地址增加变成05
当前栈:(ebp=08,esp=05)
05  edx
06  ecx
07  eax
08  ...
(补充说明:如果只是retn没有x,则第地址为15处的指令就该是add esp,3)

然后esp再add增加把三个输入的参数退掉
当前栈:(ebp=08,esp=08)
08  ...

假如上面的程序调整为:
F4    push ebp
F5    mov ebp,esp
F6    sub esp,04
      ....
FD    add esp,04
FE    pop ebp
FF    retn 3

解释:
F6的作用就是给局部变量开辟空间
FD的作用就是给局部变量释放空间

我们要区分出变量与参数,假如在执行到F8处时:
当前栈:(ebp=03,esp=02)
02  DD
03  08
04  15(返回到15)
05  edx
06  ecx
07  eax
08  ...
我们凭借OD右下角栈区中(返回到15)来进行分界
在04处(返回到15)下面的是传入参数,[ebp+08],[ebp+0C],...
在04处(返回到15)上面的是局部变量,[ebp-04],[ebp-08],...
注意如果是用esp来定位栈区地址的话esp只有加没有减的,要小心计算

おすすめ

転載: blog.csdn.net/cj1064789374/article/details/114542717
おすすめ