Skip to content
This repository has been archived by the owner on Aug 31, 2023. It is now read-only.

Updates to the script #4

Merged
merged 5 commits into from
Mar 30, 2015
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@ This is not made to encourage piracy/plagiarism.
Usage
--------------------
```
Usage: apk2java.py action file [options]
Usage: apk2java.py action ApkFileName [options]

action can only be 'b' (for build) and 'd' (for decompile)
Options:
-h, --help show this help message and exit
--java select java source format [DEFAULT]
Expand All @@ -40,3 +41,5 @@ apk-tool : http://code.google.com/p/android-apktool/

baksmali : http://code.google.com/p/smali/

Note: These tools and a smaple apk is downloaded by the script. There is not need to download them manually

59 changes: 32 additions & 27 deletions apk2java.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
apk_folder=''
project_name=''
sign_file=''
cwd=os.path.dirname(os.path.abspath(__file__))
home=os.path.dirname(os.path.realpath(sys.argv[0]))
tmp='/tmp/apk2java/'
outdir=os.path.dirname(os.path.realpath(sys.argv[1]))
external="https://github.com/TheZ3ro/apk2java-linux/releases/download/tool/tool.zip"

def check_home(path):
Expand Down Expand Up @@ -59,87 +60,90 @@ def apktool(smali):
print ("*********************************************")
if apk_file != '':
if smali == True:
call(home+'/tool/apktool_200rc3.jar d '+apk_file+' -o '+tmp+project_name+' -f',shell=True)
call(home+'/tool/apktool_200rc3.jar d '+apk_file+' -o '+outdir+project_name+' -f',shell=True)
else:
call(home+'/tool/apktool_200rc3.jar d '+apk_file+' -o '+tmp+project_name+' -sf',shell=True)
os.system('mv %s %s' % (tmp+project_name+'/classes.dex', tmp+project_name+'/original/'))
call(home+'/tool/apktool_200rc3.jar d '+apk_file+' -o '+outdir+project_name+' -sf',shell=True)
os.system('mv %s %s' % (outdir+project_name+'/classes.dex', outdir+project_name+'/original/'))
print ('Done')

def dex2jar():
print ("*********************************************")
print ("** Convert 'apk' to 'jar' **")
print ("*********************************************")
if apk_file != '':
call(home+'/tool/dex2jar-0.0.9.15/d2j-dex2jar.sh -f -o '+tmp+project_name+'.jar '+apk_file, shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-asm-verify.sh '+tmp+project_name+'.jar',shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-dex2jar.sh -f -o '+outdir+project_name+'.jar '+apk_file, shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-asm-verify.sh '+outdir+project_name+'.jar',shell=True)
print ('Done')

def procyon():
print ("*********************************************")
print ("** Decompiling class files **")
print ("*********************************************")
if apk_file != '':
call(home+'/tool/procyon-decompiler-0528.jar -jar '+tmp+project_name+'.jar -o '+tmp+project_name+'/src/',shell=True)
call(home+'/tool/procyon-decompiler-0528.jar -jar '+outdir+project_name+'.jar -o '+outdir+project_name+'/src/',shell=True)
print ('Done')

def apktool_build():
print ("*********************************************")
print ("** Building apk from smali **")
print ("*********************************************")
if apk_folder != '':
call(home+'/tool/apktool_200rc3.jar b '+apk_folder+' -o '+tmp+project_name+'-rebuild.apk',shell=True)
global sign_file
sign_file = tmp+project_name+'-rebuild.apk'
call(home+'/tool/apktool_200rc3.jar b '+apk_folder+' -o '+outdir+project_name+'-rebuild.apk',shell=True)
global sign_file
sign_file = outdir+project_name+'-rebuild.apk'
print ('Done')

def jar2jasmin():
print ("*********************************************")
print ("** Convert 'jar' to 'jasmin' **")
print ("*********************************************")
if apk_file != '':
call(home+'/tool/dex2jar-0.0.9.15/d2j-jar2jasmin.sh -f -o '+tmp+project_name+'/jasmin '+tmp+project_name+'.jar',shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-jar2jasmin.sh -f -o '+outdir+project_name+'/jasmin '+outdir+project_name+'.jar',shell=True)
print ('Done')

def jasmin_build():
print ("*********************************************")
print ("** Build apk from jasmin **")
print ("*********************************************")
if apk_folder != '':
call(home+'/tool/dex2jar-0.0.9.15/d2j-jasmin2jar.sh -f -o '+tmp+project_name+'-new.jar '+tmp+project_name+'/jasmin',shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-asm-verify.sh '+tmp+project_name+'-new.jar',shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-jar2dex.sh -f -o '+tmp+project_name+'/classes.dex '+tmp+project_name+'-new.jar',shell=True)
call('zip -r '+tmp+project_name+'-new.apk -j '+tmp+project_name+'/classes.dex',shell=True)
global sign_file
sign_file = tmp+project_name+'-new.apk'
call(home+'/tool/dex2jar-0.0.9.15/d2j-jasmin2jar.sh -f -o '+outdir+project_name+'-new.jar '+outdir+project_name+'/jasmin',shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-asm-verify.sh '+outdir+project_name+'-new.jar',shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-jar2dex.sh -f -o '+outdir+project_name+'/classes.dex '+outdir+project_name+'-new.jar',shell=True)
call('zip -r '+outdir+project_name+'-new.apk -j '+outdir+project_name+'/classes.dex',shell=True)
global sign_file
sign_file = outdir+project_name+'-new.apk'
print ('Done')

def sign():
print ("*********************************************")
print ("** Sign apk **")
print ("*********************************************")
call(home+'/tool/dex2jar-0.0.9.15/d2j-apk-sign.sh -f -o '+tmp+project_name+'-signed.apk '+sign_file,shell=True)
call(home+'/tool/dex2jar-0.0.9.15/d2j-apk-sign.sh -f -o '+outdir+project_name+'-signed.apk '+sign_file,shell=True)
print ('Done')

def main():
global apk_folder,apk_file,project_name,home
global apk_folder,apk_file,project_name,home,outdir
usage = "usage: %prog action file [options]"
parser = OptionParser(usage=usage)
parser.add_option("--java",action="store_true", dest="java", default=True, help="select java source format [DEFAULT]")
parser.add_option("--smali",action="store_true", dest="smali", default=False, help="select smali source format")
parser.add_option("--jasmin",action="store_true", dest="jasmin", default=False, help="select jasmin source format")
parser.add_option("--no-source",action="store_true", dest="nosc", default=False, help="no source code generation")
parser.add_option("-o", dest="outdir", default=cwd+"/", help="specify the output directory "
+"(if not specified the decomipled version will be store in a folder in the script directory)")
(options, args) = parser.parse_args()

if home == "/opt/apk2java":
if home == cwd+"/apk2java":
if check_home(home) == False:
getunzipped(external, home, report)
else:
if check_home(home) == False:
if check_home("/opt/apk2java") == False:
getunzipped(external, "/opt/apk2java", report)
home = "/opt/apk2java"
if check_home(cwd+"/apk2java") == False:
getunzipped(external, cwd+"/apk2java", report)
home = cwd+"/apk2java"
else:
home = "/opt/apk2java"
home = cwd+"/apk2java"
outdir = options.outdir

if (options.smali+options.jasmin+options.nosc) > 1:
print ("[ ERROR ] You can only select 1 source format --[smali/jasmin/java/no-source]")
Expand All @@ -149,7 +153,9 @@ def main():
if os.path.isfile(args[1]) and os.path.splitext(args[1])[-1].lower() == '.apk':
apk_file = args[1]
project_name = os.path.splitext(os.path.basename(args[1]))[0].lower()
call("cp "+apk_file+" "+tmp+project_name+"-new.apk",shell=True)
if not os.path.exists(outdir):
os.makedirs(outdir)
call("cp "+apk_file+" "+outdir+project_name+"-new.apk",shell=True)
if options.jasmin == True:
dex2jar()
jar2jasmin()
Expand Down Expand Up @@ -179,5 +185,4 @@ def main():

# Script start Here
if __name__=="__main__":
main()

main()