看流星社区

 找回密码
 注册账号
查看: 3048|回复: 6

内存写入机器码(还是不行啊)

[复制链接]

该用户从未签到

发表于 2011-3-23 07:30:06 | 显示全部楼层 |阅读模式
我注入dll内的代码如下:
   unsigned long address=0x004016AD,proc;
    proc=*(DWORD*)myFun;
     
    _asm
    {
     
        PUSHAD
                          mov eax,address
        mov edx,proc
        mov BYTE PTR[eax],0xe9
        sub edx,eax
        sub edx,5
                 mov DWORD PTR[eax+1],edx

       POPAD
    }
注入完成后用od查看4016AD处,还是原先的机器码,根本没有变,我又将代码改写如下:
            unsigned long address=0x004016AD,proc;
     
   
    _asm
    {
     
        PUSHAD
                          mov eax,address
        mov BYTE PTR[eax],0xe9

       POPAD
    }
用od查看,还是以前的机器码,连这个e9都没有写进去,这是怎么回事啊,高手帮我!谢谢

该用户从未签到

发表于 2011-3-23 07:30:15 | 显示全部楼层
这里的代码让他运行了吗?都没执行改机器码的代码,当然是改不了的啦

该用户从未签到

 楼主| 发表于 2011-3-23 07:30:40 | 显示全部楼层
dll里面就这个函数,放置在DLL_PROCESS_ATTACH下面,我把他改成
_asm
    {
     
        PUSHAD
                          mov eax,address
        mov BYTE PTR[eax],0xe9

      POPAD
    }
这种形式,没有问题啊,dll是加载不进去,取消这些汇编就没问题,问题到底出来哪里了???版主帮忙啊!

该用户从未签到

 楼主| 发表于 2011-3-23 07:30:48 | 显示全部楼层
我把上面的改成这种形式,就能弹出对话框。
_asm
    {
     
        PUSHAD
                          mov eax,address
      POPAD
    }
  AfxMessageBox(“hello”);
要是加上那条:mov BYTE PTR[eax],0xe9   
dll就加载不进去。

该用户从未签到

发表于 2011-3-23 07:31:04 | 显示全部楼层
invoke    VirtualQuery,[EnGetKey],addr m_mi,28
         
        invoke    VirtualProtect,[m_mi.BaseAddress],[m_mi.RegionSize],PAGE_READWRITE,addr m_mi.Protect     
         
        mov        eax,DWORD [EnGetKey]
         
        mov        ecx,5
         
        mov        edi,GBuf
         
        add        eax,$69
         
        mov        esi,eax
         
        rep        movsb
         
        mov        byte [eax],$0e9
         
        mov        edx,done
         
        sub        edx,eax
         
        sub        edx,5
         
        mov        dword [eax + 1],edx     
         
        invoke    VirtualProtect,[m_mi.BaseAddress],[m_mi.RegionSize],[m_mi.Protect],    addr Buf

呵呵,老弟太急了。你是首先要用VirtualProtect设置被修改的代码页可写才成啊。不然你当然写不进去了!。

该用户从未签到

发表于 2011-3-23 07:31:30 | 显示全部楼层
你要保证::VirtualProtect((LPVOID)(DWORD *)address,5,PAGE_READWRITE,&oldProtect);
确实成功了。

引用MSDN:
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

该用户从未签到

发表于 2011-3-23 07:31:38 | 显示全部楼层
我的做法是:
首先申明了一个
m_mi            MEMORY_BASIC_INFORMATION  局部变量;
然后用其来查询要修改代码位置所在的内存页保护属性:
invoke    VirtualQuery,[EnGetKey],addr m_mi,28  
修改其属性为可读写:
invoke    VirtualProtect,[m_mi.BaseAddress],[m_mi.RegionSize],PAGE_READWRITE,addr m_mi.Protect   
改过代码后,复原:
invoke    VirtualProtect,[m_mi.BaseAddress],[m_mi.RegionSize],[m_mi.Protect],    addr Buf
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-26 06:37

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表