在这种情况下,我有一个使用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