2014-10-26 115 views
-7

在這種情況下,我有一個使用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()來查看輸出以進行調試。

+0

你需要做的錯誤檢查!但我認爲你的問題是GetComputerName不是kernel32.dll中的函數,它是一個宏。實際的函數是GetComputerNameA和GetComputerNameW,您必須將這些名稱之一傳遞給GetProcAddress。 – 2014-10-26 23:21:37

+0

'sztmp'指向一個長度爲1的'const'數組。你們都打破了const的正確性,並且可能溢出了。 – user657267 2014-10-26 23:21:38

+0

在main之前調用LoadLibrary和GetProcAddress可能不起作用,但不檢查。我猜'szAdd'是NULL。使用調試器來查看它崩潰的原因。 – 2014-10-26 23:21:39

回答

3

兩個問題:

變化GetProcAddress(szMod, "GetComputerName");GetProcAddress(szMod, "GetComputerNameA");因爲GetComputerNameA是函數的實際名稱。

更改char* szTmp = "";char szTmp[MAX_COMPUTERNAME_LENGTH + 1] = {};,因爲您需要可以寫入的緩衝區,而不是指向常量字符串文字的指針。

這工作:

#include <Windows.h> 

HMODULE szMod = LoadLibraryA("kernel32.dll"); 
FARPROC szAdd = GetProcAddress(szMod, "GetComputerNameA"); 

int main() 
{ 
    char szTmp[MAX_COMPUTERNAME_LENGTH + 1] = {}; 
    DWORD dwSize = sizeof(szTmp); 
    ((BOOL(WINAPI*)(LPSTR, LPDWORD))szAdd)(szTmp, &dwSize); 
    MessageBoxA(0, szTmp, 0, 0); 
    return ERROR_SUCCESS; 
} 

下面是一些附加的錯誤檢查版本:

#include <Windows.h> 
#include <iostream> 

int main() 
{ 
    char szTmp[MAX_COMPUTERNAME_LENGTH + 1] = {}; 
    DWORD dwSize = sizeof(szTmp); 

    HMODULE szMod = LoadLibraryA("kernel32.dll"); 
    if(!szMod) 
    { 
     std::cerr << "LoadLibrary failed - error = " << GetLastError() << "\n"; 
     return -1; 
    } 
    FARPROC szAdd = GetProcAddress(szMod, "GetComputerNameA"); 
    if(!szAdd) 
    { 
     std::cerr << "GetProcAddress failed - error = " << GetLastError() << "\n"; 
     return -1; 
    } 

    if(!((BOOL(WINAPI*)(LPSTR, LPDWORD))szAdd)(szTmp, &dwSize)) 
    { 
     std::cerr << "Calling GetComputerName failed - error = " << GetLastError() << "\n"; 
     return -1; 
    } 
    std::cout << "Computer name is '" << szTmp << "'\n"; 
    return ERROR_SUCCESS; 
} 
+1

您是否介意進行基本的錯誤檢查,以便OP可以看到它是如何工作的? – 2014-10-26 23:31:17

+0

雖然我不能將它作爲一個數組。我需要它作爲指針,因爲我也需要使用strcat()。任何方式呢? – sysenter 2014-10-26 23:46:36

+1

'szTmp'可以傳遞給'strcat'就好了,它會衰減到'char *'。你必須解釋爲什麼它不適合你。 – 2014-10-26 23:50:15