VC远程调用CAll,高手在那里?小弟求帮解决思路
VC远程调用CAll,高手在那里?小弟求帮
主要代码如下
那个进程id我调试了没问题呀,就是注入有问题,我用od跟了一下注入的地址,全是 jmp什么的,程序运行出错
再网上下了个注入器,注入了一下,又用od跟了一下,发现确实注入了,
现在就是为什么这段代码注入不了呢?那位大哥帮给指点一下
那个 “游戏找CALL练习实例one.exe”是我在网上下的找call的
发过的帖子没人回我就再发一次,嘿嘿
------解决方案--------------------
//创建远程线程
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr, 0,0,&NumberOfByte);
创建的远程线程有问题的,你要把你函数的代码写到注入进程的地址空间去
WriteProcessMemory(hProcess,mFuncAddr,mfun,128, &NumberOfByte); // 有问题
------解决方案--------------------
仅仅是函数的地址?那不行的、、、你那函数在进程地址空间没有
下面是我创建远程线程,加载我的dll的代码,参考一下:
主要代码如下
DWORD GetProcessIDByName(char *name)
{
PROCESSENTRY32 entry;
entry.dwSize=sizeof(entry);
HANDLE handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
bool tap=Process32First(handle,&entry);
while(tap)
{
if(strcmp(entry.szExeFile,name)==0)
return entry.th32ProcessID;
tap=Process32Next(handle,&entry);
}
return -1;
}
void M_InfusionFunc(DWORD pid,LPVOID mfun)
{
HANDLE hProcess;//远程句柄
LPVOID mFuncAddr;//申请函数内存地址
HANDLE hThread; //线程句柄
DWORD NumberOfByte; //辅助返回值
CString str;
//打开被注入的进程句柄
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid);
//申请内存
mFuncAddr = VirtualAllocEx(hProcess,NULL,128,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
//写内存
WriteProcessMemory(hProcess,mFuncAddr,mfun,128, &NumberOfByte);
//创建远程线程
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr, 0,0,&NumberOfByte);
WaitForSingleObject(hThread, INFINITE); //等待线程结束
//释放申请有内存
VirtualFreeEx(hProcess,mFuncAddr,128,MEM_RELEASE);
//释放远程句柄
CloseHandle(hThread);
CloseHandle(hProcess);
}
void AddHP()
{
__asm mov ebx,0x00994818
__asm mov edx,ebx
__asm mov eax,[ebx+0x124]
__asm call [ebx+0x120]
}
void CCodeDlg::OnButton1()
{
// TODO: Add your control notification handler code here
DWORD id=GetProcessIDByName("游戏找CALL练习实例one.exe");
M_InfusionFunc(id,AddHP);
}
那个进程id我调试了没问题呀,就是注入有问题,我用od跟了一下注入的地址,全是 jmp什么的,程序运行出错
再网上下了个注入器,注入了一下,又用od跟了一下,发现确实注入了,
现在就是为什么这段代码注入不了呢?那位大哥帮给指点一下
那个 “游戏找CALL练习实例one.exe”是我在网上下的找call的
发过的帖子没人回我就再发一次,嘿嘿
------解决方案--------------------
//创建远程线程
hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)mFuncAddr, 0,0,&NumberOfByte);
创建的远程线程有问题的,你要把你函数的代码写到注入进程的地址空间去
WriteProcessMemory(hProcess,mFuncAddr,mfun,128, &NumberOfByte); // 有问题
------解决方案--------------------
仅仅是函数的地址?那不行的、、、你那函数在进程地址空间没有
下面是我创建远程线程,加载我的dll的代码,参考一下:
void CRemote_InjectDlg::OnInject()
{
UpdateData(TRUE);
HANDLE m_hRemote=::OpenProcess(PROCESS_QUERY_INFORMATION
------解决方案--------------------
// Required by Alpha
PROCESS_CREATE_THREAD
------解决方案--------------------
// For CreateRemoteThread
PROCESS_VM_OPERATION
------解决方案--------------------
// For VirtualAllocEx/VirtualFreeEx
PROCESS_VM_WRITE,
NULL,m_PID);
if (NULL==m_hRemote)
{
AfxMessageBox("OpenProcess Error !");
}
DWORD RemoteThread_PID=0;
PWSTR MyParameter = NULL; //base address of the allocated region of pages.
char *pszLibFile="ago.dll";
int cb = (1+strlen(pszLibFile))* sizeof(char);
MyParameter=(PWSTR) VirtualAllocEx(m_hRemote,0,cb,MEM_COMMIT, PAGE_READWRITE);
if(MyParameter==NULL)
{
AfxMessageBox("VirtualAllocEx Error !");
}
if(! WriteProcessMemory(m_hRemote,MyParameter,(LPVOID)pszLibFile,cb,NULL) )