首页
社区
课程
招聘
[已解决]VC内嵌汇编时抛异常的问题
发表于: 2008-6-9 14:52 6050

[已解决]VC内嵌汇编时抛异常的问题

2008-6-9 14:52
6050
这个问题困扰我很久了,一直没有解决!!
我用C内嵌汇编时,比如下如下的代码:
_asm{
//没有学好汇编且随手写的代码,所以请不要考虑语法错误!
            pushad
            mov eax,0x458617
            mov eax,[eax]        //在这里就会抛出一个 Unhandled Exception:c0000005
            mov edx,00461978
            push eax
            call edx        //在这里也会抛出一个 Unhandled Exception:c0000005
            popad
}
造成这样异常的原因是什么哦,我百度了好久没有没有满意的答案!
望各位大大给点提示!

问题已解决!

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 424
活跃值: (2509)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
调试吧,在mov eax,[eax]下个断点,中断后去内存窗口看看0x458617这个地址里的内容就懂了,猜测:1、没有0x458617这个地址;2、0x458617地址不可读
2008-6-9 15:35
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
3
我要嵌入的汇编程序是别人用DELPHI已经写好的了,用DELPHI编译什么的都没有问题,我只是把它换成C的,所以,估计,这个0x458617的地址应该是存在并且可读的,否则那个DELPHI程序不应该运行什么的都没有问题哦 ~~
2008-6-9 18:11
0
雪    币: 6215
活跃值: (4832)
能力值: ( LV12,RANK:260 )
在线值:
发帖
回帖
粉丝
4
不同语言产生的EXE,其进程空间布局不可能一样的。前面那位的答案以及他的猜测都没有问题。这类问题,不调试,没意义。
2008-6-10 09:51
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
5
谢谢提醒!
问题解决了!
出问题的原因是:我没有给目标进程分配内存空间,使得程序读取的程序本身的空间,而程序本身的0x458617这个地址是不可读的,所以.....
让大家见笑了``~~
2008-6-13 16:00
0
雪    币: 65
活跃值: (811)
能力值: ( 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);
}

不好意思哦,这么久来过来补充,还好,今天想起来了~~
2008-9-3 09:23
0
游客
登录 | 注册 方可回帖
返回