2017-12-14 9 views
0

私はollydbとチートエンジンを使用してC++プログラムを修正しようとしています。アセンブリ内の値を変更してexeに保存

メモリアドレスを削除して番号0(または同じ結果で終わるもの)に置き換えたいとします。

01411E38 |. 8BD0   MOV EDX,EAX 
01411E3A  83F2 00  XOR EDX,00000000 
01411E3D  90   NOP 
01411E3E  90   NOP 
01411E3F  90   NOP 
01411E40 |. 8995 B8FCFFFF MOV DWORD PTR SS:[EBP-348],EDX 

CPU DISASM

に変更
01411E38 |. 8BD0   MOV EDX,EAX 
01411E3A  3315 0020A701 XOR EDX,DWORD PTR DS:[1A72000] 
01411E40 |. 8995 B8FCFFFF MOV DWORD PTR SS:[EBP-348],EDX 

前:

私はここで0

と交換する必要があるコード内の4つのスポットがありますが、私の問題があります

セーブ/リロード時:

012私は変更を加えることが、私はexeファイルを保存し、再読み込みする場合は、修正アセンブリは/壊れ変更されたときに
01111E38 . 8BD0   MOV EDX,EAX 
01111E3A  83   DB 83 
01111E3B  F2   DB F2 
01111E3C . 00906090  DD 90609000 
01111E40 /. 8995 B8FCFFFF MOV DWORD PTR SS:[EBP-348],EDX 

はなぜ
XOR EDX,DWORD PTR DS:[1A72000]

XOR EDX,0


に仕事を変えるん。

+0

バギーツール。とにかく、命令全体を「NOP」にペーストしてください。より良い質問は、ファイルに '90 90 90'の代わりに' 90 60 90 'を得た理由は? – Jester

+6

これらのバイトを対象としたフィックスアップレコードが存在するためです。プログラムイメージはバイナリダンプではありません。彼らははるかに複雑です。パッチを当てたときの位置は01411E38でしたが、再ロードされたときの位置は01111E38でした。それは90の1つが60に変わった理由です。 –

+4

@RaymondChen ha、素敵なもの! – Jester

答えて

2

ありがとうございました。

これらのバイトを対象としたフィックスアップレコードが存在するためです。プログラム イメージはバイナリ・ダンプではありません。彼らははるかに複雑です。 は、パッチを当てたときの位置が01411E38でしたが、 がリロードされたときは01111E38でした。 90の1が60

に変更理由がある - レイモンド・チェン

@RaymondChen ha, nice one! A 2 byte jmp should take care of it then :)

- ジェスター

JMP 01411E40 
0123で

XOR EDX,DWORD PTR DS:[1A72000] 

を置き換え

+2

また、CMP EDX、DWORD PTR DS:[1A72000]で置き換えることもできます。すなわち、'cmp'と' xor'が1バイトのopcode + modr/mエンコーディングの両方であるため、同じアドレスからロードして正しくデコードしますが、**フラグのみを書き込みますEDXを書く代わりに** (私はIra Baxterの回答からNOPの一種として 'cmp'や' test'を使ってこのトリックを学んだ(https://stackoverflow.com/questions/10765317/can-assembled-asm-code-result-単一の可能な方法であることを除いて)。しかし、「jmp」も機能します。もちろん、絶対にではなく、実際にはrel8です... –

関連する問題