终于献出逆向第一次---突破Registry Workshop的试用时间

学习逆向大概两个多月,一直没有真正意义上破解一个软件,这次经过反复的尝试,终于突破了Registry Workshop的试用期。下面来介绍下自己逆向过程中的一些思路。

官网下载最新的Registry Workshop,在window7 32位系统上安装。注意,该安装包在32和64位都可以安装,由于OD不能在64位的系统上使用,因此电脑是64位系统的应该在虚拟机上创建个32位的系统。

一.使用软件


打开以后是这样的NGA弹框,只能使用30天.点击输入注册码后,弹出另一个对话框:

        


这里注意看,明确指出需要128个字符,验证码比较复杂,而且这个软件是重启验证机制,经过OD分析,注册码是放在twreg.txt里,但逆向算法感觉比较难,暂时还无法破解。

当点击了试用后,就会跳转到功能界面。当过了试用期后,试用按钮就会置灰,无法试用了。通过使用发现,可以通过修改系统时间来“骗过”软件;我也在OD中手动将置灰的按钮激活,但是点击试用后就程序退出了。所以这个软件还是比较麻烦。



而且该程序不好使用字符串搜索的方式,查看字符串,根本没有找不到中文提示符。所以决定另辟蹊径。

二.关键API SetDlgItemTextW 来定位

我注意到,每天使用的时候,剩余天数都会重新更新,这个数值肯定是当前系统时间-安装时间得出来的,如果能找到这两个时间对比的地方,修改掉这个地方应该就可以一直试用了。那这个文本是哪个API写的呢?加载程序,右键查找当前模块使用的名字。 


我发现了这个函数,点击这个函数,右键选择-〉在每个参考点上设置断点,然后我们运行程序。程序会在多处被断下来,我们只需注意堆栈里的信息,看有没有“您的试用期还剩13天”的内容。按了几次F9之后,找到了一个地方:


我们看下这块的指令,找到数值13的这个地方



大家仔细分析下这段指令,JMP是一个跳转,这条指令如果执行的话,就会越过EnableWindow这个函数,我们注意到这函数在这里的作用是将某个控件不可用,越过以后就会设置剩余的试用天数;如果不跳转那就不能试用了。那么这是一个关键跳转,再往上看,发现有个JLE跳转指令,如果这个指令执行,那结果就是试用结束了,如果这个不执行,那就是可以继续使用。这说明这个跳转决定了你是否能够继续试用的关键。看他上面的cmp指令,其实如果你自己调试就会发现这个地址保存的值是D,也就是13。这就是剩余试用天数的保存地址,这个地址是4FF4E0。好,接下来我们删除所有的断点,只给这个地址下内存断点,看是什么地方将值存入的,那个地方必定有时间的计算。

三.下内存断点,找到关键位置


现在删除所有的断点,重新载入程序,在内存窗口里找到4FF4E0这个地址,对第一个字节下内存写入断点。这里需要注意一个事情。内存断点比较特殊,即使只给一个字节下了断点,那么OD也会给整个页都设置成这个断点,也就是4KB的大小。所以当触发断点后,要注意观察我们留意的那个地址的值,只有值变成了我们期望的,才找到了关键的位置。经过几次F9发现,当执行了00487289处的指令后,内存地址4FF4E0就会写入值D,也就是13,我们找到了关键的地方。我们看这条指令的上面,竟然是SUB指令,那这不就是时间天数的相减吗?这说明,此处的EAX保存着当前时间天数的值,而ESI保存的就是安装那天的天数值。然后我们仔细分析下这段代码其实不难发现,CMP ESI 1E 这条指令正是和30进行对比。如果超过了30,就会直接进行关闭注册表的操作,因此这里必须不能跳转。如果再仔细分析程序的话可以发现,在上面还有一处对比,也不能进行跳转。之所以有两次跳转,我猜测第一次算出来的可能是时间的秒数。第二次对比转化成了天数,所以有了两次对比。这两次都不能跳转,我们给他nop掉。


nop掉了以后,我们需要把保存到内存里的值也改掉。这里可以将MOV DWORD PTR DS:[EDI+148],EAX改成MOV DWORD PTR DS:[EDI+148],0FFFFFFF。霸气吧。但要注意,如果直接这样修改,会覆盖下面的几条指令。所以这里我们使用打补丁的方式进行修改。



这样,就把写入内存的数值改成了我们的数值,然后保存修改,运行程序。


时间改过来了,点击试用可以继续试用。即使我们将系统时间设置成3000年,程序还是可以试用。至此,我们突破了这个软件的试用限制。

四.去掉烦人的NGA窗口

突破的限制之后,我们能不能去掉烦人的试用窗口呢?让程序直接跳转到功能界面。我们先试用Resource Hacker工具看看这个窗口的控件是多少。


我们发现是119,转换成16进制是77。加载刚才修改好的程序,右键点击查找-〉命令。输入push 0x77。找到了这个窗口创建的位置。


至于这里为什么输入push 控件号。这是VC程序的专有指令,帮助我们定位关键点。这里有两个跳转,但都不是我们要找的关键点,为什么?因为分析可知,第一个跳转如果不跳,那么下面的指令时设置错误,然后会触发第二个跳转,这样虽然避开了对话框,但此时程序肯定出错了。那如果第一个跳转呢,那对话框就会弹出来。那我们只能在0044A783处下个断点,看看上层调用的跳转。



我们发现上面的一个跳转指令可以避开这个对话框,那在那里下断点,运行到那里时修改标记寄存器Z下看看效果:


程序成功避开了试用对话框。修改下系统时间看看。依然有效,我们成功了。

五.思考

这里可能大家会问,为什么不直接避开试用对话框呢?你可以试下,如果直接避开,而不去修改时间判断的话,程序到期后会自动退出,根本运行不起来的。

至于注册码到底是什么?现在的功力还不足以解出来,留作以后的练习吧!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是搭建私服镜像中心docker-registry和docker-registry-web的步骤: 1.安装Docker和Docker Compose 2.创建一个目录来存储docker-compose.yml文件和证书文件 3.创建docker-compose.yml文件并添加以下内容: ```yaml version: '3' services: registry: restart: always image: registry:2 ports: - 5000:5000 environment: REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm REGISTRY_STORAGE_DELETE_ENABLED: "true" REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt REGISTRY_HTTP_TLS_KEY: /certs/domain.key volumes: - ./data:/var/lib/registry - ./auth:/auth - ./certs:/certs registry-web: restart: always image: mkuchin/docker-registry-web:v0.1.2 ports: - 8080:8080 environment: REGISTRY_URL: https://registry:5000 REGISTRY_WEB_TITLE: Docker Registry REGISTRY_AUTH: htpasswd REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm REGISTRY_HTTP_TLS_CERTIFICATE: /certs/domain.crt REGISTRY_HTTP_TLS_KEY: /certs/domain.key volumes: - ./auth:/auth - ./certs:/certs ``` 4.创建一个目录来存储证书文件和htpasswd文件 5.生成证书文件 ```shell openssl req -newkey rsa:4096 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt ``` 6.生成htpasswd文件 ```shell htpasswd -Bc auth/htpasswd <username> ``` 7.启动docker-compose ```shell docker-compose up -d ``` 8.访问https://<your-domain>:8080,输入用户名和密码即可登录docker-registry-web界面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值