Shark 恒在他的这节课上讲的是汇编,教大家用 OD 折腾关键跳。
要说对应的话其实我应该写 IL 代码的,因为好多 .Net 的教程都认为 IL 是 .Net 逆向的基础。
但我想了想,dnSpy 还有很多技巧没教给大家,直接上手 IL 是不是太难了?
毕竟我和 Shark 恒在基础课程上的想法是一致的,在我的课上,不会让你感到有那么枯燥就能学到知识。
所以从这节课开始我基本要脱离 Shark 恒的文案来写教程了,但愿我能写出很优秀的文案。
以下进入正题。
今天要学的内容,是"调用堆栈",首先介绍下什么是"调用堆栈"
假设我们有几个函数,分别是 function1 , function2 , function3 , funtion4 ,且 function1 调用 function2 , function2 调用 function3 , function3 调用 function4。在 function4 运行过程中,我们可以从线程当前堆栈中了解到调用他的那几个函数分别是谁。把函数的顺序关系看,function4、function3、function2、function1呈现出一种"堆栈"的特征,最后被调用的函数出现在最上方。因此称呼这种关系为调用堆栈。
简单的来说,我们能从调用堆栈里找出函数的执行过程。
下面我们结合一个小程序具体看看怎么用:
介绍一下软件,这个软件启动后 3 秒会自动关闭。
为了让零基础人群更容易掌握,于是我在关闭的时候加入了一个弹窗提示,如图。
将软件拖入 dnSpy,按 F5 跑起来
等弹窗出现以后,中断它。
然后你可以在调用堆栈选项卡里看到这个弹窗的来源,如果你没有调用堆栈选项卡,你可以在调试 -> 窗口 -> 调用堆栈里找到它。
在我框起来的上下,均有一些带 System 、 Windows 的 dll 调用,这些都是系统的 dll,自然不是我们要找的目标,因此我可以快速的找到框起来的这一行是我要找的目标。双击它进行跳转。
如图,dnSpy 定位到了弹窗的来源。
阅读一下,发现这里定义了,当窗口关闭时,弹出信息框。
那么问题来了,谁导致窗口关闭的?
那么我们继续看堆栈。
第一处我们已经看过了,接下来我们看 Timer 事件,双击跟进。
看到这里有个Timer,结束了进程。
那么右键,编辑方法,注释掉它即可。
把程序保存一下看看,这下是不是不会再自动退出啦?
通过这一节课,我们学习到了调用堆栈的基础用法,这对我们今后爆破软件和分析执行流程提供了很大的帮助。
本章课件第六课:https://www.lanzous.com/i3qo5ra
感谢本文作者:慕若曦