小白的逆向经历

本帖最后由 水木杉 于 2019-11-2 17:08 编辑

最近在使用一款日程记录软件,手机上有破解版pc上的已经失效了,非常想在pc端使用日历模式,于是就尝试了一下逆向,第一次做,花了将近一周的时间才成功(或许成功了吧,没怎么测试。。。)分享一下这个过程大家一起交流,欢迎大神指导。

  • 软件需要网络认证,首先我使用fiddler抓包,发现了一条check路径的报文出现的很频繁,刚开始以为这里面会有会员信息,看了半天才发现这是一个用于消息同步的报文,如下图,软件上添加日程会通过这条报文上传到服务器。

   

   2.为了比较会员有什么不同,忍痛去冲了一个月会员,发现只有下面图片中的那一条报文发生了改变,status刚好对应用户状态,再看下面的内容,简直不要太明显,proEndDate都给你了,于是我用AutoResponder伪装了回复,发现失败了。对比了很久忍痛冲的会员发来的报文,发现箭头指的这个数字很重要,刚开始以为他是软件的某种校验机制,后来才发现原来那只是报文的字节数目,(发现这一真相经过了两天的时间,期间我还去查了Transfer-Encoding:chunked是什么意思,当时都没有反应过来那其实是字节数)把这个数字改对之后就成功了。

  3.后面尝试使用OD破解他,结果用OD打开软件他就自己运行起来了,界面上一片空白,怎么和教程上说好的不一样。。。刚开始以为是加壳了,用查壳工具查了他说没有,我又不太相信他但自己又看不懂,无意在论坛某一篇文章中看见说.net的程序在OD中会直接运行,回想起查壳时看到的软件信息,好像是这样的。然后换了工具,看了“丸子de爸爸”发的植物大战僵尸修改器DIY这个帖子后去尝试了CE,因为能够考打开AutoResponder伪装,我现在已经能够在会员和非会员两种状态下自由切换了,在这两种状态的切换下还真让我找到了状态改变后软件也会梗着变化的15个数,如下图所示,经过反复对比,发现1072693248和0这两个数可以改换会员图标,却不能实现会员功能,其他的数修改后又会被改回来,查看了改变这些数的程序代码,发现VB基础太差,根本看不懂。

  4.后来在网上看到有人说通过反编译调试.net,就去下载了NETReflector,反编译成了C#,去看程序的时候又蒙了,只怪自己太菜读不懂代码,甚至不知道程序怎么运行,最后又是在网上看到有人推荐dnSpy调试.net,下载试了试,发现还不错,至少能直接运行,虽然没学过C#但耐不住人家起名起的简单易懂,调试过程也是相当惨,看不懂代码是硬伤。挣扎了几天最后还是在两种状态的切换下,帮我在userInfoControl上定位到了下面一段代码:
[C#] 纯文本查看 复制代码

public async Task LoadUserInfo()
                {
                        UserModel userModel = await UserManager.GetCurrentUser(true);
                        if (userModel != null)
                        {
                                if (userModel.pro && userModel.proEndDate > DateTime.Now)
                                {
                                        Settings.Default.isPro = true;
                                        Settings.Default.Save();
                                        this.SetProCrown(true);
                                }
                                else
                                {
                                        Settings.Default.isPro =false;
                                        Settings.Default.Save();
                                        this.SetProCrown(false);
                                }
                        }
                        UserInfoModel userInfoModel = await Communicator.GetUserInfo();
                        if (userInfoModel != null)
                        {
                                await UserDao.UpdateOrInsertUserInfoModelListDbAsync(userInfoModel);
                        }
                        this.RefreshHead();
                }

把他的判断条件改成这样:userModel.pro || userModel.proEndDate < DateTime.Now,满心欢喜的以为要成功了,结果程序根本运行不起来,报了下面图片上的错误,虽然也没看懂,但后来误打误撞发现了这个文件“global::System.Windows.Markup.IComponentConnector.Connect”,然后把它删了,就好了,???为啥会有这个错误呢?是编译异常还是咋的,我现在也是懵的。
         
  5.最后,在“MainWindow”的2137行作用有一段代码是显示和隐藏“获取所以功能”按钮的,向下面这样把visible换成collapsed就隐藏掉了。

6.放两张成功的图片出来吧。
         

链接:https://pan.baidu.com/s/1h9iIgKy-A9zNM45afNPQUA
提取码:8a17
最后的最后,求免费评分啊。。。

THE END
喜欢就支持以下吧
点赞0
分享
评论 抢沙发
  • 管埋员

    昵称

  • 取消
    昵称