经过一个多月苦战,终于过了TP保护,
可以CE内存,OD调试,自己写了一个小程序,想调用它的call,发现不行
接着不死心,简化一下代码,随便修改一下它的内存值,居然也修改不了,
以前一直都是win32程序开发,没有逆向的经验,听说看雪水深,
求教来了。。
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 ;
}
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);
}
::CloseHandle(prochandle);
}
////////////////////////
上面代码,第一次MessageBox为 7,第二次,MessageBox 还是为7,且没有任何提示
不知道是什么原因??
帮忙一下。
///////////////
刚才还发狠,想认真去读一下CE源代码,可是太晕,它是delphi开发,
本人80后啊,一直都是.net开发,虽然delphi代码都看得懂,但是学新工具,
熟悉语法,调试环境等,又要痛苦一阵,唉。
////////////
[课程]FART 脱壳王!加量不加价!FART作者讲授!