尽管指令被调出,但仍可跟踪调用堆栈

逆向工程 视窗 调用栈
2021-06-12 13:08:04

REing一个二进制文件,在它运行时(顺便使用Windbg)我的(调用)堆栈被破坏了。所以我开始执行堆栈跟踪 [ https://msdn.microsoft.com/en-us/library/windows/hardware/ff552143(v=vs.85).aspx]

然而,当我验证目标中的各种符号/函数时,各种指令被分页,所以我无法判断前一条指令是 ret 还是上面的调用,例如

kd> u fe682ae4-2 l1      //  paged out (all zeroes) unknown
rdr!_RdrSectionInfo+0x2a:
fe682ae2 0000             add     [eax],al

我知道如何通过 !vad 扩展重新加载符号 [ https://msdn.microsoft.com/en-us/library/windows/hardware/ff552153(v=vs.85).aspx]但是,这需要我使用(实时)kd。

除了禁用页面文件之外,是否有更简单的方法来确保目标应用程序不会被调出?

我搜索过 Google、OSRonline、Woodmann 等,但没有找到任何有用的信息。

1个回答
  1. 显示的提示是kd>为了让您调试实时内核。
  2. 如果内存无法访问,windbg 会显示?不是,0000
    也许您的地址中实际上有 0000。

你试过.pagein吗?

您是否尝试查看物理地址!vtop 0 <virtualaddress>

这是无法访问的内存示例:

.fnent notepad!
SaveFile (01004eae) notepad!SaveFile | (01005179) notepad!LoadFile   
OffStart: 00004eae    
ProcSize: 0x2c6 kd>     
? 4eae+140+notepad = 01004fee     
kd> db notepad!SaveFile+0x140 l20    
01004fee a0 90 00 01 ff 35 54 90-00 01 ff 75 08 e8 70 cf .....5T....u..p.    
01004ffe ff ff ?? ?? ?? ?? ?? ??-?? ?? ?? ?? ?? ?? ?? ?? ..?????????????? 

请注意问号,????因为边界处的下一页1005000无法访问。

kd> .pagein /p 8114bc38 1005000 
You need to continue execution (press 'g' <enter>) for the pagein to be brought in.      
When the debugger breaks in again, the page will be present.
kd> g
Break instruction exception - code 80000003 (first chance)
nt!RtlpBreakWithStatusInstruction:
804e35a2 cc              int     3
kd> db 1004ff0 
01004ff0  00 01 ff 35 54 90 00 01-ff 75 08 e8 70 cf ff ff  ...5T....u..p...
01005000  83 f8 02 0f 84 a9 00 00-00 33 ff 53 ff 75 10 57  .........3.S.u.W
01005010  ff 75 f8 ff 35 80 a4 00-01 e8 7b fb ff ff eb 78  .u..5.....{....x