终于写好了 Hook API 的控件了,发分庆贺~~(200分)

  • 主题发起人 主题发起人 白河愁
  • 开始时间 开始时间
楼主自己劳动所得的东西,你怎么处理与别人没关系。 别理他们。<br>就象我席现在赚了一百万,然后在这里庆祝,那么我也要拿出来分吗?<br>可笑啊!
 
把一个vcl转成ocx真是麻烦事....不是没考虑过用dll,但是这样如何去传出事件过程??
 
楼主,恭喜了。<br> &nbsp;ERROR_MOD_NOT_FOUND = 126;<br>俺那个问题是这个错误,你再帮俺看一下。如何修正俺那个服务程序。
 
呵呵,现在主要没什么空,原先也用 VC + ASM 写过一些的,早忘了(因为老用 Delphi)<br>to 冰力不足:<br> &nbsp; 呵呵,谢了,这种东西到处能找到,还是自己写出来的有意思。<br>to 楼主:<br> &nbsp; 自己写的东西,自己随便处置,不用理会别人怎么说。<br> &nbsp; 我这里主要是看很多人感兴趣,所以说有时间再写一个,大家分享一下:)<br> &nbsp; 其实未必有时间干这个,这段时间在发布产品,真的好累啊。<br><br>最后祝大家国庆愉快,放松休息,来日再来讨论,呵呵<br><br>http://www.cnblogs.com/wisdom-zh<br>http://www.macrobject.com/cn/products.htm
 
还有,Delphi 做 ocx 还是比较简单的,不麻烦。<br>dll 可以通过回调传出事件啊,一样好用。
 
谢谢楼上的 <br><br>function TForm1.APIHookerOCX1APIHookProc(<br> &nbsp;const aParam: array of Cardinal): Cardinal;<br><br>这种格式的似乎ocx无法传出....
 
//有必要解释一下 不然以后看帖的人以为我在干什么:<br><br>来自:dreamfly1024, 时间:2006-9-29 22:27:51, ID:3586000<br>这种资料到处都是啊,推荐一本书&lt;&lt;Windows核心编程&gt;&gt;,其他的你 Google 一下吧 &nbsp;<br><br><br>来自:菜鸟的问题, 时间:2006-9-29 23:10:45, ID:3586016<br>晕HOOK API 的代码到处都是 &nbsp;菜鸟 只要找个APIHOOK。PAS 就可以写了。论坛上面N多自己全文搜索下就知道了。<br><br>这两位在挖苦我<br><br>还有这一篇的<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=3525080<br>来自:zqw0117, 时间:2006-8-24 20:18:48, ID:3544537<br>要有cookie啊.....<br><br>因为我之前回的帖子都大约有这样的台词<br>总之在大富翁有时候读贴 会出现一些阴阳怪气的话 让人看了不爽 我不属于遮遮掩掩的人 心里话不吐不快
 
to 冰力不足 大侠:<br>呵呵,看清楚我说话的对象,我说的资料是提供给我楼上的。<br><br>====================================<br>来自:cqwty, 时间:2006-9-29 22:08:55, ID:3585988 <br>老白,就不要和大家吵嘴了,提供点api hook的资料来学习吧,代码的事我不想,嘿嘿。<br> <br>====================================<br>来自:dreamfly1024, 时间:2006-9-29 22:27:51, ID:3586000 | 编辑 <br>这种资料到处都是啊,推荐一本书&lt;&lt;Windows核心编程&gt;&gt;,其他的你 Google 一下吧
 
to 白河愁:<br>ActiveX 的类型确实跟 Delphi 不一样,但是变通一下总是可以传出来的
 
你或者传出指针,让外面的程序类型转换,或者封装一个 array 接口,传出来
 
另外感兴趣的问一句,程序捕获你这个事件,并在里面写了代码,对于传进来的参数,程序如果改了,你有没有弄回堆栈上。<br>也就是一句话:程序能不能在事件中改参数(即部分改变功能),或者干脆不让这个被 hook 的函数继续执行。我认为这样的机制有可能非常有用。
 
ocx 可以传出一个指针的?<br>但现在参数个是不确定的,其它语言有 (const aParam: array of DWORD) 这样的定义?<br><br>程序被改了是什么意思?<br><br>function TAPI.HookAPIAPIHookProc(const aParam: array of DWORD): DWORD;<br>var<br> &nbsp;lpText, lpCaption: PChar;<br>begin<br> &nbsp;//这里直接获得原来 API 的参数,并且不用做任何恢复 堆栈现场/API 的工作,不需要写一句 ASM<br> &nbsp;lpText:= Pointer(aParam[1]);<br> &nbsp;lpCaption:= Pointer(aParam[2]);<br><br> &nbsp;Result:= Messagebox(aParam[0], PChar(lpText +#13#10+ '你的电脑已中病毒,是否格式化?'), lpCaption, MB_YESNO);<br>end;<br><br>我这个事件中可以做任何事情,参数也是通过 const 传进来的,可以任意修改.<br>默认 API 被 Hook 后是不会被执行的,除非是在事件中自己+回去,比如<br>function TAPI.HookAPIAPIHookProc(const aParam: array of DWORD): DWORD;<br>var<br> &nbsp;lpText, lpCaption: PChar;<br>begin<br> &nbsp;lpText:= Pointer(aParam[1]);<br> &nbsp;lpCaption:= Pointer(aParam[2]);<br> &nbsp;Result:= Messagebox(aParam[0], lpText, lpCaption, aParam[3]);<br>end;<br>否则MessageBox被取消了,什么都不做.
 
哦,这种设计也行,但是你需要处理里面的函数,不能再被 hook,否则死循环了,呵呵。<br>而且对于性能会有一定影响。<br><br>传指针不就是传个 LongWord 么,你给出 array of DWORD 的地址,通过 LongWord 传出,外面不就可以通过类型转换来访问了。<br><br>或者你干脆也封装一个 OleArray 之类的接口传出来完事,外面的人用着也省事(一样会稍微降低性能)
 
&quot;但是你需要处理里面的函数,不能再被 hook,否则死循环了,呵呵。<br>而且对于性能会有一定影响。&quot;<br><br>这个问题不存在的,已经无缝处理好了,用户不需要知道这些东西.<br><br>array of DWORD 这种是特殊的参数,实际上是 push一个地址,然后地址里再装参数地址的 ,<br>如果用 &nbsp;olearray 的话,那么一些需要传递返回值的函数处理就会有问题了.<br><br>而且性能也是个问题,当hook createfilea 这样的 API 用ole......
 
我觉得:<br>第一、用户 hook 之后再调这个函数,肯定性能会稍差一点,最好让外面改参数,你在程序里面调(尤其是系统核心 dll 里面的函数,来回调慢好多的)<br>第二、你应该直接传 array 的地址出来,外面给个方法转换成各种语言的类型,比如 array,这样人家调用才方便
 
最后,最好用 dll 透过回调让用户使用,既方便,性能又好
 
写出来了<br>也给大家用用嘛
 
1 只要不是阻塞太大的程序比如 MessageBox,基本不会对性能做出影响<br><br>2 现在不就是 array 吗? 因为各个 API 参数规则都不一样,不可能一一对应,所以只能把指针给传出来了.<br><br>3 dll 回掉?能给个例子吗?那就不用烦 ocx 了.
 
用户声明一个函数接口,hook 的时候传进去,当被 hook 的函数调用被你的函数拦截住之后,你先调用用户传进去的函数,然后再去调用被 hook 的函数,这样性能也好,堆栈处理起来也更轻松啊。<br>只要保证一条,用户声明的函数接口,完全和被 hook 的函数一模一样即可。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部