首页
社区
课程
招聘
[旧帖] [求助]WriteProcessMemory,c++内联汇编 0.00雪花
发表于: 2012-4-21 19:01 1671

[旧帖] [求助]WriteProcessMemory,c++内联汇编 0.00雪花

2012-4-21 19:01
1671
遇到一个问题,WriteProcessMemory无法写入问题

主要代码如下

////////////
void myfunc(){

        _asm
        {
                               push ecx
                        push ebx
                        mov ecx,0x19B32214
                        mov ebx,5000
                        mov [ecx],ebx
                        pop ebx
                        pop ecx
        }
}

////////////////////////////////

void CGameDlg::OnBuyGoods()
{
        // TODO: Add your control notification handler code here
       
                 
                         DWORD procid;  
                         
                         HWND hwnd ;  
                         hwnd =::FindWindow(NULL ,"XXXX") ;  
                         
                         if (hwnd ==NULL)  
                                 
                         {  
                                 MessageBox("请先运行");
                                 
                                 return ;  
                                 
                         }  
                         
                         ::GetWindowThreadProcessId(hwnd,&procid);//获得进程ID   
                         
                HANDLE prochandle=::OpenProcess(PROCESS_ALL_ACCESS | PROCESS_CREATE_THREAD | PROCESS_VM_WRITE,false,procid);//打开进程  
                         if(prochandle==NULL)  
                                 
                         {  
                                 MessageBox("进程打开失败");
                                 return;  
                                 
                         }                           
                         LPVOID baseaddr=VirtualAllocEx(prochandle,NULL,1024*4,MEM_COMMIT,PAGE_EXECUTE_READWRITE);//分配空间
                         
                         if(baseaddr==NULL)  
                                 
                         {  
                                 MessageBox("分配空间出错");
                                 return;  
                                 
                         }  
                         DWORD byread;
                         DWORD  m_test;

                         
                         ::ReadProcessMemory(prochandle, (LPCVOID)0x19B32214, &m_test, 4, &byread);//
                         if(m_test==NULL)
                         {
                                MessageBox("读取内存出错");
                                return ;  
                         }else{
                                         CString aa;
                                        aa.Format("%d",m_test);
                                        MessageBox(aa);

                         }
               
                         if(!::WriteProcessMemory(prochandle,baseaddr,myfunc,1024*4,NULL))  
                                 
                         {  
                                 MessageBox("将函数写内存出错");
                                 return ;  
                                 
                         }
                 
                         ::ReadProcessMemory(prochandle, (LPCVOID)0x19B32214, &m_test, 4, &byread);//
                         if(m_test==NULL)
                         {
                                 MessageBox("读取内存出错");
                                 return ;  
                         }else{
                                 CString aa;
                                 aa.Format("%d",m_test);
                                 MessageBox(aa);
                                 
                         }

                         HANDLE tid;  
                         DWORD id2;
                         
                         tid=CreateRemoteThread(prochandle,NULL,0,(LPTHREAD_START_ROUTINE)baseaddr,0,0,&id2);//远程调用函数   
                         
                         WaitForSingleObject(tid,INFINITE);//等待线程结束   
                         
                         VirtualFreeEx(prochandle,baseaddr,1024*4,MEM_RELEASE);  
                         
                         ::CloseHandle(prochandle);  
}
////////////////////////

上面代码,第一次MessageBox为 7,第二次,MessageBox 还是为7,且没有任何提示

不知道是什么原因??

帮忙一下。

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
2
哥,你顺序错了吧…先远程线程执行了再读内存阿,另外最好生成naked函数
2012-4-21 19:42
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
/////////////////////

::ReadProcessMemory(prochandle, (LPCVOID)0x19B32214, &m_test, 4, &byread);//
       if(m_test==NULL)
       {
        MessageBox("读取内存出错");
        return ;  
       }else{
           CString aa;
          aa.Format("%d",m_test);
          MessageBox(aa);

       }
   
       if(!::WriteProcessMemory(prochandle,baseaddr,myfunc,1024*4,NULL))  
         
       {  
         MessageBox("将函数写内存出错");
         return ;  
         
       }

HANDLE tid;  
       DWORD id2;
      
       tid=CreateRemoteThread(prochandle,NULL,0,(LPTHREAD_START_ROUTINE)baseaddr,0,0,&id2);//远程调用函数   
      
       WaitForSingleObject(tid,INFINITE);//等待线程结束   
      
       VirtualFreeEx(prochandle,baseaddr,1024*4,MEM_RELEASE);  

    ::ReadProcessMemory(prochandle, (LPCVOID)0x19B32214, &m_test, 4, &byread);//
       if(m_test==NULL)
       {
         MessageBox("读取内存出错");
         return ;  
       }else{
         CString aa;
         aa.Format("%d",m_test);
         MessageBox(aa);
         
       }

///////////////////

感谢楼上回答,改成这样,效果是一样的,2次 MessageBox 都是7
2012-4-21 19:59
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
有人解答一下么?在线等

或者有类似代码可以参考或者其他实现办法
2012-4-21 21:29
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
刚自己做了一个小程序,用自己的代码读写内存,可以

//////

  hwnd =::FindWindow(NULL ,"Form2") ;  

