Author:linshao

V公众号:https://github.com/linshaoSec/

目录

一.目的

二. 相关要求

三.具体方法

0x01.准备工作:

0x02.查找偏移

0x03.实现思路:

0x04.代码:


一、目的:

通过开发简单游戏辅助来加深对windows api操作,以及程序内存的理解

二、相关要求:

》》1.golang编程基础/C++基础

》》2.简单理解PE在内存中的知识,基址(BaseAddress),偏移(RVA)

》》3.windows Api

》》4.一颗好用的脑子

三、具体方法

0x01.准备工作:

工具:

》》go

》》Cheat Engine 7.4(CE神器)

》》idea++(写程序用)

游戏:单机游戏:Dissonance(steam上下载)


0x02.查找偏移

进入游戏

ce打开进程

进行扫描,我是知道值是4字节所以为了快速记录直接搜索了

查找游戏基质

多捡几个塑料瓶子,方便没血了喝。(诺,就这个玩意):

去找这个漩涡,手电照一下它就有伤害性了,别问我为什么不去找怪,那玩意把握不住死了就白忙活了

像这样

对着血条搜索,不行了就嗑药,

先首次扫描,再掉血,去搜索

最终找到少量数据,右键添加到地址栏

选中几个右键锁定,再次尝试发现不掉血了就对了,那血量的地址就在这几个之中,

分别锁定几个地址后找到唯一能有效锁定血量的值

对唯一地址进行指针扫描,找到偏移路径

扫描结果。这些都是基址经过偏移量到达血量的路径

这个地址可能会有重启游戏就不能用的,所以需要筛选,操作如下:

重启游戏后再次找到血量地址,使用这个指针文件去扫描,然后筛选血量值

如果有一样的,那说明这个链路可以使用。

重启游戏,ce打开该进程,点击查看内存->工具->指针扫描

打开之前保存的文件进行扫描

扫描后可以看到最后一列有些是空值,那就是失效的指针

像红框的那种有数值且很多是一样的,那就是血量的地址的值,选择一条单击后添加到地址栏

可以修改为其他值看血量有无变化,有变化说明对了

然后双击值复制它,便于后面过滤无效指针

点击工具栏的Point Scanner->Rescan memory->value=1来过滤所有值为272549262的指针,这6604条指针偏移路径都是可以使用

回到主界面,记录一下偏移(RVA相对虚拟地址),

获取到有效的地址偏移后就可以开始写程序了

C++会更简单,但是我有写过go的枚举pe模块基址的程序,代码拿来就用 ,多好哈哈哈

0x03.实现思路:

1.先通过执行wmic命令获取游戏的pid(ProcessId)

2.调用windows的OpenProcess函数打开目标进程,获取返回到的句柄

3.调用EnumProcessModules函数枚举目标进程的模块,查找ResonanceEAE-Win64-Shipping.exe并返回它的地址

4.获取到基址后,使用它加上之前得到的偏移路径,一步一步相加获取到最终角色的血量的真实地址

5.调用ReadProcessMemory函数读取该地址就可以获取到角色血量

6.调用WriteProcessMemory函数修改该地址

7.在程序实现中可以:开子线程来循环读取血量的值有无改变。有变化就修改回来,就达到了锁血的功能

主要windows Api

码子在文末,注意编译最好不要命令行go build main.go,尽量使用ide工具编译,

不然就会这样:

看一下效果,其他功能什么飞天遁地呀可以自己花时间去找偏移(我找的时候从第3关,穿越到了第6关哈哈哈)

0x04.代码:

