flutter逆向演練

2022-01-28 清海網際網路

  大家周末好,現在的app框架是越來越多了,uniapp->flutter->webview與java交互...

  目前來說的話,flutter app的逆向一直是個比較困難的問題,在app的lib目錄下會有個libapp.so文件,裡面存放的即是app運行的核心代碼,用ida來看看

很明顯,都是些字節,並不能很直觀的看見彙編代碼,到這裡,就可以難到90%的逆向人員了,我們可以在看看導出函數

what???這些都是什麼玩意

百度問下度娘,查詢結果如下:

_kDartVmSnapshotData』:代表 isolate 之間共享的 Dart 堆 (heap) 的初始狀態。有助於更快地啟動 Dart isolate,但不包含任何 isolate 專屬的信息。

『_kDartVmSnapshotInstructions』:包含 VM 中所有 Dart isolate 之間共享的通用例程的 AOT 指令。這種快照的體積通常非常小,並且大多會包含程序樁 (stub)。--->  dart函數代碼存放

『_kDartIsolateSnapshotData』:代表 Dart 堆的初始狀態,並包含 isolate 專屬的信息。

『_kDartIsolateSnapshotInstructions』:包含由 Dart isolate 執行的 AOT 代碼。

Data和Instructions,Vm和isolate又是什麼,為什麼使用Snapshot(中文意思快照)命名函數,可以參考https://mrale.ph/dartvm/中的解釋,這裡我們不深究的就記住Data和Instructions,Vm和isolate是兩對組合就行。

Data和Instructions,Flutter編譯運行在app上分為JIT和AOT模式(編譯模式)

JIT模式:即Just-in-time,動態(即時)編譯,邊運行邊編譯;安卓在2.2版本引入此技術,主要是用來提高程序的執行效率的。對於會多次執行到的代碼(可以理解為多次調用到的函數),JIT會將其編譯成機器碼。下次再執行此代碼時就直接調用機器碼,提升執行效率。而對於不經常調用到的函數,都會在執行運行期間進行編譯,編譯時又需要時間,在程序運行期間花時間編譯一般不會執行到的代碼,這不是一個好的選擇。所以,JIT只編譯常用代碼,對於不常用的代碼仍舊在用到時用JVM(解釋器)去解釋成機器碼然後執行就可以了。JIT編譯而來的機器碼是存儲到內存中的,不是在硬碟上。所以,在應用重新啟動時,所有的常用代碼也都需要使用JIT重新編譯成機器碼。(每啟動一個app,都會相應的啟動一個dalvik虛擬機,啟動時便會創建JIT線程,一直在後臺運行。當某段代碼被調用時,虛擬機會判斷它是否需要編譯成機器碼,如果需要,就做一個標記,JIT線程不斷判斷此標記,如果發現經常被調用,就編譯成機器碼,並將其機器碼地址及相關消息放入entry table中,下次執行時就跳轉到機器碼段執行,而不在解釋執行,從而提高速度)

JIT是Dalvik虛擬機下的編譯模式,隨著ART在4.4版本之後替代Dalvik,編譯模式也有JIT變為了AOT。Davilk虛擬機從android誕生時就存在,4.4版本後被ART虛擬機代替。

AOT模式:ART採取了AOT(Ahead-Of-Time)技術, APP安裝時就將字節碼(原始碼就是你編寫的文本文件(.java文件)字節碼是編譯好的中間文件(.class),運行在java虛擬機裡的就是這個文件,機器碼和本地代碼實際上是一回事,指機器可以直接識別運行的代碼,也就是機器指令字節碼是不能直接運行的,需要通過jvm解釋或編譯成機器碼才能運行,例如字節碼經過aot編譯成為機器碼,為什麼叫字節碼?因為這種類型的代碼以一個字節8bit為最小單位儲存)編譯成了機器碼然後保存在本地(可以理解為硬碟)。這樣app運行時就可以直接從本地取到機器碼然後執行,大大提高代碼的執行效率。在APK安裝的時候就會先做預編譯,編譯好的文件是OAT文件,該文件本質上是一個ELF文件,這裡與dex(odex)文件最大的區別是OAT文件不再是字節碼文件,而是一個可執行文件,這樣就可以更底層的與硬體接觸,運行時也省去了預編譯和轉譯的時間。AOT作為默認的編譯方式,優點是省去了程序運行期間的編譯時間,提高了代碼的執行效率,缺點是延長了應用的安裝時間,增大了本地存儲空間的佔用。(AOT作為默認編譯模式,只存在於android5.x,6.x版本)

來源網址:https://blog.csdn.net/weixin_34550722/article/details/117349977

                  https://zhuanlan.zhihu.com/p/44657693

