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