package mainimport ("fmt""os/exec""regexp""strconv""strings""syscall""time""unsafe"
)type obj struct {address int
}var (flag1 intflag2=0kernel32=syscall.MustLoadDLL("kernel32.dll")OpenProcess=kernel32.MustFindProc("OpenProcess")ReadProcessMemory=kernel32.MustFindProc("ReadProcessMemory")WriteProcessMemory=kernel32.MustFindProc("WriteProcessMemory") //写入内存Psapi=syscall.MustLoadDLL("Psapi.dll")EnumProcessModules =Psapi.MustFindProc("EnumProcessModules")GetModuleBaseNameA=Psapi.MustFindProc("GetModuleBaseNameA")
)func main(){var pid int64var modelName stringmodelName="ResonanceEAE-Win64-Shipping.exe"pid=getProcPid(modelName)fmt.Println(pid)//打开进程句柄handle:=getModelHandle(pid)//fmt.Println("句柄",handle)if handle<=0{fmt.Printf(" 打开句柄失败",handle)return}//获取模块基址BaseAddress:=GetProcessMoudleBase(handle,modelName)//fmt.Printf("[+] 基址%X\n",BaseAddress)fmt.Printf("\n************************************************\n")fmt.Printf("\n\t\t==linshao--功能面板==\t\t")RVA2:=[...]int64{0x04D98A40,0x118,0xA0,0x2B0,0x20,0x1A0,0x90,0xB8}//RVA2:=[...]int64{0x04CF3798,0x68,0x110,0xE0,0x260,0x1A0,0x90,0xB8}//其他偏移路径// 04CF3798 120 110 F8 20 1A0 90 B8// 04DB5400 400 8 78 A0 1A0 90 B8xueAddr,xueValue:=readXue(handle,BaseAddress,RVA2)fmt.Printf("[!]当前游戏角色血量--->%d(%f%%)\n",xueValue,(float32(xueValue)/1120403456)*100)for true{fmt.Printf("1开启/0关闭锁血/2退出->")var gn intfmt.Scanln(&gn)if gn==1{flag2=1go suoxie(handle,xueAddr,xueValue)if flag1==1{fmt.Printf("----------》锁满血成功\n")}}if gn==0 {flag2=0}if gn==2{return}fmt.Printf("----------------------\n")fmt.Printf("当前信息:\n")if flag2==0{fmt.Printf("锁血[关闭]\n")}if flag2==1{fmt.Printf("锁血[开启]\n")}fmt.Printf("----------------------\n")}}func suoxie(handle uintptr,xueAddr int64,xueValue int){defer func() {err:=recover()if err!=nil{fmt.Println("成功捕获一个异常")}}()for flag2!=0{value:=0ReadProcessMemory.Call(handle, uintptr(xueAddr),uintptr(unsafe.Pointer(&value)),unsafe.Sizeof(value),0)if value!=1272549262{xueValue=1272549262a,_,_:=WriteProcessMemory.Call(handle,uintptr(xueAddr),uintptr(unsafe.Pointer(&xueValue)),unsafe.Sizeof(xueValue))if a>0{flag1=1}}time.Sleep(100*time.Millisecond)}}
func readXue(handle uintptr,BaseAddress int64,RVA2 [8]int64) (int64,int){fmt.Printf("\n************************************************\n")var CurrentAddress int64//fmt.Println("模块名",modelName)fmt.Printf("[*] 使用的RVA偏移量链 -》%X\n",RVA2)CurrentAddress=BaseAddressvar value intvar tmp64 int64for _,x:=range RVA2{value=0tmp64=CurrentAddress+xReadProcessMemory.Call(handle, uintptr(tmp64),uintptr(unsafe.Pointer(&value)),unsafe.Sizeof(value),0)fmt.Printf("访问0x%X >> (RVA) %X -> (0x%X) %X\n",CurrentAddress,x,tmp64,value)CurrentAddress=int64(value) //把偏移后获取到的实际地址值放入下一次循环计算的基地址}return tmp64,value
}
func GetProcessMoudleBase( hProcess uintptr, moduleName string)int64{//异常处理defer func() {//捕获异常err := recover()if err != nil {fmt.Println("[!]发生异常")}}()// 遍历进程模块,var hModel =[10000]int64{0}var lpcbNeeded int=0 //将所有模块句柄存储在 lphModule 数组中所需的字节数var cb= int(unsafe.Sizeof(hModel))  //lphModule 数组的大小,以字节为单位。isok,_,_:=EnumProcessModules .Call(hProcess, uintptr(unsafe.Pointer(&hModel)), uintptr(cb), uintptr(unsafe.Pointer(&lpcbNeeded)))num:=lpcbNeeded/int(unsafe.Sizeof(hModel[0]))//fmt.Println("----------lpcbNeeded所需字节",lpcbNeeded,"当前",cb,"需要长度",num)if isok<=0 {fmt.Println("[!] 枚举模块失败")}fmt.Printf("[+] 枚举进程模块成功,共%d个\n",num)//,hModel)tmp:=[50]byte{}a:=""for i:=0;i<num;i++{GetModuleBaseNameA.Call(hProcess, uintptr(hModel[i]),uintptr(unsafe.Pointer(&tmp)),50)for _,v:=range tmp{if(v==0){continue}else {a+=string(v)}}if(strings.EqualFold(moduleName, a)) {fmt.Printf("[+] find! 模块名字%s  地址:0x%X\n", a, hModel[i])return int64(hModel[i])}fmt.Printf(" > %s  \t--->: 0x%X",a, hModel[i])fmt.Printf(" \n ")a=""tmp=[50]byte{}}return 0
}func getProcPid(PROCESS string)int64{task:=exec.Command("cmd","/c","wmic", "process", "get", "name,","ProcessId","|","findstr",PROCESS)data2, _ := task.CombinedOutput()res:=strings.Split(string(data2),"\n")[0]//取第一行程序结果re := regexp.MustCompile("[0-9]+")pid,_:=strconv.ParseInt(re.FindAllString(res,-1)[1],10,64)return pid
}func getModelHandle(_pid int64)uintptr{hand,_, err :=OpenProcess.Call(2097151, uintptr(0), uintptr(_pid))fmt.Println("[+] 打开目标进程成功",hand)checkErr(err)return hand
}
func checkErr(err error){if err!=nil {if err.Error() != "The operation completed successfully." {fmt.Println("报错:",err.Error())syscall.Exit(1)return}}
}

不来一下子??

 Vhttps://github.com/linshaoSec/

【辅助开发】游戏辅助开发全流程-golang相关推荐

  1. 开发提交审核流程_小游戏上线发布全流程详解?

    5G时代小游戏群雄并起 5G时代到来,各大超级App都推出了小游戏模式来把流量变现,如微信小游戏,QQ小游戏,抖音小游等. 之前个人开发者在国内上线游戏需要版号,到国外上线又不熟悉.现在微信/QQ/抖 ...

  2. 从UI设计到开发,Lottie使用全流程

    从UI设计到开发,Lottie使用全流程 使用lottie Lottie 是一个 iOS.Android 和 React Native 库,可以实时渲染 After Effects 动画,让应用程序可 ...

  3. MATLAB Appdesigner开发独立桌面App全流程(二):以实时时间显示为例介绍Timer和StartupFcn的使用以及try catch抛出错误

    1.以实时显示时间为例简单介绍Timer的使用 根据目前所了解到的资料,MATLAB调用多线程较为麻烦,并且类似parfor等语法只适用于大规模运算,而不适合两个独立的.需要并行的任务.这时,我们就需 ...

  4. 藤摇椅游戏道具制作全流程讲解视频教程

    藤摇杆|一个完整的游戏资产工作流程 MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 含工程素材 语言:英语+中文字幕(根据原英文字幕机译更准确)+原英文字幕 | ...

  5. 一文梳理2048小游戏从开发到上云全流程

    摘要:本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实践的全流程 前言 本文主要以Cocos2d Web项目2048小游戏的开发上云为例,介绍DevOps开发实 ...

  6. 如何快速制作脚本之学习怎么开发游戏辅助中自动加血的脚本——以按键精灵脚本制作的颜色坐标选取为例

    简介: 按键精灵2014--简单游戏脚本免费制作开发工具,按键精灵论坛配有易学易懂的简单脚本开发教程,学习游戏脚本开发必备软件,教你怎么开发脚本,如何快速制作脚本.还有丰富的免费游戏脚本下载~ 工具/ ...

  7. 关于视频直播系统源码所开发的直播平台全流程分析

    直播全流程探索 近年来,直播兴起,QQ音乐也接入了直播能力,支持演唱会的直播和主播.明星直播,根据互动方式的不同,我们可以分为互动直播和推流直播,本人有幸参与了直播从无到有的过程:对直播这一块有了一个 ...

  8. 云开发在教育应用开发、运维全流程实践

    编者按:10月21日,2021云栖大会云效BizDevOps分论坛上,教育行业- E联智校的研发总监.高级架构师- 冯涛老师围绕在云的时代,如何完成云阅卷从传统技术框架到云开发生态的变迁进行了分享. ...

  9. 次世代游戏建模制作全流程

    首先,如果你想学习游戏建模,那么我建议你从3Dmax开始学起**,**熟悉软件后做做简单的道具,大概一到两个,武器什么的都是可以的. 然后开始场景,这个考虑的就比较多了,所以放在后面.大概自己练习两三 ...

  10. 【云服务器搭建游戏私服】全流程

    [游戏私服]云服务器搭建游戏私服全流程 文章目录 [游戏私服]云服务器搭建游戏私服全流程 一.准备一台云服务器和游戏服务器端 二.远程登录云服务器安装宝塔 三.安装游戏环境 四.配置游戏服务器端 五. ...

最新文章

  1. 内存泄漏分析 mat 使用 activity泄漏
  2. prerenderspaplugin 打包完成后如何让百度收录_如何提高网站流量、排名?
  3. Python matplotlib 和PIL
  4. linux内核_查看Linux内核版本
  5. Python 学习笔记(2) - 基本概念、运算符与表达式
  6. php实现中间件6,说一说ThinkPHP6中五花八门的中间件_PHP开发框架教程
  7. 拼多多分享好友砍价Java实现_拼多多砍价怎么分享到朋友圈 砍价发到微信朋友圈方法...
  8. 改不改,这是一个问题
  9. Odoo快速部署 附Odoo的Docker启动脚本
  10. andorid studio 无法识别app项目解决
  11. 解决 Please use the NLTK Downloader to obtain the resource
  12. 愿天下有情人都是失散多年的兄妹 (25分)
  13. html中css如何设置显示国旗,CSS3 各国国旗
  14. centos8上实现私有CA和证书申请颁发
  15. linux系统中同时开启wifi与热点的办法
  16. 史兴国对谈顾振清:NFT艺术有哪些可以抵御加密寒冬的“武器”?
  17. 分布式定时任务中间件
  18. 代码Service方法都报 Parameter 0 of constructor in com.fan.xx required a single bean, but 2 were found原因分析
  19. 想拿到三万月薪在北上深杭做Java开发如何,需要什么程度技术?
  20. LifeKeeper 5 for Linux 安装

热门文章

  1. Cocoa 获取一个独特的电脑硬件ID (A unique hardware id)
  2. 助老服务机器人结构设计
  3. 编译 mobileTerminal
  4. 最优化算法之鲍威尔算法(java)
  5. 配置HP LaserJet M1536dnf MFP打印机通过TCPIP共享多台计算机
  6. Qt视频直播软件--项目实战(Day5)
  7. 妇产科学习题---有答案
  8. 计算机发送到桌面快捷方式,win10电脑没有发送到桌面快捷方式选项的详细恢复步骤...
  9. VB6.0超级模块-内存操作篇-含特征码搜索和HOOK跳转构造
  10. 基于IOS的仿微博系统