能力值:
( LV3,RANK:30 )
|
-
-
2 楼
调试吧,在mov eax,[eax]下个断点,中断后去内存窗口看看0x458617这个地址里的内容就懂了,猜测:1、没有0x458617这个地址;2、0x458617地址不可读
|
能力值:
( LV12,RANK:210 )
|
-
-
3 楼
我要嵌入的汇编程序是别人用DELPHI已经写好的了,用DELPHI编译什么的都没有问题,我只是把它换成C的,所以,估计,这个0x458617的地址应该是存在并且可读的,否则那个DELPHI程序不应该运行什么的都没有问题哦 ~~
|
能力值:
( LV12,RANK:260 )
|
-
-
4 楼
不同语言产生的EXE,其进程空间布局不可能一样的。前面那位的答案以及他的猜测都没有问题。这类问题,不调试,没意义。
|
能力值:
( LV12,RANK:210 )
|
-
-
5 楼
谢谢提醒!
问题解决了!
出问题的原因是:我没有给目标进程分配内存空间,使得程序读取的程序本身的空间,而程序本身的0x458617这个地址是不可读的,所以.....
让大家见笑了``~~
|
能力值:
( LV12,RANK:210 )
|
-
-
6 楼
问题解决了!
我把正确的写法帖出来!
void CCallTestPlgDlg::InjectToProcess(DWORD (*FunName)())
{
HANDLE TmpHandle;
DWORD dwThreadId;
DWORD dwProcessId;
CString sClassName= "";
m_hPwnd = ::FindWindow("TForm1","游戏找CALL练习实例one");//得到窗口句柄
if(m_hPwnd == NULL)
{
MessageBox("没有找到主程序,请先运行主程序");
}
int hFunc=GetClassName(m_hPwnd,sClassName.GetBuffer(0),2000);
if(hFunc != 0 && 0 <= sClassName.Find("TForm1"))
{
if( dwThreadId = ::GetWindowThreadProcessId(m_hPwnd, &dwProcessId))
{
m_hProcess = ::OpenProcess(PROCESS_ALL_ACCESS,
FALSE, dwProcessId);
if(m_hProcess != NULL)
{
//在目标进程建立内存空间
LPVOID ThreadAdd = ::VirtualAllocEx(m_hProcess, NULL,0x1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
::WriteProcessMemory(m_hProcess,ThreadAdd ,FunName,0x1024,NULL);
TmpHandle = CreateRemoteThread(m_hProcess,
NULL, 0, (LPTHREAD_START_ROUTINE)ThreadAdd, NULL,
CREATE_SUSPENDED, NULL);//获得注入后过程的句柄ID
if(WaitForSingleObject(TmpHandle,INFINITE) != WAIT_OBJECT_0)//就在这里死了!程序失去响应!
{
CString StrTmp;
StrTmp.Format("%d",GetLastError());
MessageBox(StrTmp);
}
CloseHandle(TmpHandle);
CloseHandle(m_hProcess);
VirtualFreeEx(m_hProcess,ThreadAdd,0x1024,MEM_RELEASE);
}
}
}
}
DWORD tmpHP()
{
_asm{
pushad
mov eax,4549992
mov eax,[eax]
mov edx,4534336
mov ebx,4533912
call ebx
popad
ret
}
return 0;
}
void CCallTestPlgDlg::OnHp()
{
InjectToProcess(tmpHP);
}
不好意思哦,这么久来过来补充,还好,今天想起来了~~
|
|
|