名前でインポートされた関数は、常にバイナリに埋め込まれた名前を持ちます(厳密にはインポート記述子ではサンク)。詳細なパラメータ情報はSteveが述べたようにpdbsから取得されます(ただしollydbgのようなデバッガシンボル名が利用可能であるため、argsを推論する)。これを避ける唯一の方法はIATに暗号化するか(Enigmaのようなサードパーティのパッカー/バーチャライザー/バイナリ保護システムなどを使用する)か、GetModuleHandle
(基本的にはPEBのスピルツールです)とGetProcAddress
のPEのスペルツール今度は、実行時に暗号化された文字列として必要なすべてのapi呼び出しを格納することで、普通のテキストを使わずに必要なものを呼び出すことができます(secureromはこれを行いますが、バイナリ難読化とともにGetProcAddress
を直接使用します)。
更新:コンパイル時の「難読化」の文字列の
、あなたは本当に簡単な、このようなものを(使用することができますが、それは移植する必要があり、あなたがC++ 0xのを使用している場合、これは非常に簡単です):
#define c(x) char((x) - 1) //really simple, complexity is up to the coder
#define un(x) char((x) + 1)
typedef int (WINAPI* MSGBOX)(HWND, LPCSTR, LPCSTR, UINT);
const int ORD_MASK = 0x10101010;
const char szMessageBoxA[] = {c('M'),c('e'),c('s'),c('s'),c('a'),c('g'),c('e'),c('B'),c('o'),c('x'),c('A')};
FARPROC GetProcAddressEncrypted(HMODULE hModule, const char* szName, BOOL bOrd = FALSE)
{
if(bOrd)
return GetProcAddress(hModule,reinterpret_cast<const char*>(reinterpret_cast<int>(szName)^ORD_MASK)); //this requires that ordinals be stored as ordinal^ORD_MASK
char szFunc[128] = {'\0'};
for(int i = 0; *szName; i++)
szFunc[i] = uc(*szName++);
return GetProcAddress(hModule,szName);
}
MSGBOX pfMsgBox = static_cast<MSGBOX>(GetProcAddressEncrypted(GetHandleEncrypted(szUser32),szMessageBox));
オプションで、(ちょうどあなたがそれらを呼び出すときDecodePointer
を使用することを忘れないでください)グローバル関数ポインタの値を非表示にするにはMSVCのEncodePointer
を使用することもできます。
注:動的リンクを使用する場合がありますそのちょうど私の頭の上
誰かがトロイの木馬を作成しているように聞こえます... – themaestro
または悪化します。あなたはシーメンスで働いていますか? :-) –
あなたは私のフレンドです。そのAVバイパスのもののいくつかの種類。しかし、害はないが保護レベルをテストする。 –