能力值:
( LV2,RANK:10 )
|
-
-
76 楼
谢谢楼主,祝楼主上下增长
|
能力值:
( LV5,RANK:60 )
|
-
-
77 楼
谢谢,长不动了...
|
能力值:
( LV2,RANK:10 )
|
-
-
78 楼
万分感谢楼主分享,拿走啦
|
能力值:
( LV2,RANK:10 )
|
-
-
79 楼
不错。的确很好
|
能力值:
( LV2,RANK:10 )
|
-
-
80 楼
感谢。 留层mark 得空学习下。
|
能力值:
( LV2,RANK:10 )
|
-
-
81 楼
我们可以谈谈游戏合作,有兴趣邮件详聊948309995@qq.com,谢谢
|
能力值:
( LV2,RANK:10 )
|
-
-
82 楼
谢谢兄弟。。
|
能力值:
( LV2,RANK:10 )
|
-
-
83 楼
太牛叉了,膜拜大神啊。底层驱动开发难啊
|
能力值:
( LV2,RANK:10 )
|
-
-
84 楼
66666666666666666
|
能力值:
( LV2,RANK:10 )
|
-
-
85 楼
感谢 学习下
|
能力值:
( LV2,RANK:10 )
|
-
-
86 楼
小白刚来,膜拜一下,感谢分享~
|
能力值:
( LV2,RANK:10 )
|
-
-
87 楼
谢谢分享学习一下
|
能力值:
( LV7,RANK:110 )
|
-
-
88 楼
代码是精彩,不过有多个致命问题!
第一:
就是一看就是不支持多核心的CPU!居然使用关中断的办法!你不知道关闭中断,只是关闭当前线程依赖的核心的中断,而无法关闭别的中断么?而且,关闭中断前,没有任何的程序保证别的核心处于空闲状态!
第二:
还有HOOK 时没有关闭PG,这会导致蓝屏!
第三:程序不支持X64
第四:有安全的内存描述符的方式来修改内存,你为什么不使用,而是使用不安全的修改寄存器的方法来关闭写保护呢?
总之一句话,楼主在HOOK时能考虑一下程序的安全性,通用性,和不依赖标志寄存器进行操作么?因为你在操作标志寄存器等基础的操作时,系统也在使用这些寄存器,有可能造成冲突(除了msdn 中已经文档化可以使用的寄存器和通用寄存器除外),HOOK时,你还应该考虑多核心共享的问题!你只关闭了中断,你并没有考虑到,当你关闭中断时,其关闭的是本核心的中断而已,别的核心的中断照样运行!关闭中断进行HOOK时,你并不能保证被HOOK的代码是否在执行,如果你在HOOK时,代码正在执行怎么办?你的HOOK代码中没有任何机制确保呗HOOK的代码不在执行!正确的办法是向所有核心插入DPC ,然后再DPC,在DPC中执行HOOK,并且在插入DPC之前,先准备内存描述符(MDL),在DPC回掉中,使用操作MDL的方法写入HOOK,这样就可以避免使用标志寄存器带来的不便,同时保持稳定性!因为在HOOK完成之前,所有核心都陷入你的DPC代码中!你只要在HOOK完成之前,不退出DPC回掉,就可以保证呗HOOK的代码不在执行,同时,由于使用MDL进行HOOK的写入,可以保证最大的兼容性(MDL可是正规的微软的办法啊)
|
能力值:
( LV7,RANK:110 )
|
-
-
89 楼
对了 X64的windows的SSDT结构已经更改,并且这个结构已经不导出,要找到这结构还挺麻烦的!
建议你尽量使用微软的API进行HOOK,不然会很不稳定的!
|
能力值:
( LV2,RANK:10 )
|
-
-
90 楼
感谢分享
|
能力值:
( LV5,RANK:60 )
|
-
-
91 楼
棒棒哒,如果在以前听到您说到这些问题我会异常兴奋,还有可能两眼泛着泪光。确实存在一些问题,不过时间原因没能继续深扣。
再就是当初这个驱动只为脚本服务的,脚本不再搞了,驱动就变的没有意义了。
也考虑过把脚本扔掉,只做驱动,因为各种原因也扔掉了。
您很专业,我也很欣赏。这是14年写的,在那之前,网上没有找到比这更全面的,所以在当时我决定写一个出来。完全的看其他高手代码,网上各种文档,20天完成了。除了inline hook部分是完全原创外,其他应该都是借鉴和在自己的理解下改进而成的。
我现在改行了,这些问题就当成是一种遗憾吧。不过要谢谢你,让我知道代码里存在着哪些问题,在这之前,周围的人没有能给我中肯意见的。。。感谢!
|
能力值:
( LV7,RANK:110 )
|
-
-
92 楼
你看文档也看不全,XP系统是提供了一个大内核锁的,XP系统上调用这个锁,可以马上锁死系统其它的核心的!VISTA之后就取消了这锁,然后用更加细的锁代替了这个锁,实际上,经过我的测试,我们只需要,将windows提供的内核锁全部锁上,就可以最大限度保证在HOOK时别的核心无法得到调度运行,不过,遗憾的是,这些锁同样是没有文档化的,需要自己找资料!至于MDL的方法嘛,这个写只读内存的方法,确实是,微软已经文档化的!是正规的方法,它可以保证最大的兼容性!
你做这些事情的时候,要尽量使用微软提供的函数,这样保证最大的兼容性!不然,你自己弄得话,调试的时候,你就知道哭了!
|
能力值:
( LV7,RANK:110 )
|
-
-
93 楼
使用MDL,具体代码我懒得贴上去了,写个代码还得测试,烦死了,给你个思路吧!先申请一个MDL,将需要HOOK的位置与这个MDL绑定,然后通过MDL,修改内存属性,修改属性后的内存,还是不能直接使用的,需要通过MDL,映射出新的内存之后,操作这新的内存即可,这样系统会将内存中的内容同步到原来的HOOK中去的!映射新的地址之后,你不能马上操作!你需要建立一个计时器,一个计数器,和一个退出DPC的标志,这个标志的设置需要使用 ExInter系列的原子互斥的API操作,计数器也要使用ExInter系列的原子互斥的API,计数器用来统计所有的核心是否都进入DPC中了!
先启动计时器,等CPU核心进入DPC时,通过计数器统计一下所有的核心是否都进入了DPC,如果没有进入DPC,则等待,直到计时器时间走完,如这个时候还是没有让所有核心进入DPC的,则设置退出标志,放弃所有HOOK,销毁计时器!如果在计时器时间完成前,所有的核心都进入了DPC的话,则进行HOOK,完成之后设置退出标志,退出DPC,然后销毁计时器!这样HOOK就完成了,同时也能保证在HOOK时不会出现被HOOK的代码正在执行的情况!
|
能力值:
( LV7,RANK:110 )
|
-
-
94 楼
其实也不算什么专业了,只是以前曾经遇到过的问题!折磨得我都要哭了!系统核心的多线程共享,让我在调试的时候调试到哭!最后在一些资料上看到前人的告诫:“任何系统核心编程,都要考虑多线程同步的问题,否则会很不稳定的!",后来我才知道,如果能使用API实现功能的话,就应该使用API来实现,因为API是微软保证能实现稳定的程序!如果不能使用API,那就应该使用内存锁等强制同步手段来同步多线程!
|
能力值:
( LV2,RANK:10 )
|
-
-
95 楼
非常感谢,从来没有看过这类软件的源代码
|
能力值:
( LV2,RANK:10 )
|
-
-
96 楼
请问大神收徒吗?
|
能力值:
( LV5,RANK:60 )
|
-
-
97 楼
实力不够啊
|
能力值:
( LV2,RANK:10 )
|
-
-
98 楼
你还在弄么,我还在弄。 游戏虐我千百遍,我对游戏如初恋!
|
能力值:
( LV2,RANK:10 )
|
-
-
99 楼
MARK
|
能力值:
( LV7,RANK:110 )
|
-
-
100 楼
Sorry 源代码丢了!(弄核心编程太多,硬盘呗弄坏了)现在阶段,我主要进行应用的编程!
|
|
|