2011-10-20 10 views
3

開発プロセスでサードパーティのDLLを使用する必要があります。残念ながら、このDLLを変更したり、ライブラリの動作方法を指定することはできません。サードパーティDLLの静的変数を元の値にリセットする方法はありますか?

元のライブラリ開発者は、静的変数を介してメソッドに状態メカニックを導入しました。

例えば:

void foo() 
{ 
static int a = 1; 
if (a == 1) 
{ 
    /* some init logic */ 
    a = 2; 
} 
} 

いつか私たちは、元の状態にライブラリを持参する必要があります。

システム「ハッキング」なしで静的変数を元の値にリセットする方法はありますか?

現在のソリューションはFreeLibrary/LoadLibraryですが、避けたいのですが。

+2

これは可能です。私は私のプロジェクトでこれをやった。ここで私はあなたがそれを始める方法を投稿しました:http://stackoverflow.com/questions/4308996/finding-the-address-range-of-the-data-segment/4316804#4316804 – Nawaz

答えて

5

現在のソリューションは、最もクリーンなソリューションです。

唯一の選択肢は、変数がDLLに格納されている場所を見つけて直接変更することです。しかし、それは信じられないほど脆弱なハックです。たとえば、サードパーティのDLLが変更された場合、あなたのハッキングは予期しない影響で動作を停止する可能性があります。

1

残念ながら、いいえ、それはいくつかの深刻なハッカーがなければ不可能です。 FreeLibrary/LoadLibraryはあなたの唯一のオプションです。

1

静的ローカル変数のスコープは、自動ローカル変数と同じです(関数の呼び出し時にその値が存在することは別として)。だから、あなたはハックなしでそれらを変更することはできません。

0

RTLD_LOCALをもう一度ロードし、ロードされたときにのみ新しいライブラリポインタへのポインタを切り替え、古いライブラリをアンロードすることがあります。残念ながら、RTLD_LOCALのWin32に相当するものがあるかどうかわかりません(もしあれば)。

関連する問題