你若安好
便是晴天

问道手游中anglescript脚本引擎学习与研究

前言

该手游使用的脚本引擎为anglescript和lua。不同于lua,anglescript脚本引擎在google和baidu上基本找不到资料,抱着学习的目的,写下这篇文章。

关键的加密算法在anglescript的as脚本中,名称为data.cas,是一个编译后的字节码文件。关于anglescript的介绍请浏览官网。

学习与研究

拿到这款手游apk后,先看看是否加固,用了哪个脚本引擎。搜索一下字符串查找游戏发包位置,从so里面了解到,发包函数有可能在lua中或者anglescript中。具体在哪里还不好确定,我们可以dump出脚本。

先别急着动态调试,往往在收集信息的过程中有意想不到的惊喜。我们看下ios版本,用frida-ios-dump工具砸壳。解压出来发现了大量没有加密的lua脚本,从lua脚本分析结果来看发包函数在lua中,数据包的加密算法在anglescript中,加密函数为gfParseKgfParseK

通过简单的分析,基本上确定了加密算法的位置,还需要动态调试验证一下。

接下来我们从官网下载anglescript的sdk,随便下载一个版本,主要用来学习,找找有用的函数。因为我们还无法确定问道中是用了哪一个版本的anglescript。

  • 学习anglescript

官网下载sdk,导入到clion中。简单的浏览源码,发现了几个关键的函数

// 配置engine,用来配置anglescript用到的函数签名、模版类型等等。
// 也就是说在so里面也会用到这个函数配置engine。这真的是个好消息,距离成功又近了一步。
int ConfigureEngine(asIScriptEngine *engine, const char *configFile);

// as脚本加载之后会编译成cas字节码文件,下面的函数就是用来加载字节码文件。这对我们来说很有用,因为我们可以dump出解密后的cas字节码文件,用下面的函数自己加载。
int LoadScript(asIScriptEngine *engine, const char *scriptFile);

接下来我们继续分析anglescript汇编指令的执行细节,从as_restore.cpp中了解到,指令+参数的总长度4字节对齐,其中指令的长度为2字节。as_bytecode.cpp中的DebugOutput函数会打印执行的汇编指令。要打印data.cas中所有的函数签名则可以调用以下流程engine->GetModule()->GetFunctionByIndex()->GetDeclaration()

从打印的函数签名中,我们找到了gfParseKgfParseK函数,证明了上面的分析没有错,接下来我们需要做一个测试验证我们的猜想:加载data.cas,调用gfParseK函数。

前面我们提到了,加载data.as脚本,调用脚本中的函数。需要注册大量的C++函数。重新实现这些函数,很麻烦。

漫漫长征路

我们用到了以下工具:

  1. frida
  2. ida
  3. android studio

从so里面dump出解密后的data.cas

  • 从anglescript sdk中我们学习到一个函数CScriptBuilder::LoadByteCode,该函数从内存中加载字节码文件。所有我们用frida进行hook,成功导出了data.cas。

dump出config文件

  • 同样我们用frida 调用函数WriteConfigToFile,实验中发现无法调用。 所以采用android inline hook的方式进行调用,先hookCScriptBuilder::StartNewModule获取到engine,然后hookCScriptBuilder::LoadByteCode,在这里调用WriteConfigToFile函数成功输出config文件

到这里我们的准备工作算是做完了,剩下就差将字节码反汇编成汇编指令了。要完成转译工作,仍然是学习anglescript sdk源码。具体过程如下:

  1. 创建engineasIScriptEngine *engine = asCreateScriptEngine()
  2. 配置configConfigureEngine(engine, "config.txt");
  3. 开启一个modulebuilder.StartNewModule(engine, "mymodule");
  4. 加载字节码module->LoadByteCode()
  5. 通过module打印所有函数签名module->GetFunctionCount(),module->GetFunctionByIndex(i)->GetDeclaration

asIScriptFunction保存了一个函数的所有信息。通过这个结构可以获取到该函数的所有汇编指令,指令同样用一个结构体保存asSBCInfo

as_context.cppexecute函数中我们找到了最终汇编指令执行的过程,并且DebugOutput中也存在字节码转译汇编指令的过程。

编写代码翻译函数中的所有asSBCInfo,我们很轻松的得到了gfParseKgfParseK函数的汇编指令,然后参考官方的文档还原出了这两个函数的C语言版本。

讨论

在整个过程中,很清晰能体会到的问题是脚本引擎的代码保护强度非常薄弱,lua脚本在ios中直接就是明文了,虽然anglescript进行了加密,但是并不能很好的隐藏关键代码,反而是协议部分相对复杂,有种舍本逐末的感觉。

本文仅供学习与交流,不得用于非法目的。如有侵权,请联系作者!

原创作品未经允许不得转载:WTF博客 » 问道手游中anglescript脚本引擎学习与研究

评论 8

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
  1. #1

    Better to be envied than pitied.

    marijuana news7个月前 (02-15)回复
  2. #2

    İstanbul VIP Transfer ailesi olarak İstanbul Yeni Havalimanından ve Sabiha Gökçen Havalimanından Sakarya, Sapanca ve Maşukiye’ye vip transfer hizmetlerini en uygun fiyatlarla sizlere sunuyoruz.

    Yılların deneyim ve tecrübesiyle yüksek model Mercedes Vip Vito transfer araçlarımızla sizi havalimanlarından karşılıyoruz, vip konforunda yolculuğunuzda misafirimiz oluyorsunuz Sakarya, Sapanca ve Maşukiye de verdiğiniz
    adrese sizi güven içinde bırakıyoruz. Yolculuğunuz esnasında VIP araçlarımızda Tv, sınırsız Wi-fi ve meşrubat ikramlarımızdan yararlanabilirsiniz,
    yolcuğunuzun nasıl geçtiğinin farkına bile varmazsınız.

    istanbul vip transfer

    istanbul vip transfer1个月前 (08-08)回复
  3. #3

    Yeni hobi edinmek isteyen sarışın genç kız kaykay kaymayı öğrenmek istemektedir.
    Bu konuda erkek arkadaşından yardım ister fakat pısırık oğlan bırakın kaykay kaymayı yürümeyi bile zor
    başarabilmektedir. Bu yüzden aralarında
    anlaşarak bu işi iyi bilen bir hoca kiralarlar ve evde eğitim almak isterler.

    Genç kızımız hocası geldiğinde koşarak ona kapıyı açar ve adamı içeri
    buyur eder. Birlikte koltuğa oturarak temel bilgilerden bahsettikten sonra kızın erkek arkadaşı oradan ayrılır.
    Bunu fark eden sapık öğretmen, kızı kaykayın üstünde tutarmış
    gibi yaparak onun kalçalarına yaslamaya başlar ve
    bu durumdan zevk alır. Aynı durum kız için de geçerli olunca sert porno sikiş kaçınılmaz olur.

    sert porno

    sert porno1个月前 (08-08)回复
  4. #4

    Bu servis özellikle butik ve online satış yapan sayfalar için etkilidir.
    Bu kişilerin sayfanız ile etkileşimini satışa
    dönüştürebilirsiniz. Organik şekilde sayfanızı büyütmek için ideal olan bu takipçi satın alma yöntemi ile yüz binlerce takipçiye ulaşmanız mümkün. Bu yöntemde kişiler sizi takip etmek için profilinize girer ve inceleme fırsatı bulur.
    Hem sayfanızın reklamını yapmış olursunuz hem de takipçi sayınızı artırmış olursunuz.

    Çekiliş sırasında birçok kişi sizi takip edeceğiniz için mümkünse canlı yayın açmanız tavsiye
    edilir. Böylece anlık olarak takipçileriniz ile etkileşim kurmuş
    olursunuz. Yakın zamanda hem takip hem de canlı yayın üzerinden etkileşim
    kurduğunuz için İnstagram gönderilerinizi bu kişilerin önüne
    daha çok çıkarmış olur.

    organik takipçi satın al

  5. #5

    Hangi sosyal medya platformu olursa olsun tüm platformlarda Türk takipçi satın al paketlerimiz hizmetinizde.
    Tik Tok Türk takipçi satın al, İnstagram Türk takipçi satın al, Twitch Türk takipçi
    satın al ve daha fazlası. Siz de artık aylarca, yıllarca beklemeden fenomenler kadar yüksek takipçi sayılarına ulaşabilirsiniz.
    Hızlı ve ucuz Türk takipçi satın almak için İyi Sosyal
    Medya Marketi hizmetinizde.

    Türk takipçi satın al

  6. #6

    TikTok fenomenleri kadar yüksek izlenme sayısına
    ulaşmak çok kolay! İyi Sosyal Medya Marketi ile ucuz tiktok izlenme hilesi servislerini
    kullanarak 1 milyon izlenmeye 0-2 saat içerisinde ulaşabilirsiniz.

    tiktok 1 milyon izlenme

  7. #7

    Türkçe Altyazılı HD Yabancı Film Ve Dizi İzle

    Film izlemek için kurulup, her şey hazırken,
    ne film izlesem diye düşündüğünüz oldu
    mu hiç? Bu durumu yaşamayan yoktur. Ancak film izle tavsiyeleri her zaman bu tip
    anlar içindir. Nitekim bizimle birlikte bu yazıda 720 p izleme
    sitesini tanıyacaksınız. Platformda, her türlü kategoriye özel sadece en iyi olan yapıtları göreceksiniz.

    Türkçe dublaj seviyorsanız bunu da seçebilirsiniz.
    Zaten filmleri açmadan önce kategoriler alanında yer alan seçeneklerden bunu belirliyorsunuz.
    Ayrıca full film izle tavsiyeleri de alabilirsiniz.
    Site içerisinde tavsiye olarak verilen filmler göz atabilirsiniz.

    filmler

    filmler1个月前 (08-12)回复
  8. #8

    En İyi Komedi Filmleri Ücretsiz İzle

    Her zaman derinliği olan, belli birtakım düşünsel alt metni olan filmleri izlemek istemiyoruz.
    Bazen şöyle yayılalım, hiçbir şey düşünmek zorunda kalmadan,
    aman şurayı anlamadım kaygısı yaşamadan film izleyelim istiyoruz.
    Bu taleplerimize en iyi yanıtı verebilen kategorinin komedi olduğunu söyleyebiliriz.
    Nitekim bu yazımızda film izle sitesi olarak yer alan 720 p izleme ve film kategorilerini inceliyoruz.

    Platformu kısa bir bakış atarak özetleyelim. 720 p izleme platformu,
    sade tasarımıyla hizmet veriyor. Ancak tabii ki tasarımdaki
    sadeliğin aksine içerik konusunda oldukça zengindir.
    Bu zenginliği hem film arşivi alanında hem de dizi arşivi kısmında görebilirsiniz.
    Zaten site içi geçiş araçları da bu kadarla sınırlandırılıyor.

    Şöyle güzel bir komedi filmi izlemek istiyorsanız sağ tarafta kategoriler var.
    Buradan seçiminizi yapabilirsiniz.

    full izle

    film izle1个月前 (08-13)回复