-
-
为delphi程序添加功能按钮
-
发表于:
2004-6-15 21:15
11732
-
为delphi程序添加功能按钮
我们知道,delphi程序是将控件的属性放入RCDATA区,但将执行控件事件的事件指针及具体代码置入.code段,两者分离。
存放控件属性的二进制代码位于程序的后段,.code段位于程序中段;所以添加控件属性不会有影响,但如果要加入控件对应事件指针,因为其位于程序中段,可能导致程序的运行错误。目前上无文章阐述此问题的解决。
target.exe是delphi5写的一个程序,上面有2个按钮,并具备执行相应事件。我将尝试再加入一个按钮Button3,并能执行Button2Click的同样功能。
1.添加按钮属性
exescope打开target.exe,在Resource的RCDATA下TForm1见到控件属性
......
object Button2: TButton
Left = 208
Top = 32
Width = 105
Height = 25
Caption = 'Button2'
TabOrder = 1
OnClick = Button2Click
end
我们在后面复制Button2控件属性,并做适当修改后保存为Button3。
object S: TButton
Left = 40
Top = 72
Width = 105
Height = 25
Caption = 'Button3'
TabOrder = 2
OnClick = T
end
2.添加button3事件指针
用hex workshop打开修改后的target.exe程序,搜索Button2Click,见到如下代码
以上是delphi控件事件指针表,可以由以下结构表述:
Type TControlProcedurePtr = packed record
PtrCount : Word;
Ptr1 : TPtr;
Ptr2 : TPtr;
......
PtrN : TPtr; // n = PtrCount
FrmName : PChar;
end;
type TPtr = packed record
TPtrLen : Word;
Ptr : Dword;
PtrName : PChar;
end;
添加事件指针,最重要的就是计算清楚:如何通过缩小原有Tptr结构的长度,使得加入新指针TPtr结构后整个TControlProcedurePtr长度仍旧保持不变。
通过上述结构,我们知道TPtr结构最短长度为8字节。这里Button3.Name:='S',所以需要在前面Button1、Button2事件指针列表中挖出8个字节。我选择将
OnClick = Button1Click 改为 OnClick = Button1C
OnClick = Button2Click 改为 OnClick = Button2C
添加OnClick = T
附件中原程序target.exe,修改后程序为target-p.exe
点击下载:附件!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)