能力值:
( LV4,RANK:55 )
|
-
-
2 楼
哥,你顺序错了吧…先远程线程执行了再读内存阿,另外最好生成naked函数
|
能力值:
( 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
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
有人解答一下么?在线等
或者有类似代码可以参考或者其他实现办法
|
能力值:
( 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,,能达到我要的效果,也就是说,
刚才不行,是因为内存保护等问题,不知道哪位大牛有这方面资料可以参考??
|
能力值:
( LV4,RANK:55 )
|
-
-
6 楼
那就改变下目标进程的内存属性,virtualprotectex
|
能力值:
( 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 ;
}
////////////////////
执行后,提示 无法恢复内存读写性质,
查不出原因
|
能力值:
( LV4,RANK:55 )
|
-
-
8 楼
add是哪个地址?
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
DWORD add=0x27A606A4,是目标进程的一个地址
/////////
刚刚从你的个人资料里面看到QQ,我加了你好友,您通过一下
我以前一直都是win32程序开发,刚自学了一个月驱动开发,希望以后可以互相学习
|
能力值:
( LV4,RANK:55 )
|
-
-
10 楼
我是手机上网看贴回贴的苦逼屌丝。。。。你想改19b32214的地址你为什么改其它地方的内存属性呢
|
能力值:
( 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 ;
}
//////////
|
能力值:
( LV3,RANK:20 )
|
-
-
12 楼
tid=CreateRemoteThread(prochandle,NULL,0,(LPTHREAD_START_ROUTINE)baseaddr,0,0,&id2);//远程调用函数
WaitForSingleObject(tid,INFINITE);
把这2个函数跟在WriteProcessMemory后面,然后再调用第二次的ReadMemory
|
能力值:
( 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是可以附加的
|
|
|