::ReadProcessMemory(prochandle, (LPCVOID)0x012C9DC8, &m_test, 4, &byread);

.....

if(!::WriteProcessMemory(prochandle,baseaddr,myfunc,1024*4,NULL))  

.......

::ReadProcessMemory(prochandle, (LPCVOID)0x012C9DC8, &m_test, 4, &byread);//

//////////

读写自己的Form2,,能达到我要的效果,也就是说,

刚才不行,是因为内存保护等问题,不知道哪位大牛有这方面资料可以参考??
2012-4-21 21:52
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
6
那就改变下目标进程的内存属性,virtualprotectex
2012-4-22 10:11
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
/////////////////

                 //改变页面属性为读写
                         DWORD oldprot;   
  
                         BOOL ret =::VirtualProtectEx( prochandle,(LPVOID)add, 4, PAGE_READWRITE, &oldprot);
                         if(ret == FALSE)
                         {
                                 MessageBox("无法修改内存读写性质");
                                 return ;  
                         }

                         if(!::WriteProcessMemory(prochandle,baseaddr,myfunc,1024*4,NULL))  
                                 
                         {  
                                 MessageBox("将函数写内存出错");
                                 return ;  
                                 
                         }
                         //恢复原来的保护方式
                         ret=::VirtualProtectEx(prochandle, (LPVOID)add, 4, oldprot, NULL);
                         if(ret == FALSE)
                         {
                                 MessageBox("无法恢复内存读写性质");
                                 return ;  
                         }

////////////////////

执行后,提示 无法恢复内存读写性质,

查不出原因
2012-4-22 16:52
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
8
add是哪个地址?
2012-4-22 20:38
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
DWORD add=0x27A606A4,是目标进程的一个地址

/////////

刚刚从你的个人资料里面看到QQ,我加了你好友,您通过一下

我以前一直都是win32程序开发,刚自学了一个月驱动开发,希望以后可以互相学习
2012-4-22 20:42
0
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
10
我是手机上网看贴回贴的苦逼屌丝。。。。你想改19b32214的地址你为什么改其它地方的内存属性呢
2012-4-22 20:49
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
///////////

__declspec(naked) void myfunc(){

_asm
        {
                        push ecx
                        push ebx
                        mov ecx,0x27A606A4
                        mov ebx,5000
                        mov [ecx],ebx
                        pop ebx
                        pop ecx
        }
}

///////////
//////

DWORD add=0x27A606A4,是目标进程的一个地址

  DWORD oldprot;   
  
       BOOL ret =::VirtualProtectEx( prochandle,(LPVOID)add, 4, PAGE_READWRITE, &oldprot);
       if(ret == FALSE)
       {
         MessageBox("无法修改内存读写性质");
         return ;  
       }

       if(!::WriteProcessMemory(prochandle,baseaddr,myfunc,1024*4,NULL))  
         
       {  
         MessageBox("将函数写内存出错");
         return ;  
         
       }
       //恢复原来的保护方式
       ret=::VirtualProtectEx(prochandle, (LPVOID)add, 4, oldprot, NULL);
       if(ret == FALSE)
       {
         MessageBox("无法恢复内存读写性质");
         return ;  
       }

//////////
2012-4-22 20:56
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
12
tid=CreateRemoteThread(prochandle,NULL,0,(LPTHREAD_START_ROUTINE)baseaddr,0,0,&id2);//远程调用函数
WaitForSingleObject(tid,INFINITE);
把这2个函数跟在WriteProcessMemory后面,然后再调用第二次的ReadMemory
2012-4-23 03:14
0
雪    币: 12
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
///////////

__declspec(naked) void myfunc(){

_asm
  {
      push ecx
      push ebx
      mov ecx,0x27A606A4
      mov ebx,5000
      mov [ecx],ebx
      pop ebx
      pop ecx
  }
}

///////////
//////

DWORD add=0x27A606A4,是目标进程的一个地址

  DWORD oldprot;   
  
       BOOL ret =::VirtualProtectEx( prochandle,(LPVOID)add, 4, PAGE_READWRITE, &oldprot);
       if(ret == FALSE)
       {
         MessageBox("无法修改内存读写性质");
         return ;  
       }

       if(!::WriteProcessMemory(prochandle,baseaddr,myfunc,1024*4,NULL))  
         
       {  
         MessageBox("将函数写内存出错");
         return ;  
         
       }
                         HANDLE tid;  
                         DWORD id2;
                         
                         tid=CreateRemoteThread(prochandle,NULL,0,(LPTHREAD_START_ROUTINE)baseaddr,0,0,&id2);//远程调用函数   
                         
                         WaitForSingleObject(tid,INFINITE);//等待线程结束  

                         //恢复原来的保护方式
                         ret=::VirtualProtectEx(prochandle, (LPVOID)add, 4, oldprot, NULL);
                         if(ret == FALSE)
                         {
                                 MessageBox("无法恢复内存读写性质");
                                 return ;  
                         }

//////////

按楼上的提示,修改了一下,还是提示 "无法恢复内存读写性质",读出来的值,2次MessageBox值是一样的。

我觉得,是不是r0中,对CreateRemoteThread进行挂钩了?

但是,我od是可以附加的
2012-4-23 10:46
0
游客
登录 | 注册 方可回帖
返回
//