CpuDbg 发表于 2022-11-12 15:47:12

(Alt+K)调用堆栈窗口

在od1.x中 主窗口中有五个子窗口, 其中一个是堆栈窗口.
除了这个堆栈窗口外, 还有一个 调用堆栈窗口(Alt+K).
这两个窗口没有什么本质的区别,反正都是显示堆栈信息. 唯一不同的是 调用堆栈窗口的数据给人更直观的感觉. 能快速的查看所有调用层次顺序. 如下图:



调用堆栈可以通过 StackWalk64 这个函数来获取.

BOOL IMAGEAPI StackWalk64(
         DWORD                            MachineType,
         HANDLE                           hProcess,
         HANDLE                           hThread,
      LPSTACKFRAME64                   StackFrame,
      PVOID                            ContextRecord,
PREAD_PROCESS_MEMORY_ROUTINE64   ReadMemoryRoutine,
PFUNCTION_TABLE_ACCESS_ROUTINE64 FunctionTableAccessRoutine,
PGET_MODULE_BASE_ROUTINE64       GetModuleBaseRoutine,
PTRANSLATE_ADDRESS_ROUTINE64   TranslateAddress
);

其中第一个参数是指定被调试目标程序架构模式. 比如32位程序选择 IMAGE_FILE_MACHINE_I386 , 64位程序选择 IMAGE_FILE_MACHINE_AMD64.
这里需要注意的是第5个参数, 32位和64位程序,需要填入相应的线程context.

我在调试od1.x的时候, 给 StackWalk64下断点, 然后 按F12 ,再按 alt+k , 并没有中断下来.
我没细看, 估计有可能是用别的方法实现的, 也有可能是自己实现的调用堆栈.
我打算先用 StackWalk64实现, 先试一下效果, 效果如果不理想的话, 就再自己实现.

下面是 OllyDbg 1.x,   x32Dbg,YzDbg调用栈对比图:



让人感觉奇怪的是 od2.x 和 ollydbg x64 都没有 alt+k(调用堆栈) 窗口了. 不知道是不是自己没有找到. 还是真的给阉割掉了, 我感觉这个功能还是挺不错的.

od1.x的 F12中断, 实现应该还是有点问题的. 他中断后, 你按F7 或者 F8, 程序直接就运行起来了.

---------------------------
2022.11.13 更新

刚刚用 StackWalk64 实现了堆栈调用的效果. 如下图:



猛一看, 效果好像和 od1.x 差不多, 如果你仔细看,就会发现有不少问题.
其中 和 都是错的.StackWalk64 第四个参数是 STACKFRAME

typedef struct _tagSTACKFRAME {
ADDRESS AddrPC;
ADDRESS AddrReturn;
ADDRESS AddrFrame;
ADDRESS AddrStack;
PVOID   FuncTableEntry;
DWORD   Params;
BOOL    Far;
BOOL    Virtual;
DWORD   Reserved;
KDHELPKdHelp;
ADDRESS AddrBStore;
} STACKFRAME, *LPSTACKFRAME;

其中 AddrReturn 就是 对应的 , 实际测试的时候发现,AddrReturn 和堆栈窗口中的 Value不对应. 对应的数据都是错位的, 相差4字节.
另外 这个数据在 STACKFRAME 结构体中并没有发现. 这个 是 od1.x 中的 called from.
还有一个问题就是 编译64位的调试器,分析32位的程序, 调用 StackWalk64 就显示为空. 我将所有的参数全部改成32位的,也一样是获取不到.
只有编译32位的调试器,分析32位的程序,才能正常显示 .
既然如此, 这个 调用堆栈 还是只能自己实现了...

---------------------------
2022.11.14 更新
刚发现调用堆栈窗口,od1.x中的 和 x32dbg 的 数据是不一样的. 如下例子:


00401011    E8 08000000         CALL CrackM.0040101E
00401016    68 80000000         PUSH 80
0040101B    90                  NOP
0040101C    90                  NOP
0040101D    90                  NOP
0040101E    8D85 78FFFFFF       LEA EAX,DWORD PTR SS:


od1.x   的,此时的值是: 0x0040101E
x32dbg 的 , 此时的值是: 0x00401011

这两个看着功能差不多, 我最终还是选择了od1.x的 . 等后续,也有可能会把 加上.
---------------------------
to be continued...










页: [1]
查看完整版本: (Alt+K)调用堆栈窗口