jd-gui众所周知,业界公认的反编译必备工具。

笔者目前遇到一个java项目,社区版,想做一个本地化的版本,询问官方,官方说闭源,无奈之下只能反编译了。

面对那么多jar,jd-gui一个个去反编译保存,工作量的确很大。幸好在网上找到一个不错的工具

高能预警:jd-gui反编译的错误的,你敢不敢放到cfr来反编译试一试,保证有惊喜。

CFR - another java decompiler

特性:

    CFR will decompile modern Java features - Java 8 lambdas (pre and post Java beta 103 changes),

   Java 7 String switches etc, but is written entirely in Java 6. 

支持主流java特性-java 8 lambdas表达式,java7字符串切换,最主要的他是用java6编写,这个就有点厉害了。

笔者还发现,他可以反编译类的注解,jd-gui无法反编译的 ,cfr却游刃有余。经过一番测试,毫不犹豫的把它收录到逆向兵器库。

使用方法比较简单,如下:

java -jar cfr_0_121.jar test.jar --outputdir c:/test

运行以上命令就可以把反编译后的test.jar代码保存到c:/test

笔者想要本地化的软件目录结构如下

└─proj
     ├─actions
     │ └─aaa.jar
     ├─drawing.jar
     ├─favs.jar
     ├─feeders.jar
     ├─imex.jar
     ├─impl.jar
     ├─language.jar
     ├─option.jar
     ├─resources.jar
     ├─runtime.jar
     ├─test.jar
     ├─treelist.jar
     └─view
          ├─editor.jar
          ├─progress.jar
          └─startup.jar

上面的jar如果用jd-gui手工反编译工作量很大,如果项目庞大,每次反编译将耽误好多时间。

于是笔者写了一个批处理decompile.bat,可以用于批量反编译,代码如下:

可以把需要单独需要反编译的jar拖拽到批处理文件上,默认情况下反编译当前目录及其子目录的所有jar

@echo off
color 17

if "%1" == "" (
    for /f "delims=" %%i in ('dir /s /b /a-d /o-s *.jar') do (
        echo 正在反编译 %%~ni...
        title 正在反编译 %%i...
        java -jar D:\develop\java逆向\cfr_0_122.jar "%%i" --caseinsensitivefs true  --outputdir "%%~di%%~pi%%~ni"
        echo ----%%i已经翻反编译---
    )
    goto :end 
) else (
    title 正在反编译 %1...
    java -jar D:\develop\java逆向\cfr_0_122.jar %1 --caseinsensitivefs true  --outputdir "%~d1%~p1%~n1"
    echo 反编译完成.
    goto :end
)

echo 反编译完成.
@pause>nul

:end
pause
exit

 

只要你把这个文件保存下来,放到项目根目录,运行以后,每个目录中都会根据jar文件名生成一个目录,里面是反编译后的Java代码。

 

 

反编译class脚本

@echo off
chcp 65001 >nul
color 17

:: 设置JDK和CFR路径
set JAVA_HOME=D:\develop\java\jdk1.8.0_202
set CFR_JAR=D:\develop\cfr-0.152.jar

:: 设置统一的输出目录
set OUTPUT_DIR=E:\workspace\java\new-hr\WEB-INF\classes2

:: 创建输出目录(如果不存在)
if not exist "%OUTPUT_DIR%" mkdir "%OUTPUT_DIR%"

echo ================================
echo    Java类文件反编译工具
echo ================================
echo.

if "%1" == "" (
    echo 正在扫描当前目录及子目录下的.class文件...
    echo 将跳过包含$符号的文件...
    echo.
    
    for /f "delims=" %%i in ('dir /s /b /a-d *.class') do (
        :: 检查文件名是否包含$,如果包含则跳过
        echo "%%~nxi" | find "$" >nul
        if errorlevel 1 (
            echo 正在反编译: %%~ni...
            title 正在反编译 %%~ni...
            "%JAVA_HOME%\bin\java" -jar "%CFR_JAR%" "%%i" --caseinsensitivefs true --hideutf false --outputencoding UTF-8 --outputpath "%OUTPUT_DIR%" --silent true
            echo ---- %%i 已反编译完成 ---
            echo.
        ) else (
            echo 跳过包含$的文件: %%~nxi
        )
    )
) else (
    echo 正在反编译指定文件: %1...
    title 正在反编译 %1...
    "%JAVA_HOME%\bin\java" -jar "%CFR_JAR%" "%1" --caseinsensitivefs true --hideutf false --outputencoding UTF-8 --outputpath "%OUTPUT_DIR%" --silent true
    echo 文件反编译完成.
)

echo.
echo ================================
echo 所有文件已反编译到: %OUTPUT_DIR%
echo ================================
pause
exit

  

posted on 2017-06-13 13:26  你不知道的浪漫  阅读(6159)  评论(0)    收藏  举报