首页
社区
课程
招聘
[原创]从正向对某网盘进行逆向分析
发表于: 2020-9-14 11:51 7720

[原创]从正向对某网盘进行逆向分析

2020-9-14 11:51
7720

本文首发于我的个人博客

谈到逆向,大家第一反应就是OD, IDA, x64dbg这类的工具,由于我不是专业做逆向安全的,对于这些逆向工具的使用仅仅属于会用的程度,所以,本文,我将从一个软件开发者的正向角度在Windows平台下对某网盘的通信协议进行逆向分析。

既然我们要分析协议,首先就要抓包,主要有两类工具,其实现原理也不太一样。

Wireshark+Chrome

首先添加SSLKEYLOGFILE环境变量,然后用Chrome把需要抓包的域名都访问一遍,然后Wireshark配置Secretlog项即可解密对应的https流量,具体实施方式不写了,有兴趣的同学以Wireshark Chrome SSLKEYLOGFILE这三个关键词进行搜索,教程实在是太多。

这种方式的优点是不会对系统或者通信本身产生任何伤害,因为它没有做任何劫持,而是实打实的解密了,解密的原理是利用了NSS Key Log,对于启用了SSL-Pinning的客户端效果更好。缺点是无法指定进程抓包,而且操作起来有一定的不便行,在分析客户端的过程中,一旦有一个新的域名出现,就需要先用Chrome访问一遍才能解密。

本文将采用第二种方法来进行抓包。

Proxifier+Charles

Charles使用https中间人劫持技术,所以它同样可以解密https流量,但是它只对使用了wininet系列api的流量有效,而我们的网盘客户端使用的是libcurl,所以需要借助Proxifier来将客户端的流量重定向到Charles,从而实现https解密。

添加Proxifier的Proxy Server

Proxy Servers

添加Proxifier的Proxification Rules

Proxification Rules

Charles启用SSL代理

SSL Proxying Settings

到这里,我们的环境准备工作就做完了,只要启动客户端就能看到成功解密的https流量。不过由于客户端默认以管理员权限运行,为了避免不必要的麻烦,还是使用Resource Hacker修改下manifest文件,以普通用户运行。

Resource Hacker

修改高亮部分由requireAdministrator修改为asInvoker,然后点击工具栏的编译按钮,最后保存即可。

到了激动人心的时刻,启动客户端!

启动客户端

输入账号密码,点击登录按钮,我们看到了这样的数据

登录请求头

登录请求数据

app_id看起来应该是标识不同渠道的,很可能是固定值;password是32位16进制字符串,猜测是密码的md5值,我找了个工具试了下,结果还真是-v-;timestamp是毫秒单位的时间戳,这个很明显,没什么好说的;platfrom看起来是系统信息拼接的字符串,虽然信息比较多,但是这里也能看出个大概,[app_id]+[exe version]+[mac]+pc+[computer name]+[system version],当然尚不能完全确定,暂时先放一边;signpassword类似,看起来也是md5值,但具体是谁的md5值就不得而知了,尝试了把所有参数拼接为字符串计算md5结果也不对。

到这里,从抓包的角度来说,我们已经走不下去了,因为platformsign参数搞不定的话流程就断了。

是时候了,来吧!

为了方便分析,首先将客户端修改为静态基址。

静态基址

这样,我们就可以将OD的基址和IDA的基址设置为一致,即使重启进程也不用重新设置了。

Rebase Section

通过前面的分析,我们知道登录地址为/loginServer/login,在IDA中所搜字符串,只有一处即aHttpsPanApiBit,按x查找引用,仍然只有一处(由于我已经分析过,所以改了函数名)。

aHttpsPanApiBit

在充满各种v开头的符号中间,字符串总是显得如此亲切。都是&k=v的形式,很明显这里是拼接http请求参数的地方,大多数参数我们已经知道了,我们只重点看platformsign参数即可。跟到这里,就没有捷径可走了,只能耐下性子一点点分析。

都是体力活,没啥好说的,一步步跟就好了,只要找准了缓冲区地址,就很开心了,使用内存窗口能看到字符串逐渐累加,感觉自己离胜利越来越近。

系统信息拼接

这里有两点要说明的是,首先,eax里是二级指针,所以需要[[eax]]才能定位到字符串位置,另外一点就是每次会申请新的内存空间来存放数据,所以字符串地址会变化,不过只要认准了eax就问题不大。

最终拼接完成的格式为:[app_id];[exe_version];[mac];pc;[computer_name];[sys_version]

函数sub_410AD0是对字符串进行拼接,最终拼接完成的格式为:app_id=d0beea3fe1a1423392690dfd4d3713fd&passport=lniwn&password=1a46be489100d6a089358eff29b98f7a&platform=[platform]&timestamp=1599636155000ZWtVdHB0WjBocFIxdmNzZlg3cUQ5SFhEYU5pWGsv,拿到数据之后,由函数sub_516850进行签名,该函数内部调用了sub_516730对数据进行加密,下面截取核心代码

sub_516730对数据处理完成后,通过v12返回,然后以十六进制字符串形式进行存储到v9中,我们看到v12的长度i为0x10即16,以%02x打印的话,v9最终就是长度为32的字符串了,下面看下加密逻辑sub_516730

CryptCreateHash用来初始化hash表,0x8003表示CALG_MD5,所以这个函数就是对数据进行md5编码。

目前,我们已经分析完客户端登录需要的所有参数,可以进行代码实现了

以上只是正常登录流程,对于初次登录的用户,或者mac地址变化的用户,会进入

这个流程顺着上面的思路分析即可,这里就不再继续写了。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-9-14 15:39 被kanxue编辑 ,原因:
收藏
免费 9
支持
分享
最新回复 (8)
雪    币: 3729
活跃值: (3852)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
感谢分享!
2020-9-14 14:00
0
雪    币: 5543
活跃值: (2102)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享!
2020-9-14 15:05
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2020-9-15 17:10
0
雪    币: 144
活跃值: (335)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好文,支持一个
2020-9-16 09:11
0
雪    币: 2171
活跃值: (476)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢分享! !
2020-9-18 20:32
0
雪    币: 198
活跃值: (1555)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
好文,支持一个
2020-9-18 21:03
0
雪    币: 2194
活跃值: (996)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
楼主有心了,poc都用上协程了。
2020-9-21 18:25
0
雪    币: 437
活跃值: (524)
能力值: ( LV3,RANK:27 )
在线值:
发帖
回帖
粉丝
9

##

最后于 2021-1-28 13:45 被GhostValley编辑 ,原因:
2020-9-27 16:52
0
游客
登录 | 注册 方可回帖
返回
//