二进制代码分析报告(好水的一个破解)
第一步,language.exe检测出程序加壳,经过Aspack加壳。
第二步,AspackDie.exe脱壳
第三步,language.exe检测脱壳后的程序,发现该程序是使用Delphi编写的。
第四步,将脱壳程序拉入IDA,通过ViewsàStrings查看字符串信息,发现“注册码错误”字符串,定位到代码处。如下图:
在0x004ACAD7处有两个分支,经观察0x004ACADD的分支为注册成功的分支,0x004ACC3D的分支为注册失败的分支。因此,为了注册成功,我将0x004ACAD7处的jnz改为jz,这样随便输入注册信息后,将跳转到0x004ACADD分支,即注册成功。对jnz的修改可以利用Ollydbg进行修改。效果如图:
然而,当我关闭程序重新打开时,提示页仍然存在,程序仍是未注册状态(如下图),我意识到在程序启动时还有验证注册信息的代码段。
利用IDA和OllyDbg,我从程序的入口点开始分析。
程序首先利用GetPrivateProfileStringA从user.dat中取出用户注册的信息,包括用户名和序列号。如下图:
接下来,对用户的注册信息进行了分析,这些分析过程就应该是验证注册信息是否正确的,从而根据判断结果来确定是否注册。
从IDA的反汇编窗口来看,总共有三处地方对注册信息进行了验证。如下图:
前两处:
第三处:
在利用OllyDbg进行调试的时候,发现前两次判断都能通过,在进行第三步判断时,没能通过。因此,我将0x004AD5C5处的jnz改为了jz,这样,成功通过三次判断,因此注册验证通过,将不会显示提示页面,同时注册成功。
效果如图:
附:
我也尝试着去找到真正的注册码,并且成功找到,过程如下。
从图中,左分支为注册成功的分支,右分支为注册失败的分支。注册成功与否关键看0x004ACAD2处 call sub_404b04的返回值,我断定这个函数应该是验证注册成功的关键函数。如果sub_4-4b04返回非零,则注册码错误。在IDA中分析sub_404b04函数,发现该函数接受了两个参数,分别是eax和edx(Delphi的传参规则是前三个参数依次传入eax, edx, ecx寄存器)。在sub_404b04中首先比较了两个参数是否相同,如果不相同,直接返回第一个参数(也就是非0),所以首先应该保证的是这两个参数相同。
在OllyDbg中,我在此函数下断点,并尝试输入注册信息,点击注册按钮时,触发断点。这个时候,观察eax和edx,我发现edx为我输入的注册码,而eax为带比较的参数,因此,我可以断定正确的注册码就是eax所指向的内容。如下图:
因此,用户名为”wah”的正确注册码是”2EA4B10”。经过验证确实正确,如图: