表示将楼上的源码大幅修改了下,减少资源占用,还加入 技能遍历、数组的周围环境遍历(有的内容二叉树遍历不到,也有数组遍历不到,二叉树才能遍历到的内容),贴上来方便后人(话说这么远没人看到吧。- -)
- var 天使=com("Ts.TsSoft")
- var 大漠=com("dm.dmsoft")
- var 全局窗口句柄
- var 基址1=#A1B688
- var 周围对象基址_十六进制=#A1B688
- var 二叉树遍历周围环境根总集=数组()//用来存放各层不断加入的多线程遍历时获得的根
- var 二叉树遍历周围环境根临时存放集=数组()//用来存放多线程遍历时某层可用子树作为根的集
- var 进程句柄
- 功能 天龙二叉树遍历_初始化()
- var PID=进程信息("Game.exe",0)
- 全局窗口句柄=获取窗口句柄(PID[0],1)
- 结束
- 功能 技能遍历按钮_点击()
- 列表框选项清空("技能遍历")
- var 线程ID=线程开启("遍历技能","")
- end
- 功能 二叉树遍历周围环境按钮_点击()
- 数组清空(二叉树遍历周围环境根总集)
- 列表框选项清空("二叉树遍历周围环境")
- var 线程ID=线程开启("二叉树遍历周围环境","")
- 结束
- 功能 数组遍历周围环境按钮_点击()
- 列表框选项清空("数组遍历周围环境")
- var 线程ID=线程开启("数组遍历周围环境","")
- 结束
- 功能 数组遍历周围环境()
- var u,遍历次数,对象ID,对象名称,对象类型,递增数,偏移,对象名称地址,对象ID地址,对象类型地址
- 遍历次数=50
- 遍历(u=0;u<遍历次数;u++)
- 递增数=u*64 //十进制
- 偏移=21500+u*64 //21500为53FC十进制
- 偏移=字符串格式化("%x",偏移)
- 对象名称地址=字符串拼接("[A1B478]+",偏移)
- 对象名称=大漠.ReadString(全局窗口句柄,对象名称地址,0,16)
-
- 偏移=21524+u*64 //21524为5314十进制
- 偏移=字符串格式化("%x",偏移)
- 对象ID地址=字符串拼接("[A1B478]+",偏移)
- 对象ID=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,对象ID地址,0))
-
- 偏移=21516+u*64 //21516为540C十进制
- 偏移=字符串格式化("%x",偏移)
- 对象类型地址=字符串拼接("[A1B478]+",偏移)
- 对象类型=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,对象类型地址,0))
-
- 列表框增加文本("数组遍历周围环境","对象ID:"&对象ID&" 对象名称:"&对象名称&"——"&"对象类型:"&对象类型)
- end
- end
- 功能 二叉树遍历周围环境()
- var 返回的数据,大小,u,对象ID,对象名称,血量,X坐标,Y坐标,类型一,类型二,虚函数
- 返回的数据=二叉树遍历周围环境查找遍历()
- 大小=数组大小(返回的数据)
- u
- 遍历(u=0;u<大小;u++)
- 对象ID=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,整型转十六进制字符(返回的数据[u]+#c),0))
- 对象名称=大漠.ReadString(全局窗口句柄,"[[["&整型转十六进制字符(返回的数据[u]+#10)&"]+1EC]+4]+3c",0,16)
- 血量=大漠.ReadFloat(全局窗口句柄,"[[["&整型转十六进制字符(返回的数据[u]+#10)&"]+1EC]+4]+8")
- X坐标=int(大漠.ReadFloat(全局窗口句柄,"["&整型转十六进制字符(返回的数据[u]+#10)&"]+48"))
- Y坐标=int(大漠.ReadFloat(全局窗口句柄,"["&整型转十六进制字符(返回的数据[u]+#10)&"]+50"))
- 类型一=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,"[["&整型转十六进制字符(返回的数据[u]+#10)&"]+2c]+18",0))
- 类型二=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,"[["&整型转十六进制字符(返回的数据[u]+#10)&"]+0]+38",0))
- 虚函数=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,"["&整型转十六进制字符(返回的数据[u]+#10)&"]",0))
- if(对象名称=="")
- if(虚函数==字符串格式化("%x","8977224"))//采集物虚函数88FB48的十进制
- 对象名称=大漠.ReadString(全局窗口句柄,"[[["&整型转十六进制字符(返回的数据[u]+#10)&"]+118]+4]+0",0,16)
- end
- if(虚函数==字符串格式化("%x","8976480"))//地上包虚函数88F860的十进制
- 对象名称="包裹"
- end
- end
- 列表框增加文本("二叉树遍历周围环境","对象ID:"&对象ID&" 对象名:"&对象名称&"血量"&血量&"X坐标"&X坐标&","&"Y坐标"&Y坐标&" "&"类型一:"&类型一&" "&"类型二"&类型二&"虚函数"&虚函数)
- end
- end
- function 二叉树遍历周围环境查找遍历()
- var 基址,返回的数据,树根,进程PID,u,返回数据
- 基址=整型转十六进制字符(周围对象基址_十六进制)
- 返回的数据=数组()
- 树根=大漠.ReadInt(全局窗口句柄,"[["&基址&"]+68]+4",0) //获取树根
- 进程PID=天使.GetWindowProcessId(全局窗口句柄) //为了减少遍历代码的遍历所需时间我们使用TC自带的读取内存的功能,所以将窗口句柄转换为进程PID
- 进程句柄=进程信息(进程PID,2) //PID转进程句柄
- 返回数据=二叉树遍历周围环境查找数据(树根)
- return 返回数据
- end
- function 二叉树遍历周围环境查找数据(树根)
- var 是否空树=读byte(进程句柄,树根+#15)
- if(是否空树==0)
- 数组追加元素(二叉树遍历周围环境根总集,树根)
- 数组追加元素(二叉树遍历周围环境根临时存放集,树根)
- while(数组大小(二叉树遍历周围环境根临时存放集)!=0)
- var 临时根个数=数组大小(二叉树遍历周围环境根临时存放集)
- var 二叉树遍历周围环境根临时存放集2=数组()
- 二叉树遍历周围环境根临时存放集2=二叉树遍历周围环境根临时存放集//赋值到新存放集,原来的存放集可以清空了
- 数组清空(二叉树遍历周围环境根临时存放集)//清空存放集就可以放子程序过后新的根了
- for(var i = 0; i < 临时根个数; i++)
- 二叉树遍历周围环境查找数据取根(二叉树遍历周围环境根临时存放集2[i])
- sleep(5)
- end
- end
- end
- return 二叉树遍历周围环境根总集
- end
- function 二叉树遍历周围环境查找数据取根(树根)
- var 左树,右树,是否空树
- 左树=读4byte(进程句柄,树根)//小于根的ID放入左树
- 是否空树=读byte(进程句柄,左树+#15)
- 如果(是否空树==0)
- 数组追加元素(二叉树遍历周围环境根总集,左树)
- 数组追加元素(二叉树遍历周围环境根临时存放集,左树)
- end
- 右树=读4byte(进程句柄,树根+#8)//大于根的ID放入右树
- 是否空树=读byte(进程句柄,右树+#15)
- 如果(是否空树==0)
- 数组追加元素(二叉树遍历周围环境根总集,右树)
- 数组追加元素(二叉树遍历周围环境根临时存放集,右树)
- end
- end
- 功能 遍历技能()
- var 返回的数据,大小,u,技能ID,技能名称
- 返回的数据=技能二叉树查找遍历(全局窗口句柄)
- 大小=数组大小(返回的数据)
- u
- 遍历(u=0;u<大小;u++)
- 技能ID=整型转十六进制字符(大漠.ReadInt(全局窗口句柄,整型转十六进制字符(返回的数据[u]+#c),0))
- 技能名称=大漠.ReadString(全局窗口句柄,"[["&整型转十六进制字符(返回的数据[u]+#10+#4)&"]+0c]+0",0,16)
- 列表框增加文本("技能遍历","技能ID:"&技能ID&" 技能名:"&技能名称)
- end
- end
- 功能 技能二叉树查找遍历(窗口句柄,遍历次数=1000) //设定遍历次数为默认1000次的遍历
- var 基址,返回的数据,树根,进程PID,u,返回数据
- 基址=整型转十六进制字符(基址1)
- 返回的数据=数组()
- 树根=大漠.ReadInt(窗口句柄,"[[[[["&基址&"]+74]+1ec]+4]+2868]+4",0) //获取树根
- 进程PID=天使.GetWindowProcessId(窗口句柄) //为了减少遍历代码的遍历所需时间我们使用TC自带的读取内存的功能,所以将窗口句柄转换为进程PID
- 进程句柄=进程信息(进程PID,2) //PID转进程句柄
- u
- 遍历(u=0;u<遍历次数;u++) //u就是代表要查找的技能ID, 我们从ID=0查找到 ID=1000
- 返回数据=技能二叉树查找数据(树根,u) //调用专门查找指定数据的子程序
- 如果(返回数据!=0) //如果返回为0证明树中没有要查找的内容
- 数组追加元素(返回的数据,返回数据) //不为0就证明找到了数据, 而返回的数据就是树的每个节点
- end
- end
- 返回 返回的数据
- end
- 功能 技能二叉树查找数据(树根,查找的数据) //这里的代码执行过程跟OD里面的二叉树遍历基本差不多. 不过我们就是将没有找到的数据返回0了
- var 是否空树,查找目标,是否空
- 循环(真)
- 是否空树=读byte(进程句柄,树根+#25)
- 如果(是否空树==0)
- 查找目标=读4byte(进程句柄,树根+#c)
- 如果(查找目标==查找的数据)
- 返回 树根
- 否则
- 如果(查找目标>=查找的数据)
- 树根=读4byte(进程句柄,树根)//小于根的ID放入左树, 大于根的ID放入右树
- 是否空=读byte(进程句柄,树根+#25)
- 如果(是否空!=0)
- 返回 0
- end
- 否则
- 树根=读4byte(进程句柄,树根+#8)//小于根的ID放入左树, 大于根的ID放入右树
- 是否空=读byte(进程句柄,树根+#25)
- 如果(是否空!=0)
- 返回 0
- end
- end
- end
- end
- end
- end
- 功能 周围二叉树查找遍历(窗口句柄,遍历次数=3000) //设定遍历次数为默认1000次的遍历
- var 基址,返回的数据,树根,进程PID,u,返回数据
- 基址=整型转十六进制字符(周围对象基址_十六进制)
- 返回的数据=数组()
- 树根=大漠.ReadInt(窗口句柄,"[["&基址&"]+68]+4",0) //获取树根
- 进程PID=天使.GetWindowProcessId(窗口句柄) //为了减少遍历代码的遍历所需时间我们使用TC自带的读取内存的功能,所以将窗口句柄转换为进程PID
- 进程句柄=进程信息(进程PID,2) //PID转进程句柄
- 数组追加元素(返回的数据,返回数据)
- u
- 遍历(u=0;u<遍历次数;u++) //u就是代表要查找的技能ID, 我们从ID=0查找到 ID=1000
- 返回数据=周围二叉树查找数据(树根,u) //调用专门查找指定数据的子程序
- 如果(返回数据!=0) //如果返回为0证明树中没有要查找的内容
- 数组追加元素(返回的数据,返回数据) //不为0就证明找到了数据, 而返回的数据就是树的每个节点
- end
- end
- 返回 返回的数据
- end
- 功能 周围二叉树查找数据(树根,查找的数据) //这里的代码执行过程跟OD里面的二叉树遍历基本差不多. 不过我们就是将没有找到的数据返回0了
- var 是否空树,查找目标,是否空
- 循环(真)
- 是否空树=读byte(进程句柄,树根+#15)
- 如果(是否空树==0)
- 查找目标=读4byte(进程句柄,树根+#c)
- 如果(查找目标==查找的数据)
- 返回 树根
- 否则
- 如果(查找目标>=查找的数据)
- 树根=读4byte(进程句柄,树根)//小于根的ID放入左树, 大于根的ID放入右树
- 是否空=读byte(进程句柄,树根+#15)
- 如果(是否空!=0)
- 返回 0
- end
- 否则
- 树根=读4byte(进程句柄,树根+#8)//小于根的ID放入左树, 大于根的ID放入右树
- 是否空=读byte(进程句柄,树根+#15)
- 如果(是否空!=0)
- 返回 0
- end
- end
- end
- end
- end
- end
- function 整型转十六进制字符(欲转换的值)
- 如果(欲转换的值!=null)
- 返回 字符串格式化("%x",转整型(欲转换的值))
- end
- end
复制代码
|