1. 程式人生 > >Java位元組碼插樁修改HiBeaver(結合ASM,實現Hook需求、輕量級AOP、無埋點統計上報等)

Java位元組碼插樁修改HiBeaver(結合ASM,實現Hook需求、輕量級AOP、無埋點統計上報等)

Java彙編指令- https://segmentfault.com/a/1190000008606277
一次Android位元組碼插樁實戰- https://segmentfault.com/a/1190000008658815
Android位元組碼修改神器HiBeaver:黑掉你的SDK- https://segmentfault.com/a/1190000008491823
黑掉你的SDK,位元組碼插樁,插入指令,hook程式碼,甚至建立一些簡單的AOP框架- https://github.com/BryanSharp/hiBeaverDemo
HiBeaver是一個用於進行Java位元組碼插樁的Gradle外掛- https://github.com/BryanSharp/hibeaver


  HiBeaver is an gradle plugin for java byte code manipulation and AOP design by modifying project byte code during build of the package, or modifying bytecode within Jar independently.
  Android gradle編譯外掛hibeaver結合Java AOP程式設計中對於大名鼎鼎的ASM.jar的應用,和Android gradle 外掛提供的最新的Transform API,在Apk編譯環節中、class打包成dex之前,插入了中間環節,依據開發者的配置呼叫ASM API對專案所依賴的jar進行相應的修改,從而可以比較高效地實現上面的Hook需求。 
  HiBeaver 是目前這方面比較完善的位元組碼插樁Gradle外掛,目前最新的1.2.4版本支援通過萬用字元或正則表示式的方法來匹配目標類和目標方法,進行方法的批量插樁注入和
修改。

位元組碼的修改可以使用Javassist或者ASM-http://jboss-javassist.github.io/javassist/ , https://asm.ow2.io/

-- HiBeaver的幾個應用場景:
1.修改引用SDK中的一些bug或者提高其效率;
2.獲得必要的SDK的一些關鍵呼叫時機,通過hook建立回撥;
3.欺騙SDK、關閉或減少SDK中不受控制的網路傳輸。
4.對指定Jar/Aar檔案進行修改。
5.Android位元組碼插樁技術:如無埋點統計上報、輕量級AOP

-- 傳入元件的例項物件,來對元件的相關狀態進行監測,一般的思路有兩種:
  1.通過Java繼承體系,為我們實現的四大元件分別建立基類,在基類父方法裡對監測方法進行呼叫。
  2.通過Android API Hook技術,即通過動態代理等方法替換關鍵節點,抓住元件的節點方法並呼叫我們的監測方法。

相關推薦

Java位元組修改HiBeaver結合ASM實現Hook需求輕量級AOP統計上報

Java彙編指令- https://segmentfault.com/a/1190000008606277 一次Android位元組碼插樁實戰- https://segmentfault.com/a/1190000008658815 Android位元組碼修改神器HiBeav

Android AOP位元組

出自:http://www.jianshu.com/p/c202853059b4 背景   本篇文章基於《網易樂得無埋點資料收集SDK》總結而成,關於網易樂得無埋點資料採集SDK的功能介紹以及技術總結後續會有文章進行闡述,本篇單講SDK中用到的Android端AOP

使用JBEJava Bytecode Editor修改Java位元組

