用Fiddler实现某干教网App学习记录修改(秒刷学时)
本帖最后由 swordwind 于 2022-12-5 23:15 编辑注册吾爱这么长时间来,一直是看别人的帖子,这几天居家办公,闲时也学着用Fiddler做了一下安卓的App抓包分析,找来找去,还是用最“熟悉”的某干教网来练手了。最终效果是在Fiddler的帮助下,实现网上学习课程暂停后直接退出即完成学习(学时到手),无视课程所需学习时间。
这就是今天的主角,相关部门人员每年有50个学时的线上学习任务,大多数课都是要看几十分钟到2、3个小时的视频不等。看完诸多大神关于Fiddler的帖子以后,感觉本地学习的数据必定是上传到服务器进行记录,理论上让用Fiddler作中转代{过}{滤}理,截获相关信息并篡改后,直接告诉服务器我已经学完这门课不是就OK了吗?说干就干。新手小白动手实践起来!
https://static.52pojie.cn/static/image/hrline/1.gif
1.准备工作
首先当然是下载安装和配置Fiddler,基本上是按照论坛里bigbirdl大神写的教程一步一步做的,https://www.52pojie.cn/thread-1171662-1-1.html
因为我用的是MACOS,只能在虚拟机里进行安装,需要注意的是因为Fiddler所运行的主机(既我的Windows虚拟机)需要和手机在同一个局域网(Wifi)里,所以在虚拟机的网络设置里,需要改为“桥接网络(Wifi)”,否则无法正常抓取手机上的数据包。Fiddler设置好并运行后如下图
另外,个人习惯是把“Rules”菜单下的“Hide CONNECTs”选项给勾选上,这样可以不看建立连接用的数据包(这些数据包里没有我们关心的数据),避免刷屏。另外,抓手机的数据包里,可以暂停本机(电脑)数据包的抓取,方法是单击一下左下角的那个“Capturing”字样处,该处无显示时即可。
2.开始抓包
手机打开某干教网程序,登录后进入在线学习页面,在开始学习前,可以在Fiddler当前Session列表(即显示一大堆已经抓到的数据包相关信息的窗口)里按“Ctrl+X”快捷键把之前操作过程中抓到的数据清除,准备寻找和分析学习记录上传的相关数据包。
选了一个2学时的课程,获得学时需要1小时2分24秒。老实说课讲得都非常好,但是我们只要学时,就对不起王老师了😂。开始播放后,我点击了暂停(实际上在后来的分析中发现,App会定时自动回传学习记录,也会在用户暂停的时候马上回传一次学习记录)。Fiddler上马上抓到了一系列数据包,我们来逐个看一看。
先是几个"isLogin",应该是判断登录信息是否过期的,跳过。然后重点来了,这个"addStudyRecord.json"你们觉得可疑不可疑?这命名简直太规范了,还有下面那个"addNtStudyTime.json",初步锁定就是这两个文件之一了,至于后面的coursedetail这些课程信息相关的,直接忽略不计了。然后分别点开两个包观察了一下,addNtStudyTime.json里并没有相关数据,而addStudyRecord.json这个请求里,可以看到如上图中的studyRecordList这个值,里面的字段也很好辨认(确实是命名很规范),前面是课程和学生的ID,然后是进入视频的时间accessTimeStr、退出(暂停)时间exitTimeStr,接下来是playlength和playTime这两个字段,从两个字段的值可以明显看出来应该是playlength,因为它的值正好就是退出时间减进入时间,单位看来是秒。那么只要把这个值改为我们想要的时长,在服务器端不作数据验证(比如用exitTime减accessTime,算一下是否和playlength一致)的情况下,应该就可以达到我们速刷的目的了。
3.手动修改数据包
在Fiddler里设置断点,当App向服务器上传数据的时候截获并暂停,待我们修改相关数据以后再放行。
上面两个图中的办法都可以,也可以参考右图上的快捷键,我们需要设的断点是“Before Requests”,也就是App的请求发出前。然后回到手机上,恢复播放后再一次暂停。这时Fiddler上会显示有请求被截获并暂停,一开始可能并没有我们关心的addStudyRecord请求,可以直接点工具栏上的“Go”(绿色小三角那个图标)放行,直到addStudyRecord出现,直接双击该数据包session,在右边的窗口中修改。
将playlength改为3600(即1小时),修改完以后一定要按“回车”(好像要这样才能保存修改,新手小白表示不明真相),之后点“Go”放行。在手机上看一下,修改生效了。
学习进度从0%直接到96%了,实际上刚才修改的时候再多改一点(比如7200秒),就能直接学完课程拿学时。至此,目的达到,学时到手。不过还没完,还有一个小彩蛋。
4.自动修改数据包
既然上一章叫手动修改数据包,当然会有一个自动修改数据包的彩蛋。虽然能够直接修改学习时长,比拿手机看1小时快多了,但是还是需要反复操作,挺麻烦不是。Fiddler还有一个很强大的功能,可以自动修改request数据(response当然也能)。进入Fiddler的Rules菜单,点击Customize Rules...,快捷键CTRL+R,进入Fiddler ScriptEditor,直接修改Fiddler的自动化脚本。
方便起见,几张图我就放一起了。在Fiddler ScriptEditor中进入Go菜单下的to OnBeforeRequest,跳转到相应的函数里,然后在函数的最后面加上如下代码。
if (oSession.fullUrl.Contains("http://mstudy-bjce.bjdj.gov.cn/mobile/module/mobile/mobileinterface/v1/mobilecourse/addStudyRecord.json")){
var reqStr=oSession.GetRequestBodyAsString();
//将playlength中的值修改
var prevInd=reqStr.indexOf('playlength%22%3A')+16;
var nextInd=reqStr.indexOf('%2C%22playTime');
var myReqStr=reqStr.substring(0,prevInd)+'3600'+reqStr.substr(nextInd);
Fiddler.FiddlerApplication.Log.LogString(myReqStr);
oSession.utilSetRequestBody(myReqStr);}
需要说明的是if判断里的那个URL是在抓到addStudyRecord数据包后,右击该数据包,选择copy菜单下的Just URL,然后再粘贴出来的,也就是只针对这个请求进行修改。实际上,我自己在写这段代码的时候遇到很多麻烦,首先是RequestBody的值我一开始一直以为是JSON格式,但后来仔细看了一下数据包的TextView,发现并非如此。想用正则来替换playlength部分,在网上查了半天,发现Fiddler Script好像并不支持正则(如果有大神知道如何用正则烦请告知为谢),于是就只好用了个笨办法,先找到playlength的位置,再找到后面playtime的位置,把两头的字符串都截出来,再加上我想要的学习时长,拼接成想要的RequestBody,然后发送。
感谢楼主用心分享!教程步骤非常详细,图文并茂,思路清晰。值得学习!{:1_893:} 本帖最后由 swordwind 于 2022-12-16 11:06 编辑
ydjhome 发表于 2022-12-13 18:26
我按照您的教程试着修改我单位的学习记录,抓包后有两个包应该是更新学习记录。
第一个:
从截图来看,应该是第一个包,即update-progress那个request,需要修改的应该是studyTime。
相关数据明显是加密了,但是你可以试试直接把resourceTotalTime的值复制到studyTime里(前者是课程总时长,如果studyTime是我所猜的已学时长的话,那应该就能直接学完)。
PS:保险起见的话,干脆把lessonLocation的值也用resourceTotalTime的值替换掉,这个字段应该是你当前观看视频位置。 很不错,学习了 这个方法很好,很实用,感谢分享。 fiddler学习教程在哪能看,我B站找的都是,哎 一言难尽 没记错的话fiddlerScript是基于javascript的,可以网上找找javascript中的正则表达式 感谢楼主分享!很详细的教程! 谢谢楼主分享 感谢楼主分享!{:1_893:}
感谢分享。 整理的有头有尾 井然有序 点赞