delphi – 如何将方法作为回调传递给Windows API调用(后续)?

delphi – 如何将方法作为回调传递给Windows API调用(后续)?,第1张

概述这篇文章是 Ran发布的相关 question的后续跟踪. accepted answer坚持使用通常的普通旧功能. 这段摘录特别引起了我的注意: An instance method has an extra, implicit, parameter containing the instance reference, i.e. Self. 有坚定的信念,应该有一种方法来使用一种“参数”适配器( 这篇文章是 Ran发布的相关 question的后续跟踪.

accepted answer坚持使用通常的普通旧功能.

这段摘录特别引起了我的注意:

An instance method has an extra,implicit,parameter containing the
instance reference,i.e. Self.

有坚定的信念,应该有一种方法来使用一种“参数”适配器(重新措辞摆脱不必要的自我隐式引用,并提供指向适应的适应回调函数的指针),我最终找到这个名为Callback的article一个班级到Peter Morris.

总而言之,他使用thunking技术作为适应技巧. (免责声明:我从未测试过代码).

我知道它不是一个非常干净的解决方案,但它允许OO设计具有所有所谓的好处.

我的问题:

知道TCallbackThunk是基于回调函数签名的,如果像Peter Morris那样做的话,上面提到的帖子的答案是什么呢?

.

解决方法 由于Enumwindows(引用问题中的函数)提供了数据参数,因此您不需要完成所有工作.你可以在那里放置你想要的任何值,例如答案中展示的对象参考. Morris的技术更适合不提供任何通用数据参数的回调函数.

要调整使用Morris代码的答案,首先需要确保回调方法的签名与API的回调函数的签名相匹配.因为我们正在调用Enumwindows,所以我们需要一个返回Bool的双参数函数.调用约定需要是stdcall(因为Morris的代码假定它,并且很难破坏任何其他调用约定).

function TautoClickOKThread.cbEnumwindowsClickOK(  Wnd: HWnd; Param: LParam): Bool; stdcall;begin  // ...end;

接下来,我们设置TCallbackThunk数据结构,其中包含所有机器代码和参考预期回调方法的跳转偏移.

但是,我们不使用Morris描述的方式.他的代码将数据结构放在堆栈上.这意味着我们将可执行代码放在堆栈上.现代处理器和 *** 作系统不再允许这样 – *** 作系统将停止您的程序.我们可以通过调用VirtualProtect来修改当前堆栈页面的权限,允许它被执行,但这使整个页面可执行,我们不想让程序保持打开以进行攻击.相反,我们将为thunk记录分配一块内存,与堆栈分开.

procedure TautoClickOKThread.Execute;var  Callback: PCallbackThunk;begin  Callback := VirtualAlloc(nil,SizeOf(Callback^),Mem_Commit,Page_Execute_ReaDWrite);  try    Callback.POPEDX := A;    Callback.MOVEAX := $B8;    Callback.SelfPtr := Self;    Callback.PUSHEAX := ;    Callback.PUSHEDX := ;    Callback.JMP := $E9;    Callback.JmpOffset := Integer(@TautoClickOKThread.cbEnumwindowsClickOK)      - Integer(@Callback.JMP) - 5;    Enumwindows(Callback,0);  finally    VirtualFree(Callback);  end;end;

请注意,那些是该记录中的32位x86指令.我不知道相应的x86_64指令是什么.

总结

以上是内存溢出为你收集整理的delphi – 如何将方法作为回调传递给Windows API调用(后续)?全部内容,希望文章能够帮你解决delphi – 如何将方法作为回调传递给Windows API调用(后续)?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237444.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存