JBE JBE(Java Bytecode Editor)是一個Java位元組碼編輯工具,而且是開源的,該專案是基於jclasslib ej-technologies( https://github.com/ingokegel/jclasslib)位元組碼檢視工具和Apa

Java位元組詳解位元組指令

一、概述 Java虛擬機器採用基於棧的架構,其指令由操作碼和運算元組成。 操作碼:一個位元組長度(0~255),意味著指令集的操作碼個數不能操作256條。 運算元:一條指令可以有零或者多個運算元,且運算元可以是1個或者多個位元組。編譯後的程式碼沒有采用運算元長

Java位元組淺析

英文原文連結,譯文連結,原文作者:James Bloom,譯者:有孚 明白Java程式碼是如何編譯成位元組碼並在JVM上執行的非常重要,這有助於理解程式執行的時候究竟發生了些什麼。理解這點不僅能搞清語言特性是如何實現的,並且在做方案討論的時候能清楚相應的副作用及權衡利弊。 本文介紹了Java程

Java位元組淺析

英文原文連結,譯文連結,原文作者:James Bloom,譯者:有孚 條件語句 像if-else, switch這樣的流程控制的條件語句,是通過用一條指令來進行兩個值的比較,然後根據結果跳轉到另一條位元組碼來實現的。 迴圈語句包括for迴圈,while迴圈,它們的實現方式也很類似,但有一點不同

Java位元組淺析

英文原文連結,譯文連結,原文作者:James Bloom,譯者:有孚 從Java7開始,switch語句增加了對String型別的支援。不過位元組碼中的switch指令還是隻支援int型別,並沒有增加對其它型別的支援。事實上switch語句對String的支援是分成兩個步驟來完成的。首先,將每

java位元組入門

由於dload_n 只支援0..3, 所以用了dload index 指令。虛擬機器子所以提供dload_n,而不是隻用dload index, 是因為前者只佔用一個位元組,dload_n, 在位元組碼中,分別是0x38,0x39,0x40,0x41.(將在下一節簡要介紹位元組碼指令集),dload指令是

java 位元組操作javassist

用javassist生成一個類(位元組碼檔案) /** * 使用javassist生成一個新的類 * @author L J */ public class JavassistDemo { public static void main(Stri

java類載入及動態代理之位元組莊技術

本文介紹一下,當下比較基礎但是使用場景卻很多的一種技術,稍微偏底層點,就是位元組碼插莊技術了...,如果之前大家熟悉了asm,cglib以及javassit等技術,那麼下面說的就很簡單了...,因為下面要說的功能就是基於javassit實現的,接下來先從javaagent的原

Java位元組介紹及動態修改

前言 對於Java位元組碼,它是在Java類的編譯過程產生的,即由.java原始檔到.class二進位制位元組碼檔案的過程。而Java類的載入又是通過類的名字獲取二進位制位元組流,然後在記憶體中將位元組流生成類物件。所以動態修改類的時機在於修改.class檔案

jvm原理27Java位元組方法表與屬性表深度剖析

上一節說到成員變數,這一節說一下方法表 圖一: 圖二: 圖三: 行號00000120 開始就是方法表的開始,剛開始2個位元組是方法的數量:00 03 是三個方法(無參構造器、變數a的get和set方法) 方法表: 型別 名稱

從零寫一個編譯器十一:程式碼生成之Java位元組基礎

專案的完整程式碼在 C2j-Compiler 前言 第十一篇,終於要進入程式碼生成部分了,但是但是在此之前,因為我們要做的是C語言到位元組碼的編譯,所以自然要了解一些位元組碼,但是由於C語言比較簡單,所以只需要瞭解一些位元組碼基礎 JVM的基本機制 JVM有一個執行環境叫做stack frame 這個

Java遍歷HashMap並修改(remove)轉載

value 輸出 AI 中修改 快速 lec dex 直接 was 遍歷HashMap的方法有多種,比如通過獲取map的keySet, entrySet, iterator之後,都可以實現遍歷,然而如果在遍歷過程中對map進行讀取之外的操作則需要註意使用的遍歷方式和操作方法

如何優化JAVA及提高執行效率

car jdk nts 外部 ast 兩種 泛型 copy app 可供程序利用的資源(內存、CPU時間、網絡帶寬等)是有限的,優化的目的就是讓程序用盡可能少的資源完成預定的任務。優化通常包含兩方面的內容:減小代碼的體積,提高代碼的運行效率。本文討論的主要是如何提高代碼的效

一文讓你明白 Java 位元組

前言 也許你寫了無數行的程式碼,也許你能非常溜的使用高階語言,但是你未必瞭解那些高階語言的執行過程。例如大行其道的Java。 Java號稱是一門“一次編譯到處執行”的語言,但是我們對這句話的理解深度又有多少呢?從我們寫的java檔案到通過編譯器編譯成java位元組碼檔案(也就是.class檔案),這個過程

大話+圖說:Java位元組指令——只為讓你懂

前言 隨著Java開發技術不斷被推到新的高度,對於Java程式設計師來講越來越需要具備對更深入的基礎性技術的理解,比如Java位元組碼指令。不然,可能很難深入理解一些時下的新框架、新技術,盲目一味追新也會越來越感乏力。 本文既不求照本宣科,亦不求炫技或著文立說,僅力圖以最簡明、最形象生動的方式,結合例子與

java位元組-this分析

1.this我們用的非常多,但是沒有搞清楚為啥我們可以在例項方法中使用this。這裡我從java位元組碼的角度來分析this。 2.程式碼: public class Test { private static String hello(String hello){

深入理解java位元組

Javap 反編譯class檔案 –verbose 顯示冗餘資訊 (1)魔數:所有的class位元組碼檔案的4個位元組都是魔數,魔數固定值:0xCAFEBABE (2)版本:魔數之後4個位元組是版本資訊,前兩個位元組minor version次版本號例如0,後兩個位元組是主機板號majo

例項分析理解Java位元組

Java語言最廣為人知的口號就是“一次編譯到處執行”,這裡的“編譯”指的是編譯器將Java原始碼編譯為Java位元組碼檔案(也就是.class檔案,本文中不做區分),“執行”則指的是Java虛擬機器執行位元組碼檔案。Java的跨平臺得益於不同平臺上不同的JVM的實現,只要提供規範的位元組碼檔案,無論是什麼平臺