2017-12-02 13 views
0

OllyDbgを使用してアプリケーションを修正していますが、アセンブリ言語が新しくなっています。メモリアドレスにMD5ハッシュを置く必要があります。 EAXにあります。どうしたらいいですか?OllyDbgでメモリアドレスにHASHバイトを入れる方法

enter image description here

私は挿入する必要がハッシュはdba2d8bf7063faf1275e693661bc9651です。私は次の方法で試しました:

MOV DWORD PTR DS:[EAX],32616264 
MOV DWORD PTR DS:[EAX+4],66623864 
MOV DWORD PTR DS:[EAX+8],33363037 
MOV DWORD PTR DS:[EAX+12],31666166 
MOV DWORD PTR DS:[EAX+16],65353732 
MOV DWORD PTR DS:[EAX+20],36333936 
MOV DWORD PTR DS:[EAX+24],63623136 
MOV DWORD PTR DS:[EAX+28],31353639 

私の意見では非常に長く非常に非効率です。

012B2C60は、ハッシュアドレスである
MOV DWORD PTR DS:[EAX], 012B2C60 

:私はまた別のアドレスでのハッシュを保存すると、私はMOV命令でそれを必要とするが、私はそれを動作させることができない場所に移動しようとしています。

もう一つの問題は、プログラムを開始するときに黄色の下線付きバイトが変更されていることです(私はそれらが動的アドレスでなければならないと思います)ので、そのアドレスに書き込む内容はプログラムの開始時に変更されますこれは起こっているからですか?

enter image description here

答えて

1

ところで、なぜあなたは32のバイトをコピーする必要がありますか? MD5 hashes are 16 bytes。あなたはそれのASCII表現をコピーしていますか?

MOV DWORD PTR DS:[EAX], 012B2C60

あなたはレジスタを変更せずにメモリにメモリをコピーすることはできません。また、各命令が012B2C60アドレスを必要とするので、32ビットの絶対アドレスを有するmov命令のシーケンスは、たとえそれがエンコード可能であっても、それほど短くない。あなたはXMMまたはYMMレジスタを壊し(またはスタック上に保存/復元)することができた場合、あなたは2 XMM SSEのロード/ストアのペアを使用して32のバイトをコピーすることができます


、または単一AVX vmovdqu ymm4, [012B2C60]/vmovdqu [eax], ymm4

この操作を行った後でプログラムのパフォーマンスが重要な場合は、周囲のコードが既にAVXを使用している場合はAVXを使用してください。それ以外の場合は、XMMレジスタにSSE movupsを使用してください。 (Avoid AVX/SSE transition stalls or Skylake false dependencies)。

代わりのAVXやSSE、あなたはREGSを復元し、その後、ESI、EDI、およびECXを押してecx=8/rep movsdを使用してでのmemcpyを実装することができます。 (その後、xchg再び担当者MOVSD前にあなたは可能性がxchg eax, edisub edi, 32、EDIについて。パフォーマンスIDKのためにそれをプッシュよりも良く/しかし、他の人と一緒にそれを保存/復元するためにポップだ場合。

それともそうでない場合rep movsdは、ランワム効率のためにコードサイズに適しています

これを行うコードがプログラムの起動時に一度しか実行されない場合、code-sizeが本当の問題でなければ、おそらく即時データをコピーするのではなく、opcode、modrm、およびdisp8(ただし、裸の[eax]アドレッシングモードを使用する最初のものを除く)pushは、即時データの密度が向上しますが、 。mov r64, imm64は10バイトですが、唯一のレジスタ先と連携し

+0

ありがとう、はい、それはASCII表現です。私はXMMレジストリを使用してバイトを移動することを選択しました。この方法で、2つのコマンドだけで32バイトを移動できます。しかし、私はまだ最初の出版物で言及したアドレスの問題を抱えています。 – Manuel23

+0

@ Manuel23:4命令:2ロード/ 2ストア。 (そして、あなたが望む言葉は、["registry"](http://www.dictionary.com/browse/registry)ではなく) "registers"です。 –

+0

@ Manuel23:私はあなたがどのような問題を持っているのか分かりません。 '[eax]'と '[eax + 16]'のアドレッシングモードで保存できるように 'movdqu xmm0、[012B2C60]'や '[012B2C60 + 16]'がロードされ、 'eax'にアドレスがあります。 –

0
  • 店あなたのハッシュコードをあなたのコードセグメントの底に通常のことができます;スタックに

    64ビット・モードではわずかに役立ちます。データセグメントは変更される可能性がありますが、コードセグメントバイトは決して変更されません。

  • memcpyこれらのバイトを宛先メモリアドレスにコピーする機能を使用します。
関連する問題