在這種情況下,我有一個使用getprocaddress()
的例外情況,因爲我的應用程序在啓發式掃描中被2 av檢測爲病毒,並掩蓋了getcomputername()
這樣的功能,所以我能夠避開它。爲什麼GetComputerNameA不能運行?
這裏是我的代碼(在評論的問題):
#include <Windows.h>
HMODULE szMod = LoadLibraryA("kernel32.dll");
FARPROC szAdd = GetProcAddress(szMod, "GetComputerName");
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
char* szTmp = "";
DWORD dwSize = MAX_COMPUTERNAME_LENGTH+1;
((BOOL(WINAPI*)(LPSTR,LPDWORD))szAdd)(szTmp, &dwSize); // program exits on this line, why?
MessageBox(0, szTmp, 0, 0);
return ERROR_SUCCESS;
}
注:我知道有更好的方式來調用LoadLibrary如洞隧道注入,但我覺得有一個原因,它不是公開透明網上披露;)但是,無論如何,這不應該成爲WIDE |之間的問題當我測試ANSI時,任何人都知道它是什麼?
我能做些什麼才能使其發揮作用?我看到它的方式,一切正常。但爲什麼它會崩潰?我只使用MessageBox()
來查看輸出以進行調試。
你需要做的錯誤檢查!但我認爲你的問題是GetComputerName不是kernel32.dll中的函數,它是一個宏。實際的函數是GetComputerNameA和GetComputerNameW,您必須將這些名稱之一傳遞給GetProcAddress。 – 2014-10-26 23:21:37
'sztmp'指向一個長度爲1的'const'數組。你們都打破了const的正確性,並且可能溢出了。 – user657267 2014-10-26 23:21:38
在main之前調用LoadLibrary和GetProcAddress可能不起作用,但不檢查。我猜'szAdd'是NULL。使用調試器來查看它崩潰的原因。 – 2014-10-26 23:21:39