不是TObject,是self,触发事件的object实例。 获取这个实例也不复杂,既然“DELPHI程序按钮的响应函数用DeDe工具很容易定位到”,那把exe中该事件处理函数的第一字节改成0xcc(int 3),然后用调试器加载此exe,运行,点那个按钮,会断点在事件处理函数,此时的eax就是self。
动态创建并不代表在内存中的地址不固定,只要创建时机是确定的,比如程序启动时按顺序自动创建的组件,而不是在运行时随机创建,那么创建的对象实例的存地址就是固定的(相对于image base)。我写了个小程序测试了一下,空form上面放一个toolbar,toolbar上new出个button,双击button添加点击事件,在里面写上:asm int 3 end; 编译生成exe,用调试器加载运行,点按钮进入断点,就我的测试,每次运行产生的对象实例(eax)都是一样的。 至于你测试的结果“这个EAX值是变的”,我估计要么是你断点的位置不对,要么这个toolbar是位于某个动态创建的form上,而不是自动创建的form上。
试了一下,这个EAX值是变的,程序关闭重启是变的。DELPHI应该是动态创建BUTTON,每个BUTTON没有固定的CTRLID,这点跟VC写的程序也不一样,VC程序每个控件有唯一的CTRLID. 如果是动态创建实例,那地址肯定是不一样的,这个跟EXE加载的IMAGE BASE还是有区别IMAGE BASE一般保证程序的SECTION加载到基于IMAGE BASE的一个固定地址。而动态NEW出来的实例,在内存中地址肯定是不同的。 引用 5 楼 DelphiGuy 的回复:传入的self是调用事件处理过程的对象实例,具体实现就是对象实例的内存地址(指针),理论上是可能每次程序运行都不同的,因为windows加载exe可以到不同的起始地址,而不必依照pe头的image base,但实际上不需要考虑,这种情况几乎不会出现。
传入的self是调用事件处理过程的对象实例,具体实现就是对象实例的内存地址(指针),理论上是可能每次程序运行都不同的,因为windows加载exe可以到不同的起始地址,而不必依照pe头的image base,但实际上不需要考虑,这种情况几乎不会出现。
两种方式: 1、找到该EXE文件执行后,事件在内存的地址。直接从该地址处运行。 2、编程做个程序: (1)鼠标移到该位置 (2)模拟鼠标点击事件。 具体代码 ,自己做吧。
1,183
社区成员
22,328
社区内容
加载中
试试用AI创作助手写篇文章吧