法则特性

规律特性
方法一:工具脱壳
方法二:跨段指令寻找OEP 
用Ollydbg来调试脱壳 ,运行Ollydbg点击菜单“Options/Debugging options”,选择Events项,将第一次暂停设在WinMain函数上。
相关代码: 
006E0440 $ 60       pushad     //一开始Ollydbg就会中断这行,这个就是外壳的入口点。注意这个pushad指令,绝大多数加壳程序在被加密的程序中加上一个或多个段,所以依据跨段的转移指令(JMP)就可找到真正的入口点,此时就会有POPAD/POPFD 指令出现,UPX 用了一次跨段的转移指令(JMP),在跳到OEP处会看到虚拟地址的值有一个突变,此时就能确定OEP了。
方法三:编译语言特点找OEP 
各类语言编译的文件入口点都有一些规律,可以这利用这点来寻找入口点。
1)Delphi程序  执行程序,用LordPE(或Prodump)选dump(full)脱壳,存为dump.exe。接着用Hex Workshop打开 dump.exe,搜索文本“runtime”,搜到后,向前查找离“runtime”最近的十六进制数字“55 8B EC”,数字所在的地址就是程序的OEP。 
2)Visual C程序  可以利用Visual C启动部分几个函数GetCommandLineA(W)、GetVersion、GetModuleHandleA(W)、GetStartupInfoA(W) 等来定位程序的OEP。 
常见的各类编译语言的入口汇编代码都要熟悉,因为一些加密强壳会偷OEP处的代码到壳里,一般情况各编译语言入口代码都相同,到时只需要直接引用相关程序的入口代码,这给我们恢复代码带来方便。

反调试技术
检测内核模式调试器 
利用NT的ZwQuerySystemInformation()或NtQuerySystemInformation()检测内核模式调试器。  检测用户模式调试器 
利用NT的ZwQueryInformationProcess()或NtQueryInformationProcess()检测使用Win32 Debug API的用户模式调试器。
检测API断点 
对于比较关键的API,可以检测其是否被设置了断点,即检查该API的入口的第一个字节是否为Int 3指令。