安卓7.0以後的編譯模式是怎樣的?

7.0版本以後的編譯模式採取hybirb模式,也就是JIT+AOT+解釋器的結合。app安裝時不在編譯,直接安裝。代碼執行時採用JIT的方式,對於常用代碼進行編譯並產生profile文件,但這種JIT產生的編譯並不是持久的。當手機進入休閒狀態,系統隔一段時間就會掃描一下app的profile文件,基於此profile文件制定的常用代碼進行編譯並進行持久化處理。待應用再次運行時,如果本地有相關機器碼,就直接運行本地的機器碼而不再進行JIT編譯。

此處的AOT,不再指「Ahead Of Time」,而是指「All Of the Time」。

這種混合模式的好處是,因為不在進行安裝時編譯,安裝會變得很快。在手機進入休閒狀態時,進行了編譯,編譯過的常用代碼不會在進行重複編譯,執行效率也會提升。缺點是,應用前幾次代碼執行,效率可能一般,用戶操作應用的此處越多,這種代碼執行的效率越明顯。

Dalvik使用JIT模式編譯.dex字節碼,是針對Android設備優化後的DVM所使用的運行時編譯字節碼。

.odex是對dex的優化,deodex在系統第一次開機時會提取所有apk內的dex文件,odex優化將dex提前提取出,加快了開機的速度和程序運行的速度

ART虛擬機AOT編譯方式

在安裝apk時會進行預編譯,生成OAT文件,仍以.odex保存,但是與Dalvik下不同,這個文件是可執行文件

dex、odex均可通過dex2oat生成oat文件,以實現兼容性

在大型應用安裝時需要更多的時間和空間

不過,flutter線上只能使用AOT模式,也就是Flutter引入的DartVM包含了執行AOT產物的功能。為了與JIT模式兼容,DartVM採用了所謂快照的方式,即JIT運行時編譯後的基本結構與AOT編譯的基本結構相同。將類信息、全局變量、函數指令直接以序列化的方式存在磁碟中,稱為Snapshot(快照)。

那我們該如何解析這個快照呢?拿出裡面的函數消息呢

這裡,github上的大神給出了一個腳本

https://github.com/rscloura/Doldrums

這裡,我寫了個flutter app,採用aes加密的例子

採用腳本對libapp.so進行解析,得到如圖的消息

函數偏移都出來了,那可以利用frida進行勾取參數了

完美,aes/ecb加密模式的key出來了

結束。

