原文地址:tinyhack.com/2021/03/07/…

原文作者:tinyhack.com

发布时刻:2021年3月7日

要对一个flutter运用的发布版别进行逆向工程并不简略,由于没有东西,而且flutter引擎自身改动很快。到现在,假定你很幸运,假定一googleplay个flutter运用是用特定版其他Flutter SDK构建的,你能够运用darter或Doldrums转储该运用的类和办法名。

假定你非常幸运,这便是我第一次需求检验Flutter App时产生的作业:你甚至不需求对App进行反向工程。假定运用非常简略,运用简略的HTTPS衔接,你能够运用阻拦署理(如Burp或Zed Attack Proxy)来检验全部功用。我刚刚检验的运用在HTTPS的基础上运用了额外giti轮胎是什么品牌的一层加密,这也是我需求进行实践逆向工程的原因。

在这篇文章中,我将只给出Android途径的比方,但这儿写的全部内容都是通用的,适用于其他途径。TLDR是:咱们不更新或创立快照解析器,而仅仅从头android平板电脑价格逆向游览译flutter引擎,并将其替换到咱们的方针运用中。

Flutter编译后Git的运用

现在我找到的关于Flutter逆向工程的几篇文章和资料android平板电脑价格库是。

  • Reverse engineering Flutter for Android (解说了快照格局的根本情况,介绍了,Doldrums,截止现在只支撑快照版别8ee4ef7a67df9845逆向游览fba331734198a953)
  • 逆向工程Flutter运用程序(第1部分)是一篇非常好的文章,解说了Dart的内部结构,不幸的是,没有供给代码,逆向思想的例子第2部分在写这篇文章时还没有供给。
  • darter:Dart快照解析器一个转储快照版其他东西c8562f0ee0ebc38ba217c79逆向思想55956d1cb。

首要代码由两个库lgoogleplayibflutter.so(flutter引擎)和libapp.so(你android下载设备的代码)组逆向行驶怎样处分2021成。你可能会猎奇:假定你试图用规范的反汇编器翻开一个libapp.so(被AOT编译的Dart代码),实践上会产生什么。这仅仅本地代码,对吗?假定你运用IDA,初步,你只会看到这一堆字节。

[Flutter翻译]通过从头编译Flutter引擎对Flutter使用进行逆向工程。

假定你运用其他东西,比方二进制ninja会尝试做一些线性扫描,你能够看到许多办法。全部的办法都没有git指令命名,也没有你能找逆向思想事例100个到的字符串引用。也没有外部函数的引用(无论是libc仍是其他android什么意思库),也没有直接调用内核的syscall(比方Ggit指令o)。

用Darter dan Doldrums这样的东西,你能够转储类名和办法名,你能够找到函数的结束google翻译地址。下面是一个运用Doldruandroidstudio设备教程ms进行转储的比方。这对回转运用有极大的帮助。你也能够运用Frida在这些地址处进行钩子,转储内存或办法参数gitlab

[Flutter翻译]通过从头编译Flutter引擎对Flutter使用进行逆向工程。

快照格局问题

特定的东西只能转储特定版其他快照,原因是:快照格局不稳定,它是为了特定版其他作业而规划的。与其他一些格局能够越过不知道或不支撑的格局不同,快照格局是非常不宽恕的。假定你不能解google地球析一个部分,你能够解析下一个部分。

根本flutter结构优缺点上,快照格局是这样的。<tag> <data bytes> <tag> <data bytes>flutter面试题 ..逆向思想练习500题….每一个分块都没有清晰的长度,标签的头也没有特定的格局(所以你不能只做一个形式匹配就想知道一个分块的初步)。全部都仅仅数字。除了源代码自身,没有任何关于这flutter结构优缺点个快照的文档。

事实上Android,这种格局甚至没有版别号。这个格局是由快照版别串gitlab来标识的。版别字符串是由快照相关文件github是干什么的的源代码哈希生成的。咱们假定假定文件被改动,那么格局也会被改动。这在大多数情况下是正确的,但并不总是如此(例如:假定你修改了一条谈论,快照版别串就会改动)。逆向游览

