方法就是,向Jar注入無效代碼(不合法的,或者根本不是代碼的字符串)。
那么無效的代碼又怎么能正確運行呢?
答案就是,你要保證你的代碼永遠不會執行到那一步。
我作一個簡單的例子說明:
我們建立一個項目:
- package com.TestJar;
- public class Main {
- public static void main(String[] args){
- System.out.println(Info.getMessage());
- }
- }
- package com.TestJar;
- public class Info {
- public static String getMessage(){
- return "Hello World!";
- }
- private class Invalid{
- }
- }
很簡單,運行結果是 Hello World!
然后我們將Info類輸出Jar
現在項目改成這樣:
運行結果仍然是 Hello World!
我們用jd-gui反編譯看看:
反編譯看得清清楚楚。
我們的私有內部類Invalid在程序中是沒有用。
現在,我們向Invalid類注入無效代碼。
注入方法很簡單,用WinRar之類的解壓軟件打開,修改,然后保存就行了
打開這個Invalid內部類
我們將圖中所選擇的字符'd'刪除
然后保存
刷新一下,程序仍然運行:Hello World!
再用jd-gui打開Info.jar
它反編譯到那里就出錯了。
注意不能將這個方法運行用Android項目上,Android有另一套規則,它需要把Jar轉換成dex的。
原文:https://blog.csdn.net/u013938484/article/details/80399242