zoukankan      html  css  js  c++  java
  • 栈回溯——获取当前线程内ebp与call_ret

    开发环境:VS2019(Debug x86)

    功能:获取当前线程内ebp与函数返回值

    结果:

     代码示例:

     1 #include <iostream>
     2 #include <list>
     3 using namespace std;
     4 
     5 typedef struct
     6 {
     7     void* prev_ebp;
     8     void* call_ret;
     9 } context;
    10 
    11 __declspec(naked) void* get_ebp(void)
    12 {
    13     __asm
    14     {
    15         mov eax, ebp
    16         ret
    17     }
    18 }
    19 typedef list<context> pcontext;
    20 list<context>::iterator itor;
    21 pcontext get_context()
    22 {
    23     pcontext pstack;
    24     context tmpstack;26     tmpstack.prev_ebp = get_ebp();
    27     tmpstack.call_ret = *(void**)((char*)tmpstack.prev_ebp + 4);
    28     pstack.push_back(tmpstack);
    29     while (tmpstack.call_ret != 0)
    30     {
    31         tmpstack.prev_ebp = *(void**)(tmpstack.prev_ebp);
    32         tmpstack.call_ret = *(void**)((char*)tmpstack.prev_ebp + 4);
    33         pstack.push_back(tmpstack);
    34     }
    35     return pstack;
    36 }
    37 
    38 int main(int argc, char* argv[])
    39 {
    40     pcontext tmppcontext;
    41     tmppcontext = get_context();
    42     for (itor = tmppcontext.begin(); itor != tmppcontext.end(); itor++)
    43     {
    44         cout << "ebp: " << (*itor).prev_ebp << "	ret =" << (*itor).call_ret << endl;
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    K
    士兵队列训练问题
    分析A + B Problem II
    C++中sort()的用法
    swing初级应用创建一个窗体
    java生成随机数
    JAVA数字格式化
    CodeForces
    POJ
    51Nod
  • 原文地址:https://www.cnblogs.com/qinghuan190319/p/15378357.html
Copyright © 2011-2022 走看看