PC版
首先感谢北京科技大学ever404安全实验室老哥的文章《英语视听说逆向分析》,给我指明了方向
iSmart的pc版其实就是个chromium,语音识别以及判分都是由js完成,具体可以自己研究ISmartCache目录
在ISmartCache\flipbooks\对应的书,目录结构如下:
其中上面一堆md5?名字的对应的是书的章节,而resources目录下就是判分的js,我们只关注resource\js\up366client.js这个文件,(当然你要想实现自动做题也可以,那样的话要改的地方就比较多),直接打开你会发现是一堆乱码
emmmmm,ollydbg启动
嗯。。。。rc6加密,用的库是一个pascal的库 Delphi Encryption CompendiumVersion 5.2,因为是rc6,直接用常数定位密钥扩展函数,就能拿到key
key生成的函数调用栈:
key的话好像是固定的,没仔细研究
key指针位置:
key都拿到了,直接调上面的库写个decrypt程序,解出up366client的明文,然后随便改。。。。代码是混淆过的,但是我有混淆前的版本:),对照一下就行啦~ 其中[code]function d(t,e,n,i,a,r,s,c,u){e=e.replace(/#[^#]*#/g,"'")[/code] 就是口语判分的函数
改完之后encrypt一下,覆盖原文件,然后就可以愉快的刷iSmart~
附上decrypt脚本:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
CPU in 'CPU.pas',
DECCipher in 'DECCipher.pas',
DECData in 'DECData.pas',
DECFmt in 'DECFmt.pas',
DECHash in 'DECHash.pas',
DECRandom in 'DECRandom.pas',
DECUtil in 'DECUtil.pas',
TypInfoEx in 'TypInfoEx.pas',
CRC in 'CRC.pas';
var
Source:String;
Dest:String;
IV: array[0..10] of Byte=($31,$30,$36,$37,$38,$37,$36,$30,$35,$30,$38);
begin
try
write('File:');
Readln(Source);
Dest:=Source+'.js';
with TCipher_RC6.Create do
try
Mode :=cmCTSx;
Init(IV,11,'',0);
EncodeFile(Source,Dest);
finally
Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
Android版
安卓版其实跟pc大同小异,都是js,而且安卓的js没有加密
但是蛋疼的是,每次载入js的时候,app都会校验文件,所以直接修改js是不行的
我分别试了两种不同的方法
1.在java层修改js返回的分数
2.直接patch掉校验
两种弄起来都不难,但是都有一个共同的问题,重打包app,iSmart有好几处地方都做了app签名校验,我也没空一个个给它改,直接xposed大法禁用掉系统安装app的签名校验,我们自己先给app签名,然后再把apk包里的换成原来的,装上ok
现在安卓版的口语题目会上传录音到阿里云oss,pc版暂时没有,这不代表破解没用,填空选择题自动完成还是没问题的,而且可以用来调高口语的分数,70分调个80不过分吧:)
总结
上面说的东西仅供学习。。。算是一道ctf练手题?
嗯......说到ctf,那就顺便宣传一蛤
世界很大,互联网让世界变小,真的黑客们应该去思考并创造,无论当下是在破坏还是在创造,记住,未来,那主线是创造就对了。 ——by 余弦
非灰也 / De1ta & Sloth