2

'C /C++-Win32API'環境でdllを作成しています。ユーザーが変更できるようにする必要のある定数変数(すべてDWORD値とLPWSTR / LPSTR文字列)があります。私が探しているのは、(うまくいけば)PEの必要なすべてのテーブルを更新する方法で、説明されているようにSAFEバイナリの変更を可能にするツールです。

4

1 に答える 1

3

したがって、別のPEセクションに構造体を作成できます。

// Create the section
#pragma section("myconst", read)

// Declare a struct to hold the constant data
typedef struct
{
    DWORD a;
    DWORD b;
    char stringa[256];
    char stringb[256];
} ConstData;

// Create an initialized instance of the struct in the new section
__declspec(allocate("myconst"))
const ConstData theData = {0xdeadbeef, 0xfeedface, "Hello", "dolly"};

コードをコンパイルします。Visual Studioコマンドプロンプトを開き、実行します

dumpbin /all myexe.exe > dump.txt
notepad dump.txt

セクションを検索しmyconstます。次のように表示されます。

SECTION HEADER #4
 myconst name
     208 virtual size
    4000 virtual address (00404000 to 00404207)
     400 size of raw data
    2000 file pointer to raw data (00002000 to 000023FF)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         Read Only

RAW DATA #4
  00404000: EF BE AD DE CE FA ED FE 48 65 6C 6C 6F 00 00 00  ï¾­ÞÎúíþHello...
  00404010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  00404020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................

コードで初期化された2つの16進値と最初の文字列値を確認できます。また、PEファイル内のこのデータのオフセット(「生データへのファイルポインター」)が0x2000であることがわかります。

その情報があれば、新しいデータブロックを作成し、PEファイルを開いて、0x2000でデータを上書きするのは非常に簡単です。

コードからのオフセットを決定するには、PEファイルヘッダーとセクションヘッダーを解析する必要があります。これはかなり簡単です。または、ビルドプロセスの一部としてdumpbin出力からオフセットを取得し、それを編集ツールのビルドにフィードすることもできます。

これをリリースモードでテストするには、実際に使用する必要があります。そうtheDataしないと、リンカがそれを破棄します。また、セクションにはread属性しかないため、実際には読み取り専用であることに注意してください。これを書き込もうとすると、アクセス違反が発生します。

そして最後に...これはすべてかなりだらしないです。あなたが本当に他に選択肢がない限り、私は気にしないでしょう。

于 2013-03-24T17:08:54.220 に答える