【ACCESS精品源码栏目提醒】:网学会员ACCESS精品源码为您提供远程读写游戏内存VC带源码 - 软件工程参考,解决您在远程读写游戏内存VC带源码 - 软件工程学习中工作中的难题,参考学习。
远程读写游戏内存 VC 带
源码学习各种高级外挂制作技术,马上去百度搜索 魔鬼作坊,点击第一个站进入,快速成为做挂达人。
对于那些弹出游侠界面或暂停后就死掉的游戏,用类似的方法就可以修改了吧?!如果数值地址不是象 ra2 这样有多个,可在游戏中记下几个数值,然后写入一文件中,搜索时从文件中读取数值即可。
也可用键盘钩子记录按键,进行无界面动态输入。
-------------------------------------------------------------------------------------------------------------------------------------------------------取得游戏进程的句柄。
游戏中按下“”号键便来到这里有两种常用的方法:进程快照查找法和当前活动窗口法------------------------------------------------------------------------_GetProcessHandle proccomment 在调试时用这段代码取得游戏进程的句柄为好 LOCAL info:PROCESSENTRY32 LOCAL handle:HANDLE invoke CreateToolhelp32SnapshotTH32CS_SNAPPROCESS0 进程快照 mov handleeax mov info.dwSizesizeof PROCESSENTRY32 invoke Process32Firsthandleaddr info .repeat mov eaxF invoke lstrcmpiaddr info.szExeFileeax 比较是否为我们要找的进程名,不区分大小写 .if eax invoke CloseHandlehandle invoke MessageBoxNULLaddr info.szExeFileNULLMB_OK invoke OpenProcessPROCESS_ALL_ACCESSFALSEinfo.th32ProcessID jmp EXIT .endif invoke Process32Nexthandleaddr info .until eax invoke CloseHandlehandle xor eaxeaxEXIT: ret: db Game.exe0 通常情况下也可以用下面的方法取得游戏进程的句柄,但要注意…… LOCAL ProcessId invoke GetForegroundWindow 你必须确保当前窗口为游戏界面窗口这样才能正确取得游戏进程 ID lea edxProcessId invoke GetWindowThreadProcessIdeaxedx invoke OpenProcessPROCESS_ALL_ACCESSFALSEProcessId ret_GetProcessHandle endp------------------------------------------------------------------------第一遍搜索。
因是全程搜索,耗时几秒至十多秒(与玩家数多少有关)WinXP 中凭经验知道本游戏中钱数地址在 01000000h 至 0F600000 之间,搜此范围以减少用时------------------------------------------------------------------------_GetDataAddr proc uses esi edi hProcess:DWORDnum:DWORDhmem:DWORD LOCAL NListMemSizepListMemReadSize LOCAL mbi:MEMORY_BASIC_INFORMATION invoke EmptyWorkingSethProcess 减少游戏进程提交内存数,希望能减少搜索量,加快搜索速度 invoke SetProcessWorkingSetSizehProcess-1-1 不知是否有效愿听高手指导 invoke GlobalLockhmem 锁定保存搜索结果的内存 mov pListMemeax invoke GlobalSizehmem保存搜索结果的内存大小 mov ListMemSizeeax invoke ReadProcessMemoryhProcessADD_DATA1addr Nsizeof NNULL 不用手输入金钱数,从内存读取金钱数 mov ediN 保存金钱数,以便后面比较搜索,原理见前文 invoke GlobalAllocGMEM_FIXEDMEMSIZE 分配内存,为读取数据做准备 mov esieax 保存内存地址 mov ecxADD_DATA3_START 设置要搜索的内存地址范围开始处 .repeat 循环搜索游戏内存: invoke VirtualQueryExhProcessecxaddr mbisizeofMEMORY_BASIC_INFORMATION 返回页面虚拟信息 .if mbi.State MEM_COMMIT mbi.Protect PAGE_READWRITE 已提交且为可读写的区域,加速搜索 mov ReadSizeMEMSIZE 每次可读取的数据大小 .repeat 循环读取该内存区段中的数据 .if mbi.RegionSizeListMemSize 如果搜索到的结果较多,内存用完,要重新分配内存 push eax push ecx add eax1000h 追加4K内存 invoke GlobalReAllochmemeaxGMEM_MOVEABLE 重新分配内存原来的数据被复制过来 invoke GlobalLockeax mov pListMemeax 保存搜索结果的内存首地址 invoke GlobalSizehmem mov ListMemSizeeax 保存搜索结果的内存大小 pop ecx pop eax .endif add eaxpListMem 相当于 pListMemnum mov edxmbi.BaseAddress add edxecx 首地址+偏移地址=实际地址 mov eax-4hedx 搜索的结果保存起来pListMemnum-1=实际地址 .endif add ecx4h 金钱数为 DWORD 型数值,考虑到内存对齐,这里是不用担心漏掉的 .until ecxN 读取的数据块比较完了吗 mov eaxReadSize 准备再读一次 add mbi.BaseAddresseax 下次从这里开始读 sub mbi.RegionSizeeax 下次要读的大小 .until mbi.RegionSizeADD_DATA3_END 下一区段在搜索范围之外了吗是则完成第一遍搜索 invoke GlobalFreeesi ret_GetDataAddr endp------------------------------------------------------------------------第二、三……遍的搜索,在第一次的结果中找,速度极快第二次按下“”键便来到这里,一般只要两遍就可锁定。
算法:有用地址向前移结果个数由 num 返回,如果 num1 就算找到正确的金钱地址了------------------------------------------------------------------------_FindAddrInList proc uses edi esi hProcess:DWORDnum:DWORDhmem:DWORD LOCAL DataN LOCAL DD1DD2 invoke ReadProcessMemoryhProcessADD_DATA1addr DD1sizeof DD1NULL 读 取 金钱数 invoke GlobalLockhmem mov edieax 前次搜索结果保存的内存首地址 xor esiesi 指针,指向第一个结果 mov Nesi 本次搜索到的个数初始化为 0 .repeat 逐个比较 mov edxediesi4h 相当于 edxhmemesi invoke ReadProcessMemoryhProcessedxaddr DD2sizeof DD2NULL 读取数值 mov eaxDD1 .if eaxDD2 等于金钱数吗等则记录下来 push ediesi4h mov eaxN pop edieax4h 相当于 hmemNhmemesi即把搜索到的结果向 hmem 内存前面移 inc N 搜索到的个数加一 .endif mov eaxnum inc esi 指针指向下一个结果 .until esieax 每个都比较过了吗是则完成这次搜索 mov edxN 这次搜索到的结果个数 mov eaxedx 修改原来的个数 shl edx2h 个数×4=内存大小 invoke GlobalReAllochmemedxGMEM_MOVEABLE 释放多余的内存 ret_FindAddrInList endp------------------------------------------------------------------------找到了正确的地址,可以锁定金钱数值了:,每五秒锁定一次,按“-”键停锁游戏中钱数看起来有增有减,象未锁定一样,别人不容易发现你作弊------------------------------------------------------------------------_WriteProcessData proc uses edi esi hProcess:DWORDhmem:DWORD LOCAL DATAIsRun mov esi2000 要锁定的金钱数,别太多,多了是会招贼来偷的: mov DATAesi invoke GlobalLockhmem mov edieax 游戏中真正的保存金钱数的地址 .repeat .if esi5h 每五循环锁定一次 xor esiesi 循环次数清 0 invoke WriteProcessMemoryhProcessediaddr DATAsizeof DATANULL 写 入钱数 .endif invoke Sleep1000 定时一秒 inc esi 循环次数加一 invoke GetExitCodeProcesshProcessaddr IsRun 游戏程序还在运行吗 invoke GetAsyncKeyStateVK_SUBTRACT 按了“-”键吗 .until eax IsRunSTILL_ACTIVE 如果游戏退出或按了“-”键则结束循环 ret