Exifpro是一款小巧简便的图像浏览工具,比较适合像我这样的新手用于逆向分析。
实验目的
分析Exifpro主要注册函数功能及其实现原理,通过修改,实现对Exifpro的破解。
实验环境
- win10虚拟机
- PEID 0.95
- Ollydbg
- Exifpro 2.1
实验步骤
查壳
利用PEID程序查壳,发现该程序无壳,这方便了我们的分析判断。
打开软件调试
我们打开Exifpro,查看其版本信息。发现目前是尚未注册登录的版本。
我们打开输入序列号的窗口,尝试向其中输入不同的数值,看看软件会有什么反应。
1.不输入
2.输入格式错误的邮箱
3.随机输入一段序列号
这些提示窗口的字符串其实是一种非常有用的信息,我们可以通过这些字符串,尝试定位到相对应的程序段。
定位到程序段
利用ollydbg打开Exifpro程序
右键点击,选择中文引擎搜索中的智能搜索
在中文搜索引擎页面右键点击,选择find。将“Serial number is invalid”输入其中,点击确定。
双击跳转到相应地址处。
寻找函数开头并下设断点
我们向上寻找该函数的开头位置。在00482BC2处发现有个retn指令,我们可以推断从下一条指令push 0x10开始,是该函数的开头位置。
我们双击6A 10 处,在此下设断点,逐步开始调试。
我们在利用ollydbg打开的ExifPro中输入邮箱名称和序列号。再次点击确定,由于在此处已经下设了断点,所以程序此时没有反应。注意此时的所输入的序列号和邮箱地址,在以后的分析中会有所用到。
逐步跟踪分析程序
点击F8一步步的跟踪程序的进行
lea是“load effective address”的缩写,该指令负责将内存的地址赋值给一个操作数。在这里,利用lea指令将存放邮箱字符串的地址赋值到ebx中。
在这里,是比较输入邮箱的长度,如果邮箱的长度小于5,则视为不合法邮箱,进行跳转。毕竟对于任意一个邮箱来说,"@.com"长度已经达到了5。而在本次实验中,我们的邮箱长度是13
如果邮箱长度小于5则会跳转至此处,同时会弹出窗口“请输入有效邮箱“
在这里的eax记录的是邮箱账号@前面字符序列的长度,如果在输入邮箱时输入的是非法字符,如@345312.com之类的,系统也会检测出来。
在这里程序取了序列号的长度放到了eax中,若长度小于4,就会弹出“输入有效序列号”的弹窗。
这一段主要是计算序列号的长度并遍历的时候进行排查。与上面一段不同,这里考虑到了序列号中存在的空格和“-”的情况。用eax存放数值,值得注意的是,这里存放的是字符串类型。红框中间有两段比较函数,分别是拿eax与0x20和0x2D比较,0x20就是空格,0x2D就是“-”。空格和“-”不计入序列号长度,这里计算的长度就是真实的数字长度,将计算结果存放在esi中。
这一段代码是判断序列号长度是否为24位,若未达到24位,则会报警说序列号无效。
取序列号前22位的和
这一段是检测第23位*10+第24位的数是否与前22位取后两位的值相等。在本次实验中,我们取的是78和93,两者是不相等的。
因此他跳转到弹出警告窗口处
我们修改起初输入的序列号,改为“123456781234567812345693”试试,这一段是符合刚才的要求的。我们再试一次。
这一串代码主要是实现将序列号前二十位由字符形式合成为一个整数,其中ExifPro._allmul函数,负责将每一位都×10。
通过这三条指令,先将邮箱号压入栈中,通过ExifPro.NameToNumber函数将字符串转为对应的数字,再从栈中取出放到ecx中。
再往后运行后,我们发现点击确定后并没有提示框的出现。起初,我以为这样是破解成功了,但我打开“About”后发现,其实并没有注册成功。我估计后台还有其他的检测函数,比如检测用户名和序列号的匹配关系。所以我换了个思路。
在主程序段搜索“Unregistered Version”,跳转到相应界面。
我们再网上找,找到了这个函数。ExifPro.IsAppRegistered,根据英文意思我们就可以推断出这是个判断是否注册的函数。我们观察发现这个call的返回值决定了程序是否跳转到402087处,而402087处就是显示“未注册版本”的地方。
我们跟随进该call中进行查看,发现该call在最后将bl的值复制到al中结束。于是我们把这句话改为MOV AL, 0x1
运行一次试试,大功告成