打开程序
观察得知此程序使用天数已达,输入code后
出现提示框
将程序载入od
先对输入code失败提示的字符串进行文本查找并观察程序代码
观察到上方存在一个cmp + jnz语句,推测通过此判断即可跳过失败标志
同时注意到右侧有 case 3 of switch 提示,代码中应该有switch case结构
ctrl + G 查找到 switch语句的开头 4DBDA4
推测有1~0B一共11个case+1个default
回到出现失败提示的case3语句,测试修改标志位能否实现目标
修改两处jnz使得第一处跳转,第二处不跳转
出现成功窗口
但是点击确认后依然回到倒计时结束界面
继续观察代码
从switch处开始调试代码并观察
观察到程序最开始运行一次switch,case此处等于1.在输入序列号时,又运行一次switch,case此处为3
尝试在程序开始处将eax赋值为4
修改后发现代码过大已覆盖其他代码
在程序中挑选合适空位置进行补丁的安放
进行调试
出现死循环
观察代码出现死循环的原因
观察case = 4处下方call语句能将代码跳转至开头switch
将case = 4 处的jnz成立来跳过call语句
出现最后的default 同时case B 中有两段ASCII码
从default后走出程序到达dll领空
重新F9后回到switch循环
个人推测:程序在经过case4的判断后强制重新启动,下一次进入case判断时eax=B从而跳过死循环
尝试修改case为b
保存并调试
载入后无nag提示,测试成功
打开程序
载入跳出一段nag
经过一段时间消失,然后跳出主界面
点击exit,继续跳出nag
一段时间后消失
目的:将程序前后nag跳过
载入od
根据程序调用函数需使用堆栈进行操作,在nag跳出界面时暂停
点击od上方堆栈函数
查看堆栈发现mfc中的dialog 点击调用来自
发现call语句,设置断点进行测试
F8过出现nag,继续运行发现主界面和结束nag同样来自该call语句
观察发现上方存在je跳转
尝试修改标志位来跳过前后nag
实验成功
故现在目的为让第一三次跳转成立,第二次不成立
在数据段寻找有空位地址,编写代码来让目的成立
点击od窗口切换的m
点击进入寻找
选择446000地址作为目的地址,同时选择在此处下硬件断点来测试此段有没有被操作
测试:无影响操作
在代码段选择无影响的代码进行操作
修改代码为
在数据段设置字符来对call指令进行计数,第1和第3次跳转至跳过nag部分,第二次不进行跳转,仅仅对jmp占用的指令进行补充
测试修改
修改成功