堆传奇游戏模块加载失败的游戏叫什么

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
《EBCSS》中游戏化互动学习模块的设计与开发
下载积分:1300
内容提示:《EBCSS》中游戏化互动学习模块的设计与开发
文档格式:PDF|
浏览次数:1|
上传日期: 08:30:06|
文档星级:
该用户还上传了这些文档
《EBCSS》中游戏化互动学习模块的设计与开发
官方公共微信【原创】某超级模块中游戏双开功能实现 [文字模式]
- 看雪安全论坛
查看完整版本 :
易始超级模块中有个双开功能,能够双开腾讯的大部分游戏,例如DNF。于是就下载模块下来分析了一下。
随便在网上找一个用超级模块写的双开工具。然后OD载入,下bp DeleteFileA断点。
为什么要下deleteFile断点,而不是CreateFile,是因为该模块注册驱动文件后就会将驱动文件删除。
下了断点之后点击启动双开的时候,OD断下。查看堆栈,可以看到写出的驱动路径。
将驱动文件拷贝出来,文件大小只有3kb,用IDA打开。
INIT: ; NTSTATUS __stdcall DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath)
public DriverEntry
INIT: DriverEntry
INIT: DriverObject
= dword ptr
INIT: RegistryPath
= dword ptr
INIT:0001098A
eax, dword_10904
INIT:0001098F
ecx, 0BB40h
short loc_1099C
INIT:0001099A
short loc_109BF
INIT:0001099C
INIT:0001099C loc_1099C:
CODE XREF: DriverEntry+11j
INIT:0001099C
edx, ds:KeTickCount
eax, offset dword_10904
INIT:000109AA
eax, [edx]
INIT:000109AC
eax, 0FFFFh
dword_10904, eax
short loc_109BF
INIT:000109BA
dword_10904, eax
INIT:000109BF
INIT:000109BF loc_109BF:
CODE XREF: DriverEntry+15j
INIT:000109BF
DriverEntry+31j
INIT:000109BF
dword_10900, eax
INIT: DriverEntry
入口函数处没什么特殊的,跳到了sub_106F8,下面来看看这个函数里面具体实现。
.text: ; int __stdcall sub_106F8(PDRIVER_OBJECT DeviceObject, int)
.text: sub_106F8
proc CODE XREF: DriverEntry+42j
.text: SymbolicLinkName= UNICODE_STRING ptr -10h
.text: DestinationString= UNICODE_STRING ptr -8
.text: DeviceObject
= dword ptr
.text:000106FA
.text:000106FB
.text:000106FD
esi, [ebp+DeviceObject]
edi, ds:RtlInitUnicodeString
.text:0001070B
offset word_106A6 ; SourceString
eax, [ebp+DestinationString]
push DestinationString
dword ptr [esi+38h], offset sub_10486
//设置IRP处理函数
.text:0001071B
dword ptr [esi+40h], offset sub_10486
dword ptr [esi+70h], offset sub_104AA
dword ptr [esi+34h], offset sub_10670
RtlInitUnicodeString
//初始化设备名称
eax, [ebp+DeviceObject]
push DeviceObject
0 Exclusive
0 DeviceCharacteristics
.text:0001073A
22 DeviceType
.text:0001073C
eax, [ebp+DestinationString]
.text:0001073F
push DeviceName
0 DeviceExtensionSize
push DriverObject
ds:IoCreateDevice
//创建设备
.text:0001074B
short loc_10780
.text:0001074D
offset word_106CA ; SourceString
eax, [ebp+SymbolicLinkName]
push DestinationString
RtlInitUnicodeString
//初始化符号链接名称
eax, [ebp+DestinationString]
.text:0001075B
push DeviceName
.text:0001075C
eax, [ebp+SymbolicLinkName]
.text:0001075F
push SymbolicLinkName
ds:IoCreateSymbolicLink
//创建符号链接
.text:0001076A
short loc_10779
//创建成功就跳过去
.text:0001076C
[ebp+DeviceObject] ; DeviceObject
.text:0001076F
ds:IoDeleteDevice
//创建失败则删除设备
short loc_10780
.text: ; ---------------------------------------------------------------------------
.text: loc_10779:
CODE XREF: sub_106F8+72j
.text:0001077E
.text: loc_10780:
CODE XREF: sub_106F8+53j
sub_106F8+7Fj
.text: sub_106F8
创建设备,创建符号链接,用于与R3层通讯。那么主要的功能实现就在
sub_105C8 这个函数里面了。
.text: sub_105C8
proc CODE XREF: sub_106F8:loc_10779p
eax, ds:KeServiceDescriptorTable
//得到系统服务描述表的地址
.text:000105CD
.text:000105CE
esi, [eax]
//得到表中第一个函数的位置
// 加上0xAC,表中每个函数地址占4个字节,0ac / 4 = 43
eax, [esi]
dword_1090C, eax
//保存ssdt表中的43号函数地址到全局变量
.text:000105DD
//通过cr0寄存器去掉写保护
ds:KeRaiseIrqlToDpcLevel
//提升中断请求等级
cl, NewIrql
.text:000105EA
dword ptr [esi], offset MyNtCreateMutant //SSDT HOOK 43号函数
ds:KfLowerIrql
eax, dword_10908
.text:000105FD
.text: sub_105C8
通过上面可以看出驱动仅仅是对 SSDT表中的43号函数进行了hook。
用XT看了一下43号 即:NtCreateMutant函数。
而用户层的CreateMetux函数最终调用的就是内核层的NtCreateMutant。
也就是说 DNF判断游戏双开的方法之一就是互斥体。
最后再来看看HOOK函数中是怎样处理的。
.text:0001057A
.text:0001057B
.text:0001057C
offset SourceString
; sourceString = &\\basenamedobjects\\dbefeuate_ccen_khxfor&...
eax, [ebp-4]
; 局部变量1
; DestinationString
ds:RtlInitUnicodeString
; 初始化一个内容为\\basenamedobjects\\dbefeuate_ccen_khxfor的PUNICODE_STRING到局部变量1
.text:0001058B
esi, [ebp-8]
; 局部变量2
.text:0001058E
short loc_105A5
; 如果局部变量2为0,跳
; 不区分大小写
dword ptr [esi+8] ; String2 ;
eax, [ebp-8]
; 局部变量2
.text:0001059A
.text:0001059B
ds:RtlEqualUnicodeString
;变量2 与参数3中的Unicode_String比较
short loc_105BB
; 如果两个字符串相等
函数直接返回
.text: loc_105A5:
; 如果字符串不相等
[ebp+arg_C]
eax, dword_1090C
;dword_1090C 保存真实的NtCreateMutant函数地址
.text:000105AD
.text:000105AE
[ebp+arg_4]
dword_10910, eax
[ebp+arg_0]
dword_1090C
;调用真实的NtCreateMutant
.text:000105BB
.text:000105BB loc_105BB:
CODE XREF: sub_10574+2Fj
.text:000105BB
.text:000105BD
.text:000105BE
.text:000105BF
.text:000105BF sub_10574
到这里之后可以看出在 hook NtCreateMutant的 处理函数当中 进行了判断。
NtCreateMutant的原型为:
NtCreateMutant (
__out PHANDLE MutantHandle,
__in ACCESS_MASK DesiredAccess,
__in_opt POBJECT_ATTRIBUTES ObjectAttributes,
__in BOOLEAN InitialOwner
typedef struct _OBJECT_ATTRIBUTES {
HANDLE RootD
PUNICODE_STRING ObjectN
PVOID SecurityD
// Points to type SECURITY_DESCRIPTOR
PVOID SecurityQualityOfS
// Points to type SECURITY_QUALITY_OF_SERVICE
} OBJECT_ATTRIBUTES;
参数3中的UNICODE_STRING进行对比,如果值为\\basenamedobjects\\dbefeuate_ccen_khxfor,那么NtCreateMetux返回失败。
另外,根据双开工具上面的 隐藏游戏窗口功能 可以看出DNF双开限制是 通过互斥体 跟 FindWindow()来进行判断。
辉煌世纪;):;):;):谢谢分享
wodexinren感谢分享,mark
透明色厉害,又学习了!
虫子wq厉害!。。。学习了!!!!
exediyTX又退步了?!?!?这是新的?目测应该是前年的了吧
dayang用XT看了一下43号????
XT的什么项目里可以看?怎么看啊?
dayang明白了,是我没加载这个SYS,所以在SSDT里没任何信息
phpskycn感谢LZ分享--
冬阳春雪dnf双开 mairk
langyashan用XT看了一下43号 即:NtCreateMutant函数。
在这句话上面的图,是什么软件?能够列出SSDT各功能号被HOOK
我想起来了,这个软件是XUETR
ugvjewxf双开和多开有没有区别?
就用这两个东东判断?
太意外了,,意外有很多很多东东等着发现呢,,,
dancebaby理解了,哈哈,第一次看明白,mark
天纵好东西,mark一下
地狱怪客学习了哈。。。。
御剑残风学习了...感谢分享!
Michael广东写的很明白,不过怀疑DNF这个有没有这么简单。。。
先按楼主的办法回去试试
谢谢分享!
tiandishiw顶 学习了!
stevenlong呵呵,只能双开..........................
upupcSetParent
CloseHandle
双开很简单,但是多开还有其他的处理机制
zyicai学习了。。。。
savipinitdrv *.sys 应该可以双开或多开了吧。
不死小尧学习了。
moveaxeax参观学习.....
PS:不是还有和tp的通信吗,这双开可以稳定吗?
----看雪有你更精彩
moveax刚试了,这方法现在不能双开
hehex学习了,有点意思。
qqwawzymu很好 学习到很多东西 主要是 怎么能多开呢??
jaix以前找了好久没找到、、、
缘分天空感谢分享!!!!!
mumaren感谢分享,mark
mlikai驱动好东西,可惜还看不大明白,继续学习
mlikai驱动学习了啊。。。
twoseconds学习了。。感觉LZ
shenger学习了。。
虽然完全不懂驱动啊。
sorrywyb学习一下 ..请问什么是游戏的模块和脚本?谢谢_百度知道
请问什么是游戏的模块和脚本?谢谢
主要是单机游戏,手机游戏的。
提问者采纳
都要分成多个模块由多个小组进行制作,而脚本则相当如控制这个角色的操纵者(1) 游戏实际也是一个软件项目,他控制的游戏中所有角色的一切活动和可能发生的事件,而他们每个要完成的任务都是一个较小模块,角色的一切活动都由脚本事先准备好,只要是软件项目。
(2) 而脚本则有些类似于剧本,游戏中的角色就好像是一个提线木偶,比如一个游戏中有两个人物角色每个角色就是一个大的模块
其他类似问题
为您推荐:
其他8条回答
模块我的理解就是游戏的人物,造型啥的。脚本就是游戏的剧情,一个人物的动作啥的
汉语里面 模块通常指MOD。。日文游戏 模块很多时候似乎指的是游戏主文件的几个资源组脚本吗…… 一般指的是剧情,但是英文里面Script有更丰富的意义,简而言之,程序也是由“脚本”写成的
让您久等了,我来告诉您:(1) 游戏实际也是一个软件项目,只要是软件项目,都要分成多个模块由多个小组进行制作,比如一个游戏中有两个人物角色每个角色就是一个大的模块,而他们每个要完成的任务都是一个较小模块。 (2) 而脚本则有些类似于剧本,他控制的游戏中所有角色的一切活动和可能发生的事件,游戏中的角色就好像是一个提线木偶,而脚本则相当如控制这个角色的操纵者,角色的一切活动都由脚本事先准备好。
参考资料:
1、模块,简单的理解就是整体功能的拆分。好比一个人,可以拆分为四肢、躯干等模块,然后又可以细分为手脚、皮肤、内脏等更小的模块。游戏的模块是把整个游戏视为一个人,从而大致划分为:游戏流程控制模块、游戏的字符串封装模块,游戏的边框封装模块,还有最主要的动画控制模块,不一而定(根据自己的喜好和需求封装自己的模块)。
2、脚本,主要是为了减轻开发压力。主程序在编写游戏的过程中,把游戏中需要用到的游戏数据按照一定的格式进行确定,然后在游戏代码中实现对这种格式数据的处理;然后,其他程序员或者策划人员按照这种格式编写出来的代码或者数据,在手机游戏中可以直接被读取使用,从而达到控制游戏逻辑以及显示的效果,这种文件都可以称为脚本,与PC编程的脚本概念有些不太一样。一般在手机...
如果你是玩网络游戏,想自己做外挂,或者是辅助工作,不仿去,按键精灵,论坛,&外挂作坊&去学习(强烈推荐)那里有一系列的教程视频,和相关软件打包
关于你的问题,楼上的我想很详细,也很通俗容易懂
、模块,简单的理解就是整体功能的拆分。好比一个人,可以拆分为四肢、躯干等模块,然后又可以细分为手脚、皮肤、内脏等更小的模块。游戏的模块是把整个游戏视为一个人,从而大致划分为:游戏流程控制模块、游戏的字符串封装模块,游戏的边框封装模块,还有最主要的动画控制模块,不一而定(根据自己的喜好和需求封装自己的模块)。
2、脚本,主要是为了减轻开发压力。主程序在编写游戏的过程中,把游戏中需要用到的游戏数据按照一定的格式进行确定,然后在游戏代码中实现对这种格式数据的处理;然后,其他程序...
模块我的理解就是游戏的人物,造型啥的。
模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情,一个人物的动作啥的 模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情,一个人物的动作啥的 模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情,一个人物的动作啥的 模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情,一个人物的动作啥的 模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情,一个人物的动作啥的 模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情,一个人物的动作啥的 模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情,一个人物的动作啥的 模块我的理解就是游戏的人物,造型啥的。
脚本就是游戏的剧情...
模块就是第几关
一楼的说得对
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁& 求一个制作游戏修改器的思路
查看: 1035|回复: 3
UID1387756主题阅读权限20帖子精华0积分51金钱803 荣誉1 人气0 在线时间147 小时评议0
Lv.2游侠会员, 积分 51, 距离下一级还需 149 积分
帖子精华0积分51金钱803 荣誉1 人气0 评议0
制作工具VS2010
游戏中的数据,我看总体货币数据是在初始化内存里,逻辑帧数据是在栈里,具体每个人物对象的数据是在堆里
初始化内存里的数据,可以根据进程地址,用指针算偏移找到内存地址,进行修改
那么请教在堆里的数据,如何找到地址,因为堆里每次的对象不是固定的,算内存地址偏移貌似不可行
UID1524672主题阅读权限40帖子精华0积分718金钱3094 荣誉0 人气34 在线时间2692 小时评议0
Lv.4游侠高级会员, 积分 718, 距离下一级还需 282 积分
帖子精华0积分718金钱3094 荣誉0 人气34 评议0
基本的原理很清楚 就是修改内存 既然看似有了程序基础咱就按照程序的角度来说
运转中的游戏的代码也一样是存在内存里的 直接定义和读取的部分也会在这里面 记得好像咱那会看得教程是叫模块地址还是啥 大致是0x004开始往后的很长一部分 这部分是无论你何时运行都不随运行环境变化的 如果你要修改的地址是在这个范围内的 那么你放心保存
还有一部分正如你说 是运行时确定数据或结构起始地址的 这部分你如果你想稳定的找到它的地址 那么就需要找到谁去引用它的 这部分可能是模块地址 那么你就能从这部分获取到它的运行时地址 那么这部分也可能是变化的 那么就要再去找引用这部分内存的是不是模块地址 以此类推
如果你是用CheatEngine来搜索地址 模块地址在搜索的时候就会被显示成绿色的 你找到的“堆里的数据”一种方法你可以再去查找有谁保存了它的地址(搜索16进制数)看是不是模块地址 或者可以先把它放到你的地址栏里 然后右键选择查看什么修改/访问了该地址 然后尝试通过程序指令寻找到引用它的地址 一步步推 层数多的话会是个挺艰苦的过程 但成功后的成就感可不止是翻倍的
另外有时修改并不一定要修改记录位置 你用上面提到的查找谁修改了该地址 一般情况下这部分指令会是在模块地址的 比如你是想锁血的话用你的程序直接把修改血量的指令的这段内存改成什么都不做的就行了 比修改数据存储的内存段更让人放心(比如不会出现敌人把你的血打到0的瞬间系统依旧判断你死亡的问题)
助人为乐,品格高尚~
总评分:&金钱 + 10&
UID1809794主题阅读权限60帖子精华0积分3314金钱5054 荣誉0 人气119 在线时间10030 小时评议0
Lv.6游侠黄金会员, 积分 3314, 距离下一级还需 2686 积分
帖子精华0积分3314金钱5054 荣誉0 人气119 评议0
我居然看懂了。。。。指针什么的。。。
幸福的家庭都是相似的,不幸的家庭各有各的不幸——托尔斯泰
UID4564467主题阅读权限20帖子精华0积分2878金钱1636 荣誉0 人气150 在线时间5699 小时评议0
头像被屏蔽
帖子精华0积分2878金钱1636 荣誉0 人气150 评议0
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
Powered by

我要回帖

更多关于 堆叠模块 的文章

 

随机推荐