相關焦點

  • Flutter 完整開發實戰詳解 (Flutter 畫面渲染的全面解析) | 開發者說·DTalk
    I/flutter (32494): TransformLayer#f8fa5I/flutter (32494): │ owner: RenderView#2d51eI/flutter (32494): │ creator: [root]I/flutter (32494): │ offset: Offset(0.0, 0.0)I/flutter (32494
  • Flutter 原理及美團實踐
    /lib/ui/*.dartplatform.dill則是實現了頁面邏輯的代碼,也包括Flutter Framework和其他由pub依賴的庫代碼:flutter_tutorial_2/lib/main.dartflutter/packages/flutter/lib/src/widgets/*.dartflutter/packages/flutter
  • 探索Flutter混合開發技術方案(下)——淺析Flutter Boost原理
    BoostContainerNative端加載容器在Android側,結合項目的路由框架,然後定義Flutter跳轉的schema協議,比如flutter://page,當調用Router.openPage("flutter://page")時(假如你的路由框架是這麼設定的),路由層判定為跳轉Flutter頁面
  • Flutter項目實戰:編寫一個非常精美的Flutter Todo-List項目
    下面就我來帶領各位參觀參觀這個項目的內部構造第三方庫項目中使用了一些非常優秀的第三方庫,也特別感謝這些開發者們,讓我的發量保持健康下面就是這些控制項的信息控制項說明dio網絡請求shared_preferences本地存儲provider狀態管理test單元測試carousel_slider滑動控制項circle_list環形列表intlintl語言包sqflite本地資料庫flutter_colorpicker
  • Flutter 開發從 0 到 1(六)Markdown 與代碼高亮
    先劇透下,今天的主角是 flutter_markdown,可以實現從使用簡單的 Markdown 標記格式化的純文本數據創建富文本輸出,包括文本樣式,表格,連結等。準備將 flutter_markdown 添加到 pubspec.yaml 文件中:dependencies:  flutter_markdown: ^0.4.4項目根目錄執行如下命令安裝 flutter_markdown
  • 半小時帶你入門 Flutter
    國慶後面兩天在家學習整理了一波flutter,基本把能擼過能看到的代碼都過了一遍,此文篇幅較長,建議保存(star)再看。Questions tagged [flutter]img本文我們從介紹flutter基本概念到梳理常用Widget到常用app demos編寫到~放棄~,希望可以幫助每一個像我一樣的初學者。有誤地方還望大神不吝賜教~
  • 2020年20個Flutter最漂亮的UI庫和項目
    flutter_swiper 地址:https://github.com/best-flutter/flutter_swiperflutter-ui-nice 地址:https://github.com/nb312/flutter-ui-nice
  • Flutter Widget - Container 布局詳解
    沒有子組件,父組件約束最大寬度是屏幕寬度,最大高度是無限,自己的約束最小寬度是100,最小高度是100,則高度儘可能小到100,寬度儘可能大到屏幕寬度↓自有子組件,設置最小寬高為無限,則大小為屏幕大小↓6.
  • Flutter竟然還有這種高端用法?
    https://juejin.im/user/2840793776393847首先,有很多的文章在說flutter bloc模式的應用,但是百分之八九十的文章都是在說,使用StreamController+StreamBuilder搭建bloc,提升性能的會加上InheritedWidget,這些文章看了很多,真正寫使用bloc作者開發的flutter_bloc卻少之又少。
  • flutter實現簡單的旋轉動畫
    前言flutter實現簡單的旋轉動畫,和大家一起學習探討。
  • Flutter - 不聽話的 Container
    // flutter/lib/src/rendering/box.dartBoxConstraints.tight(Size size)    : minWidth = size.width,      maxWidth = size.width,      minHeight = size.height,      maxHeight =
  • 編寫一個非常精美的Flutter Todo-List項目
    下面就我來帶領各位參觀參觀這個項目的內部構造第三方庫項目中使用了一些非常優秀的第三方庫,也特別感謝這些開發者們,讓我的發量保持健康下面就是這些控制項的信息控制項說明dio網絡請求shared_preferences本地存儲provider狀態管理test單元測試carousel_slider滑動控制項circle_list環形列表intlintl語言包sqflite本地資料庫flutter_colorpicker
  • 愛奇藝開播助手Flutter跨平臺Hybrid實踐
    /.android/include_flutter.groovy'))使用aar接入Android使用aar接入Flutter十分的簡單,只用下面兩步就可以順利的將使用Flutter開發的界面接入原生的工程。
  • 用前端最舒服的躺姿 "搞定" Flutter
    有興趣可以參考 「flutter安裝環境的搭建」(https://flutter.cn/docs/get-started/install/macos)  , 在這裡建議各位,一定要自己親自搭一下環境,跑一下官方demo, 小馬過河,焉知深淺,自己定的位才是最準確的。
  • Flutter Widgets 之 Container
    除了背景我們可以設置邊框效果,代碼如下:Container( child: Text('老孟,一個有態度的程式設計師'), padding: EdgeInsets.symmetric(horizontal: 10), decoration: BoxDecoration(
  • 「三小車輛」整治,開始演練!
    明天,我縣將舉行 「三小車輛」集中整治演練! 那麼, 演練的時間、方式如何? 在6月19日和6月24日,由公安局牽頭,城管、交通、公安和三個街道的工作人員組成了聯合演練小組,加大對7月1日將開始在主城區範圍內「三小車輛」的整治宣傳,讓更多人理解「三小車輛」的整治範圍和內容。這是我縣第一次組織如此大規模的整治演練,其目的就是希望通過對不文明交通違法行為的勸導、查處,保障城區文明交通形成一種慣例。
  • 從Container尺寸之謎看Flutter的渲染規則
    import 'package:flutter/material.dart';  2.    3.  void main() => runApp(MaterialApp(  4.        title: 'Travel',  5.
  • Flutter(四)之Flutter的布局Widget
    Align演練我們簡單演練一下Alignclass MyHomeBody extends StatelessWidget { @override Widget build(BuildContext context) { return Align( child: Icon(Icons.pets, size: 36, color
  • 綏陽縣開展2020年低溫凝凍天氣重特大道路交通事故應急救援演練
    為進一步提升低溫凝凍天氣突發道路交通事故應急處置能力,檢驗和完善道路交通安全聯席會議指揮體系建設,經報縣人民政府副縣長、公安局局長謝明江同志同意,12月10日上午,縣道交辦在縣城區紅旗西路路段組織開展了綏陽縣2020年低溫凝凍天氣重特大道路交通事故應急救援演練,縣應急局、縣交通局、
  • 已開源|碼上用它開始Flutter混合開發——FlutterBoost
    我們可以這樣簡單去理解這個方案:我們把共享的Flutter View當成一個畫布,然後用一個Native的容器作為邏輯的頁面。每次在打開一個容器的時候我們通過通信機制通知Flutter View繪製成當前的邏輯頁面,然後將Flutter View放到當前容器裡面。