反汇编与栈回溯

利用反汇编手段解析C语言函数
https://blog.csdn.net/songjinshi/article/details/8450419?depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1&utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-1

vc++ 中开发汇编语言
https://www.21ic.com/tougao/article/7569.html
https://www.cnblogs.com/rixiang/p/5589301.html

C/C++函数调用过程分析
https://blog.csdn.net/weixin_34092370/article/details/85508860

linux 下动态链接实现原理
https://www.cnblogs.com/catch/p/3857964.html?utm_source=tuicool&utm_medium=referral

拿到死机backtrace堆栈后如何确认死在哪一行源码(ARM+Android平台反汇编分析举例)
https://blog.csdn.net/bobbypollo/article/details/85526259

缓冲区溢出利用——捕获EIP的傻瓜式指南
https://www.cnblogs.com/r00tgrok/archive/2013/12/17/buffer-overflow-exploit-guide.html

栈的缓冲区溢出详解
https://www.jianshu.com/p/bb081628a083

LINUX SYSTEM CALL TABLE FOR X86 64
http://blog.rchapman.org/posts/Linux_System_Call_Table_for_x86_64/


ARM Linux BackTrace
https://blog.csdn.net/geniuszm2/article/details/52016102

arm平台的调用栈回溯(backtrace)
https://blog.csdn.net/weixin_30270561/article/details/94854486

ARM Linux 手写实现栈回溯
https://blog.csdn.net/Chasing_Chasing/article/details/87161427

Stack backtrace
https://blog.csdn.net/linglongqiongge/article/details/48547981

堆栈被破坏 gdb 无法回溯调用栈 怎么办?
https://blog.csdn.net/weixin_41041321/article/details/78612398
此处以arm 为例 

User Stack: (0xa5a32d38 to 0xa5a32d38   + 栈大小)
sp 指针就是  0xa5a32d38   
线程堆栈大小一般是固定的  pmap -x  pid    
be6b5000     132      16      16       0  rwxp  [stack]

gdb 
dump memory   所存文件地址   UserStack起始地址   结束地址地址 
info proc mapping  得到指令地址配置区段
因为dump 出来的 栈帧memory 里有程序执行的指令
可以写个小程序把 落在 pid mapping 区间的  指令找出来.  (后面会分享)
arm-linux-gnueabihf-addr2line   再把对应的函数找出来辅助分析 .
当然也有把整个 User Stack 都写坏的情况, 只能再根据task name 和 pmap 表 再重新找线索了.
————————————————————————————————————————————————————————————————————————————————————————————————

so文件反汇编反编译到C源码    ---- IDA PRO软件下载
https://blog.csdn.net/qq_34060722/article/details/77992862

IDA PRO 静态反汇编与OllyDbg动态调试实战技巧汇总
https://blog.51cto.com/shayi1983/1613615


反汇编linux动态库
https://blog.csdn.net/weixin_34192732/article/details/94704627

