1. 程式人生 > >檢視與修改位元組碼,從而實現替換他人jar包中class檔案的目的

檢視與修改位元組碼,從而實現替換他人jar包中class檔案的目的

一、檢視二進位制位元組碼檔案的方式:

1.通過cmd命令:javap -v ClassA

2.通過jclasslib工具

二、將Android的apk中的dex反編成smail檔案,直接修改smail檔案後再回編成dex;

三、修改二進位制位元組碼檔案的方式:

1.反編譯後,修改java檔案,然後在javac 編譯成class,替換原來的class(但這個方法有人試驗了不成功);

2.通過jclasslib、eclipse實現修改:

2.1 修改class中的變數值:

以一個小工具 POJOTool.jar 為例,軟體開啟畫面效果如下

比如我想要修改 不能連結資料庫的提示資訊 為 "芝麻不開門!"

步驟如下:

1)用jd-gui開啟該jar  怎麼開啟不用我說了吧?

開啟之後找到 要修改提示資訊 的class檔案 這裡找到的是GenEntity

找到對應需要修改的程式碼所在的方法名

我這裡包含提示資訊的這段程式碼在方法 getAllDataBase()  如下圖:

2)用jd-gui或者winrar把GenEntity.class 解壓出來到C盤 (目錄無所謂)

3)雙擊桌面上安裝好了的 jclasslib bytecode viewer ,點選軟體的 File -- Open Class File 開啟你剛解壓出來的class檔案

4)點選methods--getAllDataBase--Code

methods是表示方法不用說吧

getAllDataBase是剛在jd-gui裡面找到的方法名

Code包含了getAllDataBase方法裡所有的資訊

找到"不能開啟資料庫連線,請檢查!"

這裡這個工具沒有提供搜尋功能

如果這裡很多內容 那麼你可以點選 copy to clipboard把這裡的內容複製到一個文字檔案裡面然後再搜尋

這裡找到的是第82行

5)點選第 82行後面的 #34 會跳轉到Constant Pool常量池的第34個常量

6)再點右邊的 cp info #362 會跳轉到第362個常量

這裡能看到String: 不能開啟資料庫連線,請檢查! 也就是最後輸出的資訊

7)找到GenEntity.class的關鍵常量了現在就該修改它了

在eclipse裡面新建一個Test來處理GenEntity.class

  1. import java.io.*;     
  2. import org.gjt.jclasslib.io.ClassFileWriter;     
  3. import org.gjt.jclasslib.structures.CPInfo;     
  4. import org.gjt.jclasslib.structures.ClassFile;     
  5. import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;     
  6. publicclass Test {     
  7.     publicstaticvoid main(String[] args) throws Exception {     
  8.         String filePath = "C:\\GenEntity.class";     
  9.         FileInputStream fis = new FileInputStream(filePath);     
  10.         DataInput di = new DataInputStream(fis);     
  11.         ClassFile cf = new ClassFile();     
  12.         cf.read(di);     
  13.         CPInfo[] infos = cf.getConstantPool();     
  14.         int count = infos.length;     
  15.         for (int i = 0; i < count; i++) {     
  16.             if (infos[i] != null) {     
  17.                 System.out.print(i);     
  18.                 System.out.print(" = ");     
  19.                 System.out.print(infos[i].getVerbose());     
  20.                 System.out.print(" = ");     
  21.                 System.out.println(infos[i].getTagVerbose());     
  22.                 if(i == 362){     
  23.                     ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];     
  24.                     uInfo.setBytes("芝麻不開門!".getBytes());     
  25.                     infos[i]=uInfo;     
  26.                 }     
  27.             }     
  28.         }     
  29.         cf.setConstantPool(infos);     
  30.         fis.close();     
  31.         File f = new File(filePath);     
  32.         ClassFileWriter.writeToFile(f, cf);     
  33.     }     
  34. }    

這裡需要注意"C:\\GenEntity.class"是我存放class的目錄


if(i == 362) 這裡是剛我在第七步找到的常量序號


"芝麻不開門!"這裡是我想修改的文字資訊!

執行Test.java 會有如下提示資訊 沒有報錯就證明正常的 如果報錯那麼就有問題

9)把C盤剛修改後的GenEntity.class替換掉原來的GenEntity.class

怎麼替換不用我說了吧..

用winrar開啟.jar 然後把GenEntity.class拖進去覆蓋就行了

10)執行效果..

大功告成

2.2 修改class中的操作語句:

例如修改if 語句跳轉


Jclasslib 觀測到jvm op code 如下

 

現在想更改>= <,怎麼辦?

查詢Opcode Mnemonics by Opcode

並查到 >= 的操作碼為 0xA1

 

所以只要用Ultraedit 修改 0xA1 為 0xA2 就可以了。

 

再次用jclasslib載入 .class 可以看到僅僅變更了比較的操作碼



相關推薦

檢視修改位元組從而實現替換他人jarclass檔案的目的

一、檢視二進位制位元組碼檔案的方式: 1.通過cmd命令:javap -v ClassA 2.通過jclasslib工具 二、將Android的apk中的dex反編成smail檔案,直接修改smail檔案後再回編成dex; 三、修改二進位制位元組碼檔案的方式: 1.反編

修改jarclass檔案

某日,想要更改jar包中的某個class檔案,有無rar無法解壓jar檔案,故找到如下方式進行操作 1、解壓某個jar包:在需要解壓的jar包目錄下,開啟命令列(cmd),輸入如下命令,輸入:C:\jar>jar xf lm.jar 沒有任何反應就表示解壓成功。 2、反編譯class檔案,相同路徑新

java實現:對jar的配置檔案修改

