一、程序介绍
TraceMe程序只有一个功能,就是输入用户名和序列号后点击Check判断对错。
对于刚接触逆向的哥们练手是不错
这是输入错误的提示,当然正确的用户名和序列号我也不知道,现在改变程序指令,不管输入什么都必须正确
二、程序破解
打开OD,导入程序......
按Ctrl+N查看程序的导入表中用到的windowsApi
导入表:PE导入表记录了当前PE文件依赖的外部函数库信息,供系统进行间接引用映射,实现当前程序对外部库的依赖引用,一般都是windows提供的api或者自己写的dll(动态链接库)
WindowsApi:Windows API提供了面向Windows操作系统标准接口,供第三方应用与操作系统深度集成,说白了是个exe就一定会用到windowsApi。
下面列出的都是这个程序所用到的windowsApi
GetDlgItemTextA:用于从Windows对话框中获取指定控件的字符串文本内容。
程序的用户名和序列号都使用了这个Api,那么按住Ctrl+G搜索这个Api的位置,下图框选出的汇编指令就是GetDlgItemTextA函数的实现,一直到retn指令返回到函数调用处
F2在该位置下断点,再按F9直接运行程序到断点处。当然这里直接F9是不会运行到断点处的。需要输入东西点击check,调用这个api,然后才能到断点处
点击check没有弹窗,因为我们设置了断点。猜测现在程序要准备干的事就是拿着输入的值去做比对。所以我们要找的指令必然在接下来准备执行的指令中。按住F8单步步过。直到找到关键位置
call指令:进行了判断,将 返回结果给到了eax寄存器中
test指令:eax和eax做按位与运算,判断eax寄存器是否为0。如果为0就将z标志位的0改为1
je指令:若z标志位为1则跳转
关键:不能让je跳转,我们直接暴力改写指令,将je改为nop(什么都不做继续向下执行),然后继续执行程序
方法很多,也可以执行执行到test指令后将z标志位从1改为0