LOADING

加载过慢请开启缓存 浏览器默认开启

xdbg手工脱壳学习

对一个程序壳的理解

一个程序被加壳,在我的理解下就是一个程序的代码被加密,从而使ida等反编译工具不能识别为代码数据,然后再在程序前嵌入一块代码,在程序运行时会先进行解密然后再运行。既然如此,我们就可以在运行时解密完程序就把程序提取出来。

下面的程序中,这是我们一开始的点,程序从这里开始。对于一个加了壳的程序而言,它必须先运行解密代码,这段解密代码一般会被xdbg识别为Enterpoint(主入口),而一个函数的执行必须先压入栈,结束时又要弹出栈,且先入栈的最后弹出,那么在第一个被压入的栈被弹出时,也就意味着一个函数的结束,我们可以在第一个入栈时的栈顶RSP下断点,那么在出栈时就会断在函数结束的位置,从而走完解密程序我们只要把解密后的程序dump下来就行了。那么思路就清晰了,步骤就是

  • 寻找解密开始点
  • 在push上下硬件断点
  • 运行到pop的位置(解密结束的位置)
  • 找jmp到主程序的点
  • 在jmp处断点,用scylla进行dump

具体步骤

找到程序的入口,运行一步push,在RSP处下硬件断点

运行后停在这个位置,上面有一堆pop,我们执行到下面jmp的位置,然后用scylla,dump程序

dump程序,要获取一下ITA,然后转储。

脱壳成功