Linux 调试技巧
 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 以下是 VxWorks 中获取回溯信息的源码示例: ```c void stackTraceTaskPrint (int tid) { REG_SET regSet; WIND_TCB *pTcb = taskIdVerify (tid); if (pTcb == NULL) return; if (taskRegsGet (tid, &regSet) != OK) return; printf ("Stack trace for task %#x (%s):\n", (int) pTcb, pTcb->name); stackTracePrint ((char *) pTcb->name, tid, (char *) regSet.spReg, (char *) regSet.pc); } ``` 此函数获取给定任务 ID 的任务控制块,并通过 taskRegsGet 函数获取该任务的寄存器值,然后调用 stackTracePrint 函数打印该任务的回溯信息。 ```c void stackTracePrint (char *name, int tid, char *sp, char *pc) { int count; char **list; list = (char **) malloc (MAX_TRACE_DEPTH * sizeof (char *)); if (list == NULL) return; count = stackTrace (tid, sp, pc, list, MAX_TRACE_DEPTH); printf ("Stack trace for task %#x (%s):\n", tid, name); stackTraceDepthPrint (list, count); free (list); } ``` 此函数分配堆内存以存储回溯信息,并调用 stackTrace 函数获取回溯信息。然后它将回溯信息作为参数传递给 stackTraceDepthPrint 函数,以打印回溯信息。 ```c int stackTrace (int tid, char *sp, char *pc, char **pList, int maxDepth) { int i = 0; int depth = 0; FUNCPTR funcPtr; char *nextPc; char **list = pList; while (i < maxDepth) { if (taskIdVerify (tid) == NULL) break; if (i == 0) { if (pc == 0) break; funcPtr = (FUNCPTR) pc; } else { if (nextPc == 0) break; funcPtr = (FUNCPTR) (nextPc - CALL_INSTR_SIZE); } if (funcPtr == NULL) break; *list++ = (char *) funcPtr; depth++; i++; if (taskRegsStackProbe (tid, (char *) funcPtr, &nextPc) != OK) break; } return (depth); } ``` 此函数根据给定的任务 ID、堆栈指针和程序计数器获取回溯信息。它使用 taskRegsStackProbe 函数来确定每个函数调用的下一个程序计数器值,并将每个函数的地址存储在列表中。如果达到最大深度或无法确定下一个程序计数器,则停止回溯。 ```c void stackTraceDepthPrint (char **list, int depth) { int i; for (i = 0; i < depth; i++) printf ("%s\n", symFindByValue ((int) list[i], N_TEXT, (char **) NULL, (char **) NULL)); } ``` 此函数用于打印回溯列表中的每个函数地址对应的符号名称。它使用 symFindByValue 函数查找每个地址对应的符号名称,并将其打印到控制台上。 ### 回答2: vxWorks是一款实时操作系统,它的回溯功能可以帮助开发人员定位程序的异常或错误。回溯是指在程序发生异常或错误时,通过分析程序运行时的调用来定位出错的源码位置。 在vxWorks中,回溯功能是通过函数backtrace()实现的。backtrace()函数会返回当前函数调用的信息,包括每个函数的返回地址和参数值。使用该函数可以获取当前的信息,然后通过解析信息,可以找到调用中每个函数的源码位置。 具体的回溯源码如下: 1. 定义一个结构体存储函数调用信息: ```c #define MAX_STACK_FRAMES 50 typedef struct { void *returnAddr; void *args[MAX_ARGS]; } StackFrame; ``` 2. 定义回溯函数backtrace(),该函数会获取当前函数调用信息: ```c void backtrace(StackFrame *frames, int maxFrames) { int frameCount = 0; // 使用汇编指令获取帧信息 // 将返回地址和参数值存储到StackFrame结构体中 while (frameCount < maxFrames && frameCount < MAX_STACK_FRAMES) { frames[frameCount].returnAddr = __builtin_return_address(frameCount); frameCount++; } } ``` 3. 在需要进行回溯的地方,调用backtrace()函数,并解析信息: ```c StackFrame frames[MAX_STACK_FRAMES]; backtrace(frames, MAX_STACK_FRAMES); for (int i = 0; i < MAX_STACK_FRAMES; i++) { void *returnAddr = frames[i].returnAddr; // 解析返回地址和参数值,找到对应的源码位置 // 打印出错函数、源码文件名和行号等信息 } ``` 通过以上的源码实现,我们可以获取程序运行时的调用信息,从而快速定位程序的异常或错误源码位置。这对于调试程序非常有帮助,可以提高开发效率。 ### 回答3: vxWorks是一个实时操作系统,它提供了回溯功能,可以帮助开发人员快速定位程序中的问题。 在vxWorks中,回溯源码的实现是基于任务控制块(Task Control Block, TCB)和堆栈溢出检测技术。 首先,每个任务在TCB中都有一个指向堆栈顶部的指针,通过这个指针可以访问任务的堆栈。当任务运行时,它的函数调用和局部变量会存储在堆栈中。当任务出现问题时,可以通过访问任务的堆栈来获取回溯信息。 在vxWorks中,堆栈溢出检测技术可以帮助检测任务是否发生了溢出。当任务的堆栈溢出时,会触发一个硬件中断。当这个中断发生时,系统会保存当前的寄存器状态,并调用回溯函数。 回溯函数是vxWorks中回溯功能的核心。它会逐级遍历任务的调用,获取每一级函数的返回地址和参数,并将这些信息打印输出。这样,开发人员就可以根据回溯信息来定位程序中的问题。 回溯函数的源码在vxWorks的源代码中可以找到,一般位于目录"vxworks\kernel\lib"中。回溯函数会使用汇编语言和C语言混合编程实现,通过访问任务的堆栈来获取回溯信息,然后将这些信息格式化输出。 总之,vxWorks提供了回溯源码,开发人员可以通过它来定位程序中的问题。回溯的实现依赖于任务的堆栈堆栈溢出检测技术,通过遍历任务的调用获取回溯信息,并将其打印输出。这样,开发人员就可以根据回溯信息来进行程序调试和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值