1、 汇编 2、 脱壳 1)5种常见的语言特征(也是判断是否到达OEP的一种方法) 2)附加数据的处理 3)自校验的处理 1) 如果是调用错误提示——F12堆栈调用法 2)如果是文件/数据损坏错误提示——2OD对比法(bp CreateFileA) 4) BC++程序的手动查找IAT 3、 破解 1>一般破解 目标:找按钮事件 方法:1)查找字符串法 2)F12堆栈调用法 3)MessageBoxA断点法 2>重启验证 目标:找验证类型 1)注册表类型 2)文件类型 1)ini文件类型 2)其他文件类型 方法:1)访问注册表类常用API
RegOpenKeyA 打开一个现有的注册表项
RegOpenKeyExA 打开一个现有的注册表项
RegCreateKeyA 在指定的项下创建或打开一个项
RegCreateKeyExA 在指定项下创建新项的更复杂的方式
RegDeleteKeyA 删除现有项下方一个指定的子项
RegDeleteValueA 删除指定项下方的一个值
RegQueryValueA 获取一个项的设置值
RegQueryValueExA 获取一个项的设置值
RegSetValueA 设置指定项或子项的值
RegSetValueExA 设置指定项的值
RegCloseKey 关闭系统注册表中的一个项(或键) 2)访问文件类常用API
CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台
OpenFile 这个函数能执行大量不同的文件操作
ReadFile 从文件中读出数据
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调 3)INI文件API GetPrivateProfileStringA 获取ini文件信息(读取、写入) 对于重启验证类型的软件有这样的一个思路:试运行程序,输入假码,先在程序安装目录找,看是否有可疑文件可以写入,再可以通过直接查找注册表(regedit),或者是用OD查找字符串查找有无可疑信息,当然这个需要直觉,更确切的说是需要经验。 但是,请记住:有怀疑才有进步! 3>不脱壳破解 1) 先到达OEP,即可查找字符串 2) 直接使用F12调用堆栈 注意:带壳调试的时候,当找到相关按钮事件之后,最好是下硬件执行断点!因为如果我们下bp普通断点,当我们重新载入程序之后,bp断点可能失效 4>patch 1) 借助相关带壳patch工具 2) 手动patch 1) 尽量以改动最少字节来达到破解的目的 2) 找到注入代码的地方 1))SFX区段 2))如果在要跳向OEP的地方有空闲空间可以使用则此处为首选,例如UPX Mov byte ptr ds:[xxxxxxxx],xx Mov dword ptr ds:[xxxxxxxx],xxxxxxxx 破解要使用到的相关辅助工具 1、 DEDE(Delphi/BC++) 2、 PE Explorer(Delphi/BC++) 3、 VBExplorer(VB) 4、 KeyMake |