在Windows x64上使用RtlAddFunctionTable描述动态生成的代码
发布时间:2020-12-14 01:41:08 所属栏目:Windows 来源:网络整理
导读:我的应用程序(用Delphi编写但并不重要)会动态地生成大量的代码(它包含一个内置的编译器).为了让 Windows x64上的异常正常工作,我需要通过RtlAddFunctionTable描述生成的函数.到目前为止,我已经将代码生成器更改为仅使用官方的prolog和epilog表单,并且通过设
我的应用程序(用Delphi编写但并不重要)会动态地生成大量的代码(它包含一个内置的编译器).为了让
Windows x64上的异常正常工作,我需要通过RtlAddFunctionTable描述生成的函数.到目前为止,我已经将代码生成器更改为仅使用官方的prolog和epilog表单,并且通过设置包含UNWIND_INFO等的RUNTIME_FUNCTION来编码它们.
然而,生成的代码中的(故意)访问冲突仍然导致应用程序立即终止,所以显然是错误的.使用windbg,我看到以下(其中0x4c5006f是异常地址): 0:000> .fnent 0x4c5006f Debugger function entry 00000000`05436910 for: BeginAddress = 00000000`00000000 EndAddress = 00000000`00000097 UnwindInfoAddress = 00000000`000000a0 但是,它不会打印下面的展开信息.我可以从一个记忆窗口看到它: 00000000`04c50000 53 56 57 55 41 54 41 55 41 56 41 57 48 83 ec 08 SVWUATAUAVAWH... 00000000`04c50010 49 89 ce 9b db e3 9b d9 3c 24 41 d9 ae e4 00 00 I.......<$A..... 00000000`04c50020 00 0f ae 5c 24 04 4c 89 f0 0f ae 90 e0 00 00 00 ...$.L......... 00000000`04c50030 4d 8b be 28 01 00 00 4c 89 fd 49 8b 4f 08 48 85 M..(...L..I.O.H. 00000000`04c50040 c9 0f 84 1d 00 00 00 83 69 f0 01 0f 8f 13 00 00 ........i....... 00000000`04c50050 00 48 89 ca 4c 89 f1 48 83 ec 20 e8 70 41 ba fb .H..L..H.. .pA.. 00000000`04c50060 48 83 c4 20 48 33 c9 49 89 4f 08 49 8b 4f 08 48 H.. H3.I.O.I.O.H 00000000`04c50070 3b 09 ba 03 00 00 00 89 51 08 0f ae 54 24 04 9b ;.......Q...T$.. 00000000`04c50080 db e2 9b d9 2c 24 48 83 c4 08 41 5f 41 5e 41 5d ....,$H...A_A^A] 00000000`04c50090 41 5c 5d 5f 5e 5b c3 90 90 90 90 90 90 90 90 90 A]_^[.......... 00000000`04c500a0 01 10 09 00 10 02 0c f0 0a e0 08 d0 06 c0 04 50 ...............P 00000000`04c500b0 03 70 02 60 01 30 00 00 00 00 00 00 00 00 00 00 在偏移量4c500a0,您将看到展开信息(01 10 09 00),然后显示与以下序言相对应的九个条目: push rbx push rsi push rdi push rbp push r12 push r13 push r14 push r15 sub rsp,$8 我以0x4c50000作为基地址传递给RtlAddFunctionTable.为什么Windbg不打印展开信息?我误解了偏移量是如何工作的? 与常规Delphi功能进行比较: 0:000> .fnent 0x79caa9 Debugger function entry 00000000`05436910 for: BeginAddress = 00000000`0039ca70 EndAddress = 00000000`0039caaf UnwindInfoAddress = 00000000`005304d8 Unwind info at 00000000`009304d8,a bytes version 1,flags 0,prolog 8,codes 3 frame reg 5,frame offs 0 00: offs 8,unwind op 3,op info 0 UWOP_SET_FPREG 01: offs 5,unwind op 2,op info 5 UWOP_ALLOC_SMALL 02: offs 1,unwind op 0,op info 5 UWOP_PUSH_NONVOL 有没有人设法让这个工作在自己的代码,可以指出我正确的方向?谢谢!
事实证明,我自己的各种错误导致失败.我已经发现并修复了它们,现在正在放卷正常.具体来说,在更改代码时,有一些情况下RtlDeleteFunctionTable在RtlAddFunctionTable之前没有被调用.同样重要的是不要在功能体中触摸RSP:这是完全有意义的,但在MSDN文档中没有明确说明.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Windows – 桌面上的绘图线在Win 7上非常慢
- tfs – 有没有办法cc:某人在Microsoft Team Foundation Se
- 在Windows中编写Git命令脚本
- windows-server-2008 – 如何使用PowerShell脚本来更改SQL
- windows-phone-7 – 我可以通过点击Toast通知来判断用户是否
- windows-server-2012-r2 – 如何在HyperV主机上创建的虚拟网
- remote-desktop – 远程桌面事件ID 20499.没有明显的问题
- windows – 如何在DOS中进行字符串比较条件?
- windows-server-2012 – Windows Server 2012群集的动态仲裁
- windows-xp – 为什么Windows(文件)资源管理器尝试连接到端
推荐文章
站长推荐
- windows-firewall – 由Windows防火墙阻止的Team
- .net – 在WPF中,如何从包含ListBox的DataTempla
- 软件将Windows通知事件日志发送到linux syslog服
- windows-server-2008 – 在Windows Server 2008
- 窗口 – ASLR是否意味着重新设计dll不是必需的?
- Windows的http嗅探器
- 那些好用的阅读软件(Windows & Android)
- windows-server-2008-r2 – 如何在没有Jumbo数据
- winapi – 如何在Windows上检测已安装的Sun/Orac
- windows-server-2008 – Ram建议与SQL DB大小
热点阅读