|
吾爱游客
发表于 2014-8-19 21:23
1、申 请 I D:qkhooks
2、个人邮箱:786889976@qq.com
3一款国内FPS射击游戏的调试分析,修改其内存实现子弹手雷无限功能,雷包每局掉自己身上.首先贴出游戏的界面
随便选个房间,进去。用CE搜索子弹的数值,有多少子弹就搜索多少数值
然后打几枪再继续搜索直到数值变成3个以内就可以了
最后在搜索到了008DD534这个地址是基址,基址用最开始CE搜出来的数值调试出来
008DD534 0141 04 add dword ptr ds:[ecx+0x4],eax
省略掉调试的过程
只要将这一处地址NOP掉,游戏的子弹就不会减少 包括手雷 . 可以再任何模式使用
为了体现更好的效果,以至于不会那么麻烦 谢了一个东西出来。
把核心代码贴上.
//提升进程访问权限
bool EnableDebugPriv()
{
HANDLE hToken;
LUID sedebugnameValue;
TOKEN_PRIVILEGES tkp;
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) {
return false;
}
if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))
{
CloseHandle(hToken);
return false;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = sedebugnameValue;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL))
{
CloseHandle(hToken);
return false;
}
return true;
}
void CplantsDlg::OnBnClickedCheckCd()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true);//更新窗口状态至变量
UCHAR buf[2];
HWND h=::FindWindow(NULL,L"")EliteForces v0.09.0000.2113
;
if (h==0)
{
::MessageBox(0,L"游戏未打开",0,MB_OK);
return;
}
//1005194
DWORD pid,bywrite;
GetWindowThreadProcessId(h,&pid);
//GetWindowThreadProcessId
//OpenProcss
EnableDebugPriv();//提升进程权限 VS2008以后的版本才需要
HANDLE hp=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
//
if (hp==NULL)
{
::MessageBox(0,L"打开进程出错",0,MB_OK);
return;
}
//读取数据
if (m_b_cd)
{ //禁用无限子弹
//008DD534 0141 04 add dword ptr ds:[ecx+0x4],eax
// 90 90 90
buf[0]=0x90;
buf[1]=0x90;
buf[2]=0x90;
}else
{ //启用无限子弹
//0487296 - 7e 14
buf[0]=0x01;
buf[1]=0x41;
buf[2]=0x04;
}
//把buf内数据写入 0x08DD534
WriteProcessMemory(hp,(LPVOID)0x0487296,buf,sizeof(buf),&bywrite);
}
其实根本不用这么逗,还不如用樱花LPK.dll补丁 放到游戏目录 每次玩的时候自动就开启了无限子弹功能
就跟平时破解软件一样。 填写好内存地址
008DD534 0141 04 add dword ptr ds:[ecx+0x4],eax 这一处NOP掉就OK了
就不用传附件了吧 麻烦啊.
贴上自己软件图
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|