2014-10-26 113 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