1

ソースコードがもうないexeの文字列を少し変更する必要があります。Cで書かれていました。

C 文字列リテラルがマシン コードのリストにまったく表示されないように見えることに気付きました。生の ASCII ではなく、utf8/16/32 などではありません。それらはエンコードされているようです.32ビットのオペコードの一部として推測しています. たとえば、コードにc行があったことはわかっています: print("My string"); バイト「m」「y」「」「s」などですが、文字列はまったく表示されないようです。utf8/16/32コーディングでも、1/2/3/4/5でも表示されません各文字間の /6/7/8 バイト (これらすべての組み合わせを確認しました)。

私が理解していることから、リテラルは即時のオペコードにある可能性があり、これらは非バイト整列位置にASCII値の8ビットを持つ可能性があります。私が探すべきオペコードを知っている人はいますか?現時点では、ファイル全体を少しずつシフトしても、文字列のように見えるものはまだ見つかりません。

4

7 に答える 7

3

単純なprintステートメントがコンパイラーによってそのようにエンコードされることは疑わしいです。

私の推測は次のいずれかです:

  1. EXEは、他の場所から文字列を取得しています。(別のファイル、別のdllなど...)

  2. あなたは文字列を見つけるのに十分なほど一生懸命探していません。8進数だけでなくASCIIも表示する16進エディタを使用したと思いますか?

  3. コードの作者は、あなたが望むことをするのを妨げるために彼の邪魔をしませんでした。

とにかく本当に何をしようとしているのですか?

于 2009-08-03T00:57:47.403 に答える
2

文字列が見つからない理由はわかりませんが、

文字列を更新するだけでは危険で非常に困難な作業になると確信しています

于 2009-08-03T04:57:40.200 に答える
2

ファイル全体を少しずつシフトしたり、さまざまなエンコーディングを調べたりする代わりに、実行可能ファイルを逆アセンブルしてみませんか? プログラムはコードがなければ不思議なことをするだけではなく、逆アセンブルすることでコードを読むことができます。データがオペコードに格納されている場合、変更するのは困難ですが、コンパイラが文字列をそのように格納する理由は想像できません。

于 2009-08-03T04:03:23.467 に答える
1

Dumpbin(Visual Studioで提供)やobjdump(GNUツール、任意のプラットフォームで利用可能)などのツールを使用します。

.rodataおよび.textと呼ばれるセクションのコンテンツをダンプします。文字列はおそらくそこにあります。見つからない場合は、他のデータとコードのセクションを検索してください。

本当に見つからない場合は、実行可能ファイルが暗号化されている可能性があります。しかし、あなたがそれを書いたので、それはあまりありそうにありません。=)

[編集]

私の意見では、最も可能性の高い可能性は、文字列がコードセクション(おそらく.textと呼ばれる)に配置されたことです。データとしてダンプし、16進エディタのgrepなどのツールを使用して文字列を検索する必要があります。

于 2009-08-03T01:05:21.453 に答える
1

1 回だけ使用するか、より頻繁に使用するかという質問に対する答えとして考えられるのは、使用頻度の高い文字列は別のセクションに格納されますが、1 回だけ使用される文字列はコードに散在して格納されるということです (たとえば、無条件のジャンプ/分岐命令の後)。16 進エディタで文字列が表示されない理由は謎です。「すぐに文字列を読み込む」オペコードはかなり珍しいもので (関数の引数として渡す必要がある文字列の先頭の ADDRESS です)、いずれにしても文字列は表示されるはずです。バイト境界に格納されていない文字列は、非常にまれです。

提案: いくつかの文字列を 1 回使用し、いくつかの文字列を複数回使用する小さなテスト プログラムを作成し、(a) objdump (b) 16 進エディタで確認します。ソース行ごとに生成されたアセンブリ コードを表示するオプションがコンパイラにある場合は、それをオンにします。コンパイラが提供する最適化レベルごとに、上記のすべてを繰り返します。次に、実際のファイルで得られた知識を使用します。

関係するマシンアーキテクチャとコンパイラ(それは国家機密ではありませんか?)を明らかにすることで、より良い解決策がより早く得られ、質問の反対票を避けることができると考えてください;-)

于 2009-08-03T04:34:38.383 に答える
0

gcc の C で hello world をコンパイルしてから、SciTE で exe を読み取ると、意味不明な文字列が表示されます。16 進エディタ以外で exe を調べてみてください。

編集:見つけた文字列を変更しようとしました(単語の途中で文字列に文字を追加しました)が、exeが壊れました。だから、どのように文字列を変更するのかわかりません。

于 2009-08-03T04:43:10.280 に答える
0

プログラムをトレースしたところ、初期化時に DEFLATE を使用するセクションに文字列が格納されていることがわかりました。簡単なことは何もありません:-)

使用したコンパイラはわかりませんが、watcom コンパイラだったと思います。コードは 10 年以上前のものです。

于 2009-08-03T06:00:49.283 に答える