yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:4541回复:29

如何拦截gdi.dll中的api函数StartDocA或StartDocW

楼主#
更多 发布于:2004-05-26 10:59
这两个函数打印相关。
不要以为这可以在应用层做,----呵呵,我指的是98哦。
那么在内核怎么实现呢?
关于vxd,大家都知道如何截获文件的api操作如删除啦改名啦等等。
但是,打印是不一样的,这里截获的是一个进程的打印api,我也不太懂,还望高手指点啊。
yetty_forever
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-06-13 18:38
但我想MS应该吸取以前的教训,做的聪明些
这样就会比16位到32位简单了
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-06-13 18:37
是呀,但是当64位真正大规模使用时,32位到64位转换也成为一个很大的事了。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
地板#
发布于:2004-06-02 21:14
16位和32位同时处理,很麻烦的,所以在64位以后,所有的内核64位的,避免了无谓的烦琐。。。。。。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-06-02 12:51
惭愧,你说的很多我都不知道是什么东西,毕竟是一月前真正开始编程,读硕的年代都是用matlab做数学计算。当然也是自己不学无术。
离题了。。。。。。
yetty_forever
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-06-02 11:54
另外需要将自己的代码注入修改的模块,这也有很多办法,
如果对16位和32位同时处理,需要使用thunk等老掉牙的技术
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-06-02 11:51
实现思路(当然也有其它方法)是在函数入口增加一条跳转指令,跳到你的函数地方,然后你处理,然后恢复指令并执行,执行后修改为跳转。
这只是实现该方法的一个办法,当然还有很多其他方法。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-06-02 10:19
再顶一下
下面是SnowStart得到api的地址方法,我知道这是在应用层才能用,没关系,我的想法是现在应用层得到api的地址,然后再vxd中去写内存,所以这段代码还是可以借鉴的。但是一个新的问题出现了,就是gdi32.dll被进程调用的时候,它是映射到该进程的地址空间的,所以寻找api的地址,是不是应该和调用它的进程联系起来呢?实际上我是想屏蔽某个进程的打印功能,不知道修改api地址如何与改进诚联系起来,还望大家指点。---------给多少分都愿意,只要我有
HMODULE hModule=LoadLibrary(\"gdi.exe\");

FARPROC myStartDoc=GetProcAddress(hModule,\"StartDoc\");

int myStartDoc(
HDC hdc, // handle to DC
CONST DOCINFO* lpdi // contains file names
)
{
//add your code
}
yetty_forever
driversupport
驱动牛犊
驱动牛犊
  • 注册日期2004-06-01
  • 最后登录2004-06-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-06-01 13:18
我也很想知道,ring0级还是很难的。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-05-31 22:48
由于该技术已经过失,并且很繁琐,所以这里不想多说了。
只是提供一个实现实现需要注意的地方。
首先需要vc1.5恐怕现在很少有人有了,95ddk,还有对DPMI非常熟悉,对16位的内存管理熟习等等。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-05-31 19:40
还是AllenZh说的对。
其实也不是16位与32位的区别,只是98与2000的区别。
对于2000,核心编程那本书上讲得非常详细,我也实现了。
但是核心编程书上同时也说了很多2000与98区别,结果我用同样的办法在98下实现,却出现系统崩溃现象。
就是常见的什么你做了非法操作,什么即将关闭那个框。
核心编程那本书上说可以用vxd来解决这个98应用层完成不了的问题,所以我就选择了vxd。
现在的问题时,如何在vxd中像应用层得到函数在模块中的地址并交换呢?
唉,有时候不亲自做就是不会发现问题所在的。
yetty_forever
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-05-31 16:56
是的Hook一般的API是很多,但要Hook 16位的API,比如:楼主的要求就不一定了那么简单了
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
12楼#
发布于:2004-05-31 12:58
98下HOOK API的方法很多,也很容易.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-05-31 10:48
当然可以解决,象pcAnywhere等就使用了相应技术,我也曾经在TOP2000 IP Class中使用了相应技术,在9x下你还需要16位的编译器(如VC++1.5和95 DDK等)。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-05-31 09:46
看了一下,感觉还是解决不了。
有没有人再说两句啊
给分了。
yetty_forever
yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-05-30 12:59
好的,等我去弄个水落石出
yetty_forever
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-05-30 12:44
楼上的说话听起来不太爽啊,呵呵。
没关系,想啥说啥吧,下面有一段话,不知道是不是真的
On Windows 98, the main Windows DLLs (Kernel32, AdvAPI32, User32, and GDI32) are protected in such a way that an application cannot overwrite their code pages. You can get around this by writing a virtual device driver (VxD).  


呵呵,那只能说明你犯了战略性方向错误 :D :D :D

一座山挡在你前面,难道你不懂得绕山而行,非得要炸山不成???

我再次建议,仔细看看《Wnidows核心编程》,里边有你需要的全部东西。
yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-05-30 12:25
楼上的说话听起来不太爽啊,呵呵。
没关系,想啥说啥吧,下面有一段话,不知道是不是真的
On Windows 98, the main Windows DLLs (Kernel32, AdvAPI32, User32, and GDI32) are protected in such a way that an application cannot overwrite their code pages. You can get around this by writing a virtual device driver (VxD).
yetty_forever
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-05-30 12:05
是用vxd做啊。并不是所有hook api的工作都能在应用层做的,比如98下hook kernel32.dll 和gdi32.dll中的api.
上面有两位给出了一些回答,我也不知道他们是针对应用层还是针对驱动的。


引用“.......98下hook kernel32.dll 和gdi32.dll中的api......”

谁说98下不能Hook???到www.csdn.net的VC版去问吧,答案可以把你压扁。:D

这个论坛是不会有人回复这种问题di。
yetty
驱动牛犊
驱动牛犊
  • 注册日期2004-01-10
  • 最后登录2009-07-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-05-30 11:55
是用vxd做啊。并不是所有hook api的工作都能在应用层做的,比如98下hook kernel32.dll 和gdi32.dll中的api.
上面有两位给出了一些回答,我也不知道他们是针对应用层还是针对驱动的。
yetty_forever
上一页
游客

返回顶部