公司打卡APP,由于偶尔忘记打卡,所以想做一个能查询是否打卡来提醒自己的脚本,为什么不做自动打卡脚本,担心万一更新出问题,但没有发现,那岂不是很尴尬。

首先抓包,查看查询打卡的请求。

image20191228215916256.png
获取其中的参数,其中userid为手机号,rmk3为设备uid,reqssn为固定字符串,所以需要知道加密算法来计算sign

fm=<fm><userid>178xxxx</userid><ver>3.2.0</ver><rmk1/><rmk2>2</rmk2><rmk3>8xxxx-xxxx-xxxx-xxxx-BCxxxxxxxx71</rmk3><action>attendRecord</action><reqssn>2244f70148454d03baeb739d9c86e082</reqssn><sign>54bexxxxxx</sign></fm>

按照惯例,解包后搜索参数名,找到一个sign函数,查看后发现是加密函数,其中部分代码如下,或者uuid,拼接参数

2.png
其中有个私钥,记录一下

PRIVATE_KEY = "6fcb5584c28743b8ff16337353b0cabe"

继续查看,就可以看到后面还拼接了reqssn,然后通过和私钥的拼接组成新的字符串做一个sha256加密。所以,这个reqssn参数是哪里来的呢,是否是固定值。搜索查看

3.png

在其他函数位置发现,reqssn的值,是固定值,且写入代码中。后面的就是上面所说的sign函数。
4.png

至于uuid是怎么发现,继续查看相关的代码引用,发现是利用本地读取的文件,打开测试机,找到如下位置,发现保存的uuid

5.png

理论上至此,参数值和加密已经得知,但是经过计算还是不一样,继续查看调用的加密,发现其中做了一次base64的编码,然后再sha256加密。

6.png

至此能算出加密值和抓包到的结果一致。

image20191228221903626.png

如果仔细想想,这个请求中貌似没有变化的量那岂不是只需要做这个请求就可以,干嘛需要加密算法呢。这个请求中没有变化的值,但是登陆中有啊,其中的reqssn就不再是固定值,而是一个当前的时间戳,这时候就需要算法来生成sign。总不能cookie失效一次就抓一次包改一次cookie吧。

登陆的时候参数就是

<fm><pwd>cxxxxxxxx0b33xxxxxxxxxxxxxx</pwd><userid>17xxxxxxx</userid><ver>3.2.0</ver><rmk1/><rmk2>2</rmk2><rmk3>ffxxxxxx-xxxx-xxxx-xxxx-xxxxxxx9b</rmk3><action>login</action><reqssn>20191225122352145</reqssn></fm>




# Android逆向  

tocToc: