解決しようとしている特定の問題があります。クラスのメソッドの場所 (メモリ内) を見つける必要があります。メソッドへのポインタが処理されるため、構文制約にぶつかったと思いますmember pointer
例:
class Foo {
public:
int targetFunction(int value) { return value + 5; }
};
DWORD findLocation() { // ignore the fact that DWORD might not equal pointer size.
int (Foo::*address)(int) = &(Foo::targetFunction); // member function pointer
void* typeHide = (void*)&address; // Remove type
DWORD targetAddress = *(DWORD*)typeHide; // Convert type from void* to DWORD* and dereference to DWORD
return targetAddress;
}
int (Foo::*address)(int) =
のように書くこともできます auto address =
現在、VS2008では、Foo::targetFunction
のアドレスは「0x000F B890」ですが、&Foo::targetFunction
「0x000F 1762」と表示されています
まず、メンバー ポインターは、メンバー ポインター演算子.*
およびを使用して正しく機能します->*
。targetAddress をメンバー ポインターにキャストしても、まだ機能します。
第二に、場所はサンク関数にすることができます!
最後に、VS2008 のデバッガーを使用して targetFunction の値をmember pointer
のアドレス 1762 から VS デバッガーが報告する値 B890 に変更すると、私のコードは正しく動作します!
メンバー ポインター値 (1762) の代わりにアドレス値 (B890) を取得する C++ 固有の方法はありますか?
リクエストに応じて、私が機能させようとしているコードは次のとおりです。
BYTE overwriteStorage[300][2];
void NOP(void)
{
// hackish, but works for now.
}
void disableOlderVersions(DWORD _address, int index)
{
//...
_address = findLocation();
DWORD protectionStorage = 0;
VirtualProtect((void *)_address, 1+4, PAGE_WRITECOPY, &protectionStorage); // windows.h: Make Read/Write the location in code
{
BYTE *edit = (BYTE*)_address;
overwriteStorage[index][0] = *(edit+0); // store previous value to revert if needed
*(edit+0) = 0XE9; // JUMP (32-bit)
overwriteStorage[index][1] = *(edit+1); // store second value
signed int correctOffset = (signed int)NOP - (signed int)_address - 5; // calculate 0xE9 relative jump
*(signed int*)(edit+1) = correctOffset; // set jump target
}
VirtualProtect((void *)_address, 1+4, PAGE_EXECUTE, &protectionStorage);
}
findLocation
from aの最初の行をmember pointer
実際のに置き換えると、function pointer
完全に機能します。ただし、いくつかのクラスメソッドに対しても読み書きする必要があります。このメソッドは奇妙なmember pointer
s によって壊れています。
また、いくつかのローカル関数が正しいアドレスを報告しないこともありました (最近)。コンパイラの動作に制約されずに関数アドレスを見つける別の方法はありますか?