'C /C++-Win32API'環境でdllを作成しています。ユーザーが変更できるようにする必要のある定数変数(すべてDWORD値とLPWSTR / LPSTR文字列)があります。私が探しているのは、(うまくいけば)PEの必要なすべてのテーブルを更新する方法で、説明されているようにSAFEバイナリの変更を可能にするツールです。
1 に答える
したがって、別の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
属性しかないため、実際には読み取り専用であることに注意してください。これを書き込もうとすると、アクセス違反が発生します。
そして最後に...これはすべてかなりだらしないです。あなたが本当に他に選択肢がない限り、私は気にしないでしょう。