簡體   English   中英

在Windows x64上使用RtlAddFunctionTable描述動態生成的代碼

[英]Describing dynamically generated code with RtlAddFunctionTable on Windows x64

我的應用程序(用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

有沒有人設法讓它在自己的代碼中工作,並能指出我正確的方向? 謝謝!

事實證明,我自己的各種錯誤導致失敗。 我已經發現並修復了它們,現在正在解開它們。 特別是在某些情況下,當代碼被更改時, RtlDeleteFunctionTableRtlAddFunctionTable之前未被調用。 此外,重要的是不要在函數體中觸摸RSP :這是完全合理的,但在MSDN文檔中並沒有真正說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM