0x0.起因
平时做项目过程中,有时候会接触些二进制文件,用十六进制编辑器查看编辑方便一些。之前Mac下没找着好点的十六进制编辑器,一直用的Sublime Text3的插件,最近发现了一个十六进制编辑器Synalyze It! Pro,有语法高亮解析文件十六进制数据的功能,让人眼前一亮,感觉用着应该挺舒服的

但是软件并不是免费的,官网上40刀,APP Store上588…
想用网上的破解版又不放心安全,转念一想干脆自己来分析顺便入门学习一下逆向好了
0x1.破解?
网上只找到了一两个提到破解思路的,其中一个说的比较简洁,我先按这个方法来试试

按照搜到的思路找到需要patch的地方(这里由于版本不同,显示的地址也不同,但代码区段是相同的),给出的patch的位置位于TurboActivateController的updateStatusText方法中。

je指令是条件跳转,与jz指令相同,当满足ZF置位的条件时跳转;而jmp是无条件跳转;nop则是空操作,将je改成nop则是断掉这里可能的跳转,继续执行后续的指令
按照该思路,通过修改关键的跳转指令进入激活成功的条件流程中,进而破解
修改之后运行,点开【License】,弹出的消息框中可以看到确实显示了激活成功的信息

而在此之前是显示剩余试用天数的

0x2.怀疑
到这里真的完成了破解了吗?
直觉告诉我并不,这倒像是强行改变跳转而导致仅执行了显示成功的消息字符串而已
重新打开程序,发现启动框的标题还是有剩余试用天数的提醒

显然,程序并没有完成破解
破解失败,或者至少可以说是非完美破解,不过在这个过程中我已经学会了很多分析方法、汇编指令和工具的使用,接下来靠我自己来分析破解
0x3.分析
观察程序,当激活key不对时会弹出错误提示,以该错误提示的字符串为入口分析

载入程序,搜索字符串Error checking

可以看到有结果,通过交叉引用可以找到其调用地址,跟进地址

继续跟进

最终来到顶层调用处,在TurboActivateController的showProductKeySaveFailure方法中
左侧可以看到有TurboActivateController有很多方法函数,根据名称猜测程序激活部分的逻辑应该都是在TurboActivateController中实现的。发现其中有个activate的方法,应该就是激活动作的核心代码
查看activate方法的控制流程图

检查保存序列号和激活调用的函数分别是TA_CheckAndSavePKey和TA_Activate,跟进这两个函数的引用,发现激活相关的函数都是在一个动态库中的


搜了一下TurboActivate,发现是wyDay公司旗下LimeLM产品的一个模块,可以为程序提供在线/离线激活功能

既然激活采用了第三方的库,那就改变库函数的返回值应该就行(到这里才想起之前找到另一个提到破解思路的帖子,作者最后是在TurboActivate官网注册下载了SDK,自己编写接口,做了一个假的动态库替换。当时看这操作感觉学不来就没研究了)
在activate方法调用TA_CheckAndSavePKey和TA_Activate处下断点调试程序,随意输入错误的key激活触发断点

可以看到TA_CheckAndSavePKey函数返回值为0x1,经过后面的test eax,eax未能使ZF置位,je指令未跳转,执行到loc_100291cba就退出了,没有走到调用TA_Activate的流程就抛出错误提示结束了
所以需要让TA_CheckAndSavePKey返回值为0,修改RAX的值为0x0,je指令成功跳转到loc_100291cc7执行到第二个断点处调用TA_Activate方法

可以看到TA_Activate函数返回值为0x2,在cmp eax,0x22后,jae指令不会跳转,继续往下分析
到test eax,eax的时候,下一个je跳转是可以跳到激活成功的流程的,所以这里的RAX值需要修改为0x0,也就是TA_Activate的返回值需要为0
到此activate方法分析完了,修改动态库的函数返回值(这里要感谢ha2师傅教了我些小技巧),运行程序尝试激活

显示激活成功,但是不管是激活框还是启动时的标题栏都还是显示的试用剩余4天,想了一下,感觉我这个操作跟最初直接修改跳转指令本质上没太大差别,应该是还有某个关键点没找着
就在一筹莫展的时候,偶然调试跟进updateStatusText方法的时候发现sub_1002934f8这个函数

这个函数会调用TA_IsActivated,并且被很多地方引用,而且在程序启动的时候也会调用,猜测程序是通过调用TA_IsActivated函数来判断程序的激活状态的
断点调试该函数

可以看到函数返回值为0x1,按照前面调试的结果,猜测0x0代表激活成功,修改RAX值为0x0运行
可以看到打开文件的框没有显示剩余试用天数了

打开【License】,显示激活成功的页面

很明显,现在才是完美破解!
0x5.感慨
之前完全没啥逆向基础,为了分析学习,把所有空闲时间都花在这上面了,还熬了几天的夜没休息好。不过最后成功了还是很有成就感的,经过这一次的实践分析学习,学到了很多逆向的基础知识和分析方法。总的来说想要学什么,上手最好的办法还是得去多实践、多操作。