我正在尝试将函数挂接到cmd.exe进程
DLL注入(inject)就很好了,问题是我无法获取cmd.exe来调用我的函数
当我试图在命令提示符下输入单词“dir”时,它向我显示了将名字更改为“dan”的相同结果。
我究竟做错了什么?
HANDLE WINAPI newFindFirstFileA(__in LPCTSTR lpFileName, __out LPWIN32_FIND_DATA lpFindFileData)
{
WIN32_FIND_DATA FindFileData;
HANDLE hFind = FindFirstFile(lpFileName, &FindFileData);
*FindFileData.cFileName = L'Dan';
lpFindFileData = &FindFileData;
return hFind;
}
BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
MessageBox(NULL,L"DLL Was injected!", L"Message" ,NULL);
/* Hooking function */
DWORD* dw = (DWORD*)GetProcAddress( GetModuleHandleA("kernel32.dll"), "FindFirstFileA" );
*dw = (DWORD)newFindFirstFileA;
break;
}
/* Returns TRUE on success, FALSE on failure */
return TRUE;
}
最佳答案
GetProcAddress
不会将指针返回到IAT条目。而是返回实际函数的位置。因此,*dw = (DWORD) newFindFirstFileA
将覆盖FindFirstFileA
函数的序言,这将是灾难性的。有关挂钩API的详细说明,请参见this文章。