注:只修改檔案,其他會被清空  package com.mtpc.admin.util; import java.io.*; import java.util.*; import java.util.jar.JarEntry; import java.util.jar.J

【maven】排除mavenjar依賴的解決過程 例子:spring cloud啟動zipkin報錯maven依賴jar衝突 Class path contains multiple SLF4J bindings.

一直對於maven中解決jar包依賴問題的解決方法糾結不清: 下面這個例子可以說明一個很簡單的解決方法:     專案啟動報錯: Connected to the target VM, address: '127.0.0.1:59412', transport: 'sock

maven打包依賴第三方但不打進jar

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://m

使用 javassist 修改位元組實現 eureka-client 監聽服務啟動

專案中一些服務需要監聽其他微服務的啟動資訊,需要監聽到啟動後主動向其發請求拉取一些配置等。 可是eureka-client並未提供監聽其他服務啟動的事件,eureka-server倒是提供了事件, 可以在自己的eureka-server中監聽服務啟動,監聽後傳送服務啟動資訊到kafka這些訊息佇列,服務監聽k

使用JVM TI技術插裝位元組實現Java程式碼執行控監Agent

        JVM TI技術是JAVA5以後的版本推出的技術,即JVM程式設計介面,該技術廣泛應用於各種開發工具,例如Eclipse等。使用JVM TI可以開發JAVA除錯工具,JAVA程式碼執行監控工具等。同時,瞭解JVM TI技術也有助於JAVA程式設計師深入瞭解J

C# 鼠標點擊移動窗體代可以實現無邊框窗體的拖動

點擊 obj cat += tar sender see sed false private static bool IsDrag = false; private int enterX; private int enterY;

企業微信微信打通實現工作生活分離嗎?馬化騰這樣回答!江西德迅為你分解

分享 用戶 用戶數 通過 F12 中國 版本更新 數字 信任 4月12日,2018年中國“互聯網+”數字經濟峰會舉行,此次峰會迎來了騰訊、京東等眾多互聯網大企。在本次峰會上馬化騰發表演講,就早前企業微信與私人微信打通的話題,提出了自己的看法。此前內測版企業微信將與私人微信打

[轉帖]Oracle字符集的檢視修改 --- 還未嘗試 找個週六 試試. Oracle 字符集的檢視修改

Oracle 字符集的檢視和修改 感謝原作者 改天試試 https://www.cnblogs.com/rootq/articles/2049324.html   一、什麼是Oracle字符集        Or

Mysql基礎教程-Mysql的字符集檢視修改

Show variables like “%char%”修改mysql的字符集----資料庫級1)臨時的修改Set global character-set_server=utf82)永久修改Alter database commany set utf8 collate utf8_general_ci; -

gparted燒錄到U盤使其成為live usb從而實現U盤啟動並啟動gparted

  1.把zip包中的檔案解壓縮到U盤中,並且保持原目錄結構不變!也就是說,解壓縮到U盤根目錄中!自己不要增加目錄! 2.執行你U盤中utils/linux/目錄中的makeboot.bat檔案!(特別注意,此檔案一定要在U盤中執行,絕不允許在你的硬碟上執行!) 以上操作完畢後,即可用

Mysql的字符集檢視修改

Show variables like “%char%” 修改mysql的字符集 ----資料庫級 1)臨時的修改 Set global character-set_server=utf8 2)永久修改 Alter database commany set utf8 collate utf8

InstrumentationClassFileTransformer--位元組轉換工具

一個代理實現ClassFileTransformer介面用於改變執行時的位元組碼(class File),這個改變發生在jvm載入這個類之前。對所有的類載入器有效。 class File這個術語定義於虛擬機器規範3.1,指的是位元組碼的byte陣列,而不是檔案系統中的class檔案。

MySQL之檢視修改資料庫編碼

MySQL之檢視與修改資料庫編碼 Windows下修改mysql資料庫編碼 (1)管理員身份進入cmd,輸入:mysql -h伺服器地址 -u使用者名稱 -p密碼 ,最後按回車就行 2. 輸入show variables like ‘%character%’;

生成二維返回檔案位元組或將檔案轉成base64返回

    @PostMapping("/admin/get/qrcode")     public  ResponseEntity<byte[]>  getQrcode(Long id,boolean need

class檔案結構jvm位元組指令

https://blog.csdn.net/luckydog1991/article/details/51654964這篇文章詳細的介紹了class檔案和位元組碼指令 Class檔案結構 https://blog.csdn.net/tyrone1979/article/details/9

Intellij idea快速檢視Java類位元組(轉載)

原文地址 最近在研究JVM類載入、JVM位元組碼相關的東西,需要經常檢視位元組碼。之前都是用一些外部工具例如bytecoder、JD或者直接cmd使用javap的方式檢視位元組碼。但是使用起來比較麻煩,畢竟不如直接在IDE中直接檢視方便。於是在網上搜索,Intellij idea是否支援檢視位元

shell命令以及執行原理、檢視修改(umask)、Linux許可權管理、Linux設定檔案訪問許可權(chmod)、粘滯位、修改檔案的擁有者(chown)、修改檔案的所屬組(chgrp)

shell命令以及執行原理:   Linux嚴格意義上說的是一個作業系統,我們稱之為”核心”,但是我們普通使用者,不能直接使用核心,而是通過核心的”外殼”程式,也就是所謂的shell,來與核心溝通。   Linux中的命令大多數都是可執行程式。但其實捕捉我們

使用 Maven 外掛將 class位元組檔案resource(資原始檔)lib(依賴的jar)分開打包

1. 在pom檔案中對各個外掛進行配置 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20