能力值:
( LV15,RANK:440 )
|
-
-
2 楼
如果确实是GetProcAddress无法访问内存,则显然是GetModuleHandle的返回值不正常。结合你的代码,建议加上“.dll"试下效果。看看返回的模块基址是否正确。
还有一点,在win7系统中,不同的进程加载同一个模块,其基地址可能是不相同的。你不能做出一定是相同的假设。看你那程序有些危险性。
最后,用OD,WinDbg一类的调试器附加进程,可以得到你想要的模块以及对应函数的地址。
希望这些对您有些帮助。
|
能力值:
(RANK:10 )
|
-
-
3 楼
thanks hackerlzc.
刚刚才看到.这段代码是没问题的.
//在申请内存存放要加载的DLL文件路径
PWSTR pszDllName = (PWSTR)VirtualAllocEx(hProcess, NULL, sizeof(szDllName),
MEM_COMMIT, PAGE_READWRITE);
if (pszDllName == NULL)
{
AfxMessageBox(_T("VirtualAllocEx Error."));
CloseHandle(hProcess);
return;
}
//这里要把pszDllName空白的字节去掉
int cch = 1 + lstrlen(szDllName);
int cb = cch * sizeof(TCHAR);
WriteProcessMemory(hProcess, pszDllName, szDllName, cb, NULL);
PTHREAD_START_ROUTINE pfnThreadRtn = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(_T("Kernel32")), "LoadLibraryW");
if (pfnThreadRtn == NULL)
{
AfxMessageBox(_T("Get LoadLibrary Error."));
VirtualFreeEx(hProcess, pszDllName, 0, MEM_RELEASE);
CloseHandle(hProcess);
return;
}
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0,
pfnThreadRtn, pszDllName, 0, NULL);
if (hThread == NULL)
{
AfxMessageBox(_T("CreateRemoteThread Error."));
VirtualFreeEx(hProcess, pszDllName, 0, MEM_RELEASE);
CloseHandle(hProcess);
}
WaitForSingleObject(hThread, INFINITE);
AfxMessageBox(_T("Sucess"));
由于意识中在GetProcAddress设置了断点.其实是WriteProcessMemory 返回的错误. 
由于我是要远程线程中调用我的DLL,我的问题在WriteProcessMemory的
__in SIZE_T nSize 参数不是dll路径的大小,而是在远程线程中申请的内存地址的大小.
再次感谢热心的帮助.
|
|
|