打开测试软件
未注册版本提示如下
在od上打开该程序
选择未注册部分作为切入点,搜索字符串到达相应语句
观察jnz跳过的代码段
推测jnz为关键跳转,跳转成立则代表已注册,将jnz标志位改动测试
则证明jnz是关键跳转,jnz上方的call语句则为判断是否注册的函数
观察到上方有test al的值,test语句修改标志位,故test语句上一个call语句为判断是否注册函数
进入call函数即进入第二层判断
在第一层中初步确定eax返回的al是决定程序是否确认的关键点并确认了一个call语句内的函数为重点研究的对象
发现下方有三个call语句,其中前两个后跟有test al语句
现先对第二层做粗略的调试
调试通过第一个语句时,jnz未跳转证明第二个call语句需要进入
继续调试
第三个call语句被跳转则不需要进入
Jmp语句进行下一步跳转
此处出现call与cmp来决定jnz是否跳转,不能直观确定call是否需要进入
选中需要查看的call语句回车进入其中观察语句
观察得知,基本为数据的读入写出
在此下断点重新运行程序得知,程序在启动之前在此处运行6次然后进入主窗口,分析此处应该为初步分析是否注册版本代码
后面的jnz语句跳转至结束语句
第二层分析结束,判断前两个call语句需要进入仔细分析而后面的可暂时忽略
进入第二层第一个call语句
观察代码段中有对al和bl的操作,判断该部分为对al和bl的操作
第四个call进入的代码就是对al或者bl的运算 则第三个call语句需要进入
观察第一个call语句内的代码
暂时无法分析出详细内容,暂且跳过
同时在此处设置断点,重新载入会在此处停留,证明在最初的校验中,该部分是判断是否注册的函数,若此处通过则被当作成功注册
进入第二个call语句
发现其中有test al语句
调试得到该段同样al=0,jnz未能跳转,修改此处标志位经过测试同样达到成功的目的
进入该call语句
得到该代码段
进行调试得到:第一个je语句不跳转而jnz跳转到retn,同时je与jnz判断的标志位有edx决定,与al无直接关系且经过此步al=0
将xor al,al修改为mov al,1
进行测试
测试成功
打开程序
出现未注册信息,同时在安装软件中出现关键的key安装在系统中
由于该程序是在vb中编译的,可通过vb逆向的捷径:查找函数
在此处查找vbaVarTstEq函数
CTRL+N 搜索函数并下断点
设置断点后重新载入程序,从第一个断点开始调试,逐一查找程序中的程序
若在程序启动前未找到该序列号则对下一个特殊函数设置断点
发现特殊字符进行校验
校验成功