我初步的主见flutter中文官网仅仅通过查看Dart源码的diff来修改Doldrums或Darter到我需求的逆向行驶扣几分罚款多少钱版别。但事实证明,这并不简略:中间有时会刺进enums(意味着我需求将全部常量移位一个数字)。而fluttering且dart还运用了许多的位操作,运用C++模板。例如,当我看Doldums的代码时,我看到了这样的东西。

def decodeTypeBits逆向思想(value):
return value &amp; 0x7f

dart.googlegoogle浏览器source.Gitcogithub中文官网网页m/sdk//+/2beb…
我想我能够快速查看一下代码中的这个常量(新版别中是否有改动),类型本来不是一个简略的整数。

class ObjectPool : public Object {
using TypeBits = cflutteringompiler::ObjGoogleectPoogoogle地球lBuilderEntry::TypeBits;
}
sgoogle空间truct ObjectPoolBuilderEntry {
using TypeBits = BitField<uint8_t, EntryType, 0, 7>;
}

你能够看到这个Bitfield是作为BitField模板类来结束的。这个特其他位很简略读懂,可是假定你看到kNextBit,你需求回溯之前全部的位定义。逆向行驶扣几分我知道关于经验丰富的C++开发者来说,这并不难,但仍是:要跟踪这些版别之间的改动,你需求做gitlab许多的手艺查看。

我的结论是android平板电脑价格。我不想保护Python代码,下次更新运用进行复测的时分,他们能够运用较新版其他Fluttandroid下载设备er SDK,再来一个快照版别。而关于我正在做的具体作业。我需求用两个不同的google地球Flutflutter结构优缺点ter版别检验两个运用:一个是现已在运用商铺发布的东西,另一个是即将发布flutter中文官网的运用。

重建Flutter引擎

flutter引擎(landroid是什么手机牌子ibflutter.so)是一个独立于libapp.so(主运用逻辑代码)的库,在iOS上,这是一个独立的结构。思路非常简略。

  • 下载咱们想要的引擎版别
  • 修改它来打印类名android下载设备、办法等,而不是编写咱们自己的快照分析器。
  • 用咱们的补丁版别替换本来的libflutter.so库。
  • 盈利

第一步现已很困难了:怎样才干找到相应的快照版别?darter的这张表能够帮助咱们,可是没有更新最新的github版别。关于其他版别,咱们需求获git教程取并检验它是否有匹配的快照号。这儿有从头编译Flutter引擎的指令,可是编译过程中呈现了一些小插曲,咱们需求修改快照版git教程其他python脚本。还有:Dart内部自身就不是那么逆向行驶扣几分简略操作的。

我检验过的大部分旧版别都不能正确编译。你需求修改DEPS文件来让它编逆向思想事例100个译。在我的情android系统况下:差异很小,但我需求在网上搜到这个。不知何故,特定的提交不可用,我需求运用不同的版别。留意:不要盲目运用这个补丁,根本上要查看这两点。

  • 假定一个提交没有了,就找离发布日期最近的一个。
  • 假定某件作业指的是_internal的,你可能应该把_internal的部分去掉。
diff --git a/DEPS b/DEPS
index逆向选择 e173af55a..54ee961ec 100644
--- a/DEandroid什么意思PS
+++ b/DEPS
@fluttershy@ -196,7 +逆向游览196,7 @@ deps = {
Var('dart_git') + '/dartdoc.git@b039e21a7226b61ca2android手机de7bd6c7a07fc77d4f64a9',
'src/third_party/dart/third_party/pkg/ffi':
-   Var('dart_git') + '/ffi.git@454ab0f9ea6bd06942a983google商铺238d8a6818b1357edb',
+   Var('dart_git') + '/ffiflutter结构.gitgoogle空间@5a3b3f64b30c3eaf293a06ddd967f86fd60cb0f6',
'src/third_party/dart/thgoogle地球ird_逆向思想事例100个party/pkg/fixnum':
Var('dart_git') + '/fixnuFlutterm.git@逆向行驶怎样处分202116d3890c6dc8Google2ca629659da1934e412292508bba',
@@ -468,7 +468,7 @@ deps = {
'src/third_party/androigoogleplay安卓版下载d_tools/sdk/licenses': {
'packages': [
{
-        'package': 'flutter_internal/android/sdk/l逆向选择icenses',
+        'package': 'fluandroid下载tter/android/sdk/lgoogle地球icenses',逆向行驶
've逆向游览rsion': 'latest',
}
],

现在咱们能够初步修改快照文件,了解它的作业原理。可是正如前面提到的:假定咱们修改快照文件:快照哈希值就会改动,所以咱们需求在third_party/dart/tools/make_version.py中回来一个giti静态版别号来处理这个flutter开发问题。假定你碰了VM_SNAPSHOT_FILES中的任何一个文件,请用静态字符串将snandroid手机apgit教程shot逆向行驶怎样处分2021_hash = MakeSnapshotHashString()这一行改为你的特定版别。

[Flutter翻译]通过从头编译Flutter引擎对Flutter使用进行逆向工程。

假定咱们不给版别打android平板电脑价格补丁会怎样样呢,运用无法启动。所以,在运用OS::PrintErr(“Hello World”)打上补丁(就从打印hello world初步)并从头编译代码后,咱们能够检验替换.so文件,然后作业它。

我做了许多实验(比方尝试FORCE_INCLUDE_DISASSEMBLER),所以我没有一个洁净的修改办法共享给咱们,但我能够供给一些修改的提示。逆向思想练习500题

  • 在runtime/vm/clustered_giteesnaGitpshot.cc中,咱们能够修改Deserializer::ReadProgramSnapshot(ObjectStore* object逆向_store)来打android什么意思印类表隔绝->class_table()->Pri逆向思想事例100个nt()
  • 在runtime/vm/cAndroidlass_table.cc中,咱们能够修改voflutter结构id ClassTable::Print()来打印更多的信息。

例如,打giti印函数称谓。

const Array&amp; funcs = Array::Handle(cls.functions());
for (intptr_t j = 0; j < funcs.Length(); j+fluttershy+) {
Function&amp; func = Function::Handle();
func = cls.FunctionGoogleFGitromIndex(j);
OS::PrintErr("Function: %s", func.ToCString());
}

旁注:SSgoogle服务结构L证书

Flutter运用的另一个问题是androidstudio设备教程:它不会信任用户设备的root cert。这关于pentesting逆向游览来说是一个问题,有人做了一个关于怎样给二进制逆向思想练习500题打补丁的阐明(直接或运用Frida)来处理这个问题。引用这个博文的TLDR。

  • Flutter运用的是Dargoogle翻译t,而Dart并没有运用体系的CA商逆向行驶怎样处分2021
  • Dart运用的CA列表被编译到运用程序中。
  • Dart在安卓体系上是没有署逆向行驶理认识的,所以运用ProxyDroid与iptables。
  • 勾选 x509.cc 中的 session_verify_cert_逆向行驶扣几分罚款多少钱chain 函数来禁用Google链式验证。

通过从头编译Flutter引擎,能够很简略地结束这一点。我google空间们只需按原样修改源代码(thi逆向行驶怎样处分2021rd_party/boringssl/src/ssl/handshake.cc),而不需求在编译后的代码中找到汇编字节形android下载式。

稠浊Flu逆向思想tter

运用这儿供给的阐明能够稠浊Flutter/Dart运用程序。这将使回转变得有点困难。请留意,只有称谓被稠浊,没有实行高级操控流稠浊。

结束语

我很懒,从头编译flutter引擎是我采用的捷径fluttering,而不是写一个适合的快照解析器。当然,其他人在回转其他技术时,也有相似的主见,即黑掉作业时引擎,例如,要回转一个稠浊的PHP脚本,能够用PHP模块钩住eval。


通过wgithub中文官网网页ww.DeepL.com/Translator(gitlab免费版)翻译