对一个程序壳的理解
一个程序被加壳,在我的理解下就是一个程序的代码被加密,从而使ida等反编译工具不能识别为代码数据,然后再在程序前嵌入一块代码,在程序运行时会先进行解密然后再运行。既然如此,我们就可以在运行时解密完程序就把程序提取出来。
下面的程序中,这是我们一开始的点,程序从这里开始。对于一个加了壳的程序而言,它必须先运行解密代码,这段解密代码一般会被xdbg识别为Enterpoint(主入口),而一个函数的执行必须先压入栈,结束时又要弹出栈,且先入栈的最后弹出,那么在第一个被压入的栈被弹出时,也就意味着一个函数的结束,我们可以在第一个入栈时的栈顶RSP下断点,那么在出栈时就会断在函数结束的位置,从而走完解密程序我们只要把解密后的程序dump下来就行了。那么思路就清晰了,步骤就是
- 寻找解密开始点
- 在push上下硬件断点
- 运行到pop的位置(解密结束的位置)
- 找jmp到主程序的点
- 在jmp处断点,用scylla进行dump
具体步骤
找到程序的入口,运行一步push,在RSP处下硬件断点
运行后停在这个位置,上面有一堆pop,我们执行到下面jmp的位置,然后用scylla,dump程序
dump程序,要获取一下ITA,然后转储。
脱壳成功