0

64 ビット Linux 用の動的ライブラリがあり、C++ コードからコンパイルされた多くの関数が含まれています。コードはオープン ソースではありませんが、関数の 1 つがどのように見えるべきかについての考えがあります。数式が含まれており、この数式の定数の 1 つを変更したいと考えています。

私にはある程度のプログラミング スキルがありますが、コンパイルされたオブジェクトや実行可能ファイルを調べたことはありません。objdump -RDCコマンドで取得したアセンブリコードの該当部分を以下に示します。対象の定数は型である必要がありdouble、行内の乗算コマンドで使用されているようです7e1cc

7e1b8:  00 
7e1b9:  f2 0f 59 74 24 78       mulsd  0x78(%rsp),%xmm6
7e1bf:  f2 41 0f 59 f0          mulsd  %xmm8,%xmm6
7e1c4:  f2 0f 58 ce             addsd  %xmm6,%xmm1
7e1c8:  f2 0f 58 ca             addsd  %xmm2,%xmm1
7e1cc:  f2 0f 59 0d fc 0e 0c    mulsd  0xc0efc(%rip),%xmm1        # 13f0d0 <typeinfo name for RestorableCreator<Model>+0x90>
7e1d3:  00 
7e1d4:  48 81 c4 88 00 00 00    add    $0x88,%rsp
7e1db:  66 0f 28 c1             movapd %xmm1,%xmm0
7e1df:  c3                      retq   

ファイル内のこの定数の位置を見つけ、定数を 16 進形式に変換し、ファイル内の値を 16 進値に置き換える方法を知りたいです。誰かがこれを行う方法を説明できますか? また、適切なツールに関する提案も非常に価値があります。

4

1 に答える 1

1

定数はアドレス0xc0efc(%rip)にあります。ここ%ripで、 は次の命令のアドレス、つまり0x7e1d4です。したがって、アドレスは次のとおりです0xc0efc + 0x7e1d4 = 0x13F0D0(objdumpでもそれが出力されます)。次に、を使用してバイナリのヘッダーを調べますobjdump -h。これにより、すべてのセクションが仮想アドレスとファイル オフセットとともに一覧表示されます。アドレスがどのセクションに該当するかを特定し、そのセクションがどのくらい離れているかを計算してから、ファイル オフセットを追加します。次に、16 進エディタを使用して、そのオフセットから double を表す 8 バイトを取得します。たとえば、バイト配列を double にキャストして出力する単純な C プログラムなど、任意の方法で人間が読める形式に変換します。

于 2013-10-26T22:21:06.270 に答える