本文首发于我的个人博客
谈到逆向,大家第一反应就是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
添加Proxifier的Proxification Rules
Charles启用SSL代理
到这里,我们的环境准备工作就做完了,只要启动客户端就能看到成功解密的https流量。不过由于客户端默认以管理员权限运行,为了避免不必要的麻烦,还是使用Resource Hacker修改下manifest文件,以普通用户运行。
修改高亮部分由requireAdministrator
修改为asInvoker
,然后点击工具栏的编译按钮,最后保存即可。
到了激动人心的时刻,启动客户端!
输入账号密码,点击登录按钮,我们看到了这样的数据
app_id
看起来应该是标识不同渠道的,很可能是固定值;password
是32位16进制字符串,猜测是密码的md5值,我找了个工具试了下,结果还真是-v-;timestamp
是毫秒单位的时间戳,这个很明显,没什么好说的;platfrom
看起来是系统信息拼接的字符串,虽然信息比较多,但是这里也能看出个大概,[app_id]+[exe version]+[mac]+pc+[computer name]+[system version]
,当然尚不能完全确定,暂时先放一边;sign
和password
类似,看起来也是md5值,但具体是谁的md5值就不得而知了,尝试了把所有参数拼接为字符串计算md5结果也不对。
到这里,从抓包的角度来说,我们已经走不下去了,因为platform
和sign
参数搞不定的话流程就断了。
是时候了,来吧!
为了方便分析,首先将客户端修改为静态基址。
这样,我们就可以将OD的基址和IDA的基址设置为一致,即使重启进程也不用重新设置了。
通过前面的分析,我们知道登录地址为/loginServer/login
,在IDA中所搜字符串,只有一处即aHttpsPanApiBit
,按x
查找引用,仍然只有一处(由于我已经分析过,所以改了函数名)。
在充满各种v
开头的符号中间,字符串总是显得如此亲切。都是&k=v
的形式,很明显这里是拼接http请求参数的地方,大多数参数我们已经知道了,我们只重点看platform
和sign
参数即可。跟到这里,就没有捷径可走了,只能耐下性子一点点分析。
都是体力活,没啥好说的,一步步跟就好了,只要找准了缓冲区地址,就很开心了,使用内存窗口能看到字符串逐渐累加,感觉自己离胜利越来越近。
这里有两点要说明的是,首先,eax
里是二级指针,所以需要[[eax]]
才能定位到字符串位置,另外一点就是每次会申请新的内存空间来存放数据,所以字符串地址会变化,不过只要认准了eax
就问题不大。
最终拼接完成的格式为:[app_id];[exe_version];[mac];pc;[computer_name];[sys_version]
。
函数sub_410AD0
是对字符串进行拼接,最终拼接完成的格式为:app_id=d0beea3fe1a1423392690dfd4d3713fd&passport=lniwn&password=1a46be489100d6a089358eff29b98f7a&platform=[platform]×tamp=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编辑
,原因: