• 课上实验-小软件破解


    二进制代码分析报告(好水的一个破解)

      第一步,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”。经过验证确实正确,如图:

     

  • 相关阅读:
    spring boot中创建ElasticSearch索引
    spring boot项目16:ElasticSearch-基础使用
    spring cloud项目07:网关(Gateway)(2)
    spring cloud项目06:网关(Gateway)(1)
    Ubuntu上MySQL多实例部署
    MySQL常用命令、配置汇总
    spring boot项目15:安全-基础使用(2)
    spring boot项目14:安全-基础使用(1)
    docker-compose mongodb 副本
    关于golang slice切片的一个问题
  • 原文地址:https://www.cnblogs.com/wangaohui/p/4463033.html
Copyright © 2020-2023  润新知