本帖最后由 winding 于 2018-2-3 16:05 编辑
2018.02.03补充——该工具apk回编时有时失败,解决办法:
1.手工删除build文件夹,或者在批处理中增加一句自动删掉,自动将build文件夹删掉就好
(在最后pause 前增加一行del /s /q .\projects\%inputgc%\project\build\ )
2.在apktool.yml中增加忽略项。
————————————————————-——————————————————————
@冥界3大法王 这篇帖子的起因是以下两个帖子的延续 纯活人伪造一个Android Killer或APK IDE或apktool反编译失败 对《纯活人伪造一个Android Killer或APK IDE或apktool反编译失败》的一点讨论
问题的起因是对androidkiller和apkide对一些apk反编译源码卡死的问题后续救活处理的讨论。处理的方法前两个帖子讨论了,本帖是兑现承诺,顺着法王的思路,写一个能集合到androidkiller或者apkide里的自动化的小工具,实现对这类apk的逆向工程的救活。
反编译卡死的原因或许很多,本帖只讨论因为多dex,反编JAVA源码卡死的小工具的制作,只适用于该问题中这一小方面。其他因为工具版本问题等等原因,网上很多帖子了,照着更新apktools、dex2jar等插件就好。
因为现版本的apkide逆向项目是以包名作为工程文件夹的,没想到同时容纳两个dex的JAVA源码的办法,放弃了,这里仅讨论androidkiller。
一、救活的思路验证
前边贴中谈到,多dex反编JAVA源码卡死,其实是androidkille使用dex2jar反编JAVA的时候,没有考虑存在两个或者多个dex的情况。但是多dex反编smali已经实现了,而且worksrc文件夹下还有一级smali的目录,就给我们救活留下空间了。我们的思路很简单,使用dex2jar把样本( 见纯活人伪造一个Android Killer或APK IDE或apktool反编译失败)中的classes.dex和classes2.dex分别反编为java,重新构建一下逆向工程目录就OK了。这个想法验证是可行的(法王也验证过),贴一下过程。
androidkille反编样本111.apk(我随便改了个名字),反编译源码卡死,但是smali和smali_classes2都反编成功了。另外提取apk图标文件的过程也卡掉了,所以逆向工程没有显示图标,这个只对强迫症有影响,不够美观而已,没有别的影响。前边帖子贴图很多,这里不多贴了。
这里复制apk原始文件的过程也卡死了,没有建好build文件夹。这个是时好时坏,我们手动建吧。仿照其他完好的逆向工程的样式,在这里新建build/apk文件夹,把111.apk改名111.zip,解压进去。刷新一下工程。
好了。当然,这完全是强迫症患者的习惯,其实我们只要把两个dex解压出来就好
用逆向助手(或者任何一个其他工具,都一样,核心都是dex2jar,只是提供了图形界面,方便),把build/apk下的classes.dex和classes2.dex分别转为jar。
操作两次,分别得到classes_dex2jar.jar和classes2_dex2jar.jar
把这两个jar文件复制到111\ProjectSrc下面。classes.dex是andriodkiller复制过来卡死就放这里了,没用了,删掉就好。
新建smali和smali_classes2两个目录,目录名称是与两个smali文件夹的名称对应的。然后直接用winrar打开两个jar文件,classes_dex2jar.jar解压到smali文件夹,2解压到smali_classes2文件夹。注意解压时候的目录层级,不要多套一层目录。
这个是2的。
刷新androidkiller工程目录,两个dex的JAVA源码都可以看了。
以上,我们的思路是可行的,但每次都这么操作很麻烦,我们弄个小工具。
二、小工具制作
思路是制作一个批处理软件,操作build/apk目录下(当然你也可以不建这个文件夹,随便把所有dex解压出来放到一个地方就好)的所有dex文件,分别调用dex2jar转为jar文件;然后把得到的所有jar文件复制到逆向工程对应的worksrc文件夹下;再调用winrar解压jar文件,分别放到对应的smali、smali_classes2。。。。。等等文件夹下。就是把我们刚才手动做的工作重复一遍。最后利用androidkiller预留的自定义工具栏,把这个批处理文件集成到androidkiller主界面来。
工具的主体就是一个批处理文件,做这些自动化的工作;dex2jar直接调用androidkiller文件夹下边自带的,不用准备了;复制一个绿色版的winrar文件包过来,防止找不到或者没有装winrar软件。最终成型的工具包括一个批处理文件和一个winrar文件夹。
批处理不会写。。。临时百度的。各种出错总算能运行了,这里贴出来,很丑是肯定的,只看个思路就好。
[Shell] 纯文本查看 复制代码 @echo off
color 0A
echo ===========dex to Java===========
:start
cls
echo.请输入要处理的逆向工程名称,注意是 apk 的文件名,不是包名
set /p inputgc=
set current_dir=%~dp0
if not exist .\projects\%inputgc%\Project\build\apk\ (
echo "build文件夹未还原,请把apk文件复制到andriodkiller根目录后继续"
pause
ren %inputgc%.apk %inputgc%.zip
call .\winrar\winrar.exe x "%inputgc%.zip" -y "projects\%inputgc%\Project\build\apk\" && del %inputgc%.zip
)
for /r %%i in (projects\%inputgc%\Project\build\apk\*.dex) do call .\bin\dex2jar\d2j-dex2jar.bat -f %%i && echo "反编"%%i"为jar,完成"
xcopy *.jar /y .\projects\%inputgc%\ProjectSrc\
ren *.jar *.zip
xcopy *.zip /y .\projects\%inputgc%\ProjectSrc\
del *.zip
if exist .\projects\%inputgc%\ProjectSrc\classes-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali\" && del .\projects\%inputgc%\ProjectSrc\classes-dex2jar.zip && echo "解压classes-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes2-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes2-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes2\" && del .\projects\%inputgc%\ProjectSrc\classes2-dex2jar.zip && echo "解压classes2-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes3-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes3-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes3\" && del .\projects\%inputgc%\ProjectSrc\classes3-dex2jar.zip && echo "解压classes3-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes4-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes4-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes4\" && del .\projects\%inputgc%\ProjectSrc\classes4-dex2jar.zip && echo "解压classes4-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes5-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes5-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes5\" && del .\projects\%inputgc%\ProjectSrc\classes5-dex2jar.zip && echo "解压classes5-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes6-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes6-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes6\" && del .\projects\%inputgc%\ProjectSrc\classes6-dex2jar.zip && echo "解压classes6-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes7-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes7-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes7\" && del .\projects\%inputgc%\ProjectSrc\classes7-dex2jar.zip && echo "解压classes7-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes8-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes8-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes8\" && del .\projects\%inputgc%\ProjectSrc\classes8-dex2jar.zip && echo "解压classes8-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes9-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes9-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes9\" && del .\projects\%inputgc%\ProjectSrc\classes9-dex2jar.zip && echo "解压classes9-dex2jar.jar完毕")
if exist .\projects\%inputgc%\ProjectSrc\classes10-dex2jar.zip (call .\winrar\winrar.exe x .\projects\%inputgc%\ProjectSrc\classes10-dex2jar.zip -y ".\projects\%inputgc%\ProjectSrc\smali_classes10\" && del .\projects\%inputgc%\ProjectSrc\classes10-dex2jar.zip && echo "解压classes10-dex2jar.jar完毕")
echo "已处理完毕"
pause
最后的循环不会写,直接笨办法罗列的,罗列了10个为把以上内容存为motojava.bat(名字随意),放到andriodkiller根目录下(其实就是dex2jar和工程目录的共同上级目录,为了写相对路径方便)。
运行后,1.提示输入逆向工程的名称,以便得到逆向工程的文件夹名称;2.检测工程文件夹下如果没有build文件夹,说明复制原包文件失败了,需要手动复制apk文件(本例中是111.apk)到andriodkiller根目录后继续,批处理自动调用winrar解开apk包,建立好build/apk文件夹;3.然后调用dex2jar;4.复制移动文件(重命名为zip应该是多余的,汗);5.调用androidkiller根目录下winrar文件夹下的winrar.exe解压(考虑到有的电脑没装winrar,比如我的电脑第二系统就没装,弄了个绿色版winrar方便操作)。
其中,第2步复制apk文件过来,用完后会自动删除;另外apk的文件名(不包括扩展名)应与一开始输入的逆向工程名一致,请注意。如果不是闲得蛋疼中间把apk重命名了,应该是一致的。
效果1
在killer根目录下,红色标准的是我们增加的文件/文件夹。这个目录下如果有其他jar文件,或者zip文件,剪切到其他地方去,不然处理的时候会删掉。如果中间提示让手动复制apk文件的时候,也是放到这个文件夹。
效果2
好啦。
三、测试
我们把刚才的逆向工程全部删掉,用androidkiller重新反编apk,卡死后关掉androidkiller重新打开,点motojava的按钮,OK!
过程截图
最后效果,两个smali文件夹都可以看java源码了。
四、说明、不足和扩展
1.androidkiller软件中各个插件的版本,最好还是更新下。
2.我们看到逆向工程的图标没有弄出来,其实是没有完成提取apk中ico以及建立文件夹属性文档的工作。可以继续完善这个批处理,自AndroidManifest.xml中提取android:icon="@drawable/????"问号的部分,就是ico文件文件名,搜索????.jng文件复制到逆向工程目录底下,改扩展名为ico,建好文件夹属性文档就与正常的逆向工程一个样了。奈何批处理不熟,单靠几个小时百度拼出来的代码老出错,我就不弄了。感兴趣的自己试试。不弄这个也不影响,但毕竟好多人都有强迫症是不是
3.通过这次动手,感觉学点批处理还是很有用的,特别是可以给androidkiller集成一些功能。原来一直喜欢用androidkiller,不喜欢apkide,纯粹习惯原因,但apkide的一些功能,比如命令行工具等等,又很眼馋,这样思路打开后可以自己给androidkiller集成上了。比如,androidkiller经常连不上模拟器,需要手动打开cmd,杀adb.exe进程,打开androidkiller的adb,打开模拟器的adb,设置转发等等,台麻烦,就可以写个批处理,集成过来,到时候一点就行了,不用每次都费事;比如,自动脱壳工具需要输入一些命令,是不是也可以考虑集成为一个批处理,放到androidkiller中来。
成品放出来吧,反正源码都贴了,不怕笑话了
链接:https://pan.baidu.com/s/1mjNScSK 密码:f7fj
|