├── note.md ├── test.py ├── moji ├── uitest.py ├── LibArt.py ├── test1.js ├── test.js └── fangtianxia.js ├── README.md ├── eleme ├── debug.log ├── aaa.csv ├── bbb.csv ├── LibArt.py ├── ID数据去重后_harf.txt ├── testOpenPic.py ├── testSeleniumHtml.py ├── shoplist.py ├── testWebDriver1.py ├── testWebDriver.py ├── test.js ├── test1.js ├── test.html └── 剩余.txt ├── Native.py ├── alipay ├── collectEnergy.py └── collect.js ├── DexUnpack ├── LibArt.py ├── dump_dex_1.js ├── OpenMemory.js ├── dump_dex_3.js ├── dump_dex_2.js └── unpack.js ├── jd ├── LibArt.py └── libSo.js ├── BaiDuVIPHook.py ├── NativeDemo.js ├── HillClimb.py ├── BaiDuVIPHook.js ├── HillClimb.js ├── weibo ├── LibArt.py └── test.js ├── HookSO ├── LibArt.py └── test.js ├── haokan ├── LibArt.py ├── testWebDriver.py └── test.js ├── Wechat ├── test.py └── test.js └── douban ├── test.py └── test.js /note.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /test.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /moji/uitest.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FridaPractice -------------------------------------------------------------------------------- /eleme/debug.log: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vgyg/FridaPractice/HEAD/eleme/debug.log -------------------------------------------------------------------------------- /eleme/aaa.csv: -------------------------------------------------------------------------------- 1 | http://s3plus-img.sankuai.com/skynet/020096F5C748BE150C7C45EFB6D907E2.jpeg%40600h%7Cwatermark%3D1%26align%3D1%26x%3D20%26object%3Dd2F0ZXJtYXJrLTIwMTYxMTEwMS5wbmc%3D%0A%26p%3D5%26t%3D15%26order%3D0?AWSAccessKeyId=c64763be32f940a49e91fac6670f2fff&Expires=1592022648&Signature=LTKkvyLFy8P5cSYAVqej%2Ft%2BRpvY%3D -------------------------------------------------------------------------------- /Native.py: -------------------------------------------------------------------------------- 1 | import frida,sys 2 | 3 | 4 | jscode=""" 5 | 6 | """ 7 | 8 | 9 | 10 | process = frida.get_usb_device().attach('com.fingersoft.hillclimb') 11 | print('[*] process') 12 | script = process.create_script(jscode) 13 | def on_message(message,data): 14 | print (message) 15 | script.on("message",on_message) 16 | script.load() 17 | sys.stdin.read() 18 | 19 | 20 | 21 | 22 | -------------------------------------------------------------------------------- /eleme/bbb.csv: -------------------------------------------------------------------------------- 1 | 191842456 2 | 169120568 3 | 190720200 4 | 98440497 5 | 177499997 6 | 189707829 7 | 5402225 8 | 95071585 9 | 101013849 10 | 186867907 11 | 1664110178 12 | 193925241 13 | 157725290 14 | 79149742 15 | 1652232 16 | 316564 17 | 160272861 18 | 182139647 19 | 184041031 20 | 265131 21 | 193963943 22 | 1377797458 23 | 1941944581 24 | 182435473 25 | 160400813 26 | 187443587 27 | 95589893 28 | 193877532 29 | 159206731 30 | 686291413 31 | 188540508 -------------------------------------------------------------------------------- /alipay/collectEnergy.py: -------------------------------------------------------------------------------- 1 | import frida,sys 2 | def on_message(message, data): 3 | if message['type'] == 'send': 4 | print("[*] {0}".format(message['payload'])) 5 | else: 6 | print(message) 7 | device = frida.get_usb_device() 8 | print(device) 9 | packageName = "com.eg.android.AlipayGphone" 10 | pid = device.spawn(packageName) 11 | session =device.attach(pid) 12 | 13 | 14 | js=open("collect.js","r").read() 15 | script = session.create_script(js) 16 | script.on("message" , on_message) 17 | script.load() 18 | device.resume(pid) 19 | sys.stdin.read() -------------------------------------------------------------------------------- /eleme/LibArt.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import frida 3 | # 4 | def on_message(message, data): 5 | if message['type'] == 'send': 6 | print("[*] {0}".format(message['payload'])) 7 | else: 8 | print(message) 9 | # packageName = "me.ele" 10 | packageName = "com.smile.gifmaker" 11 | process = frida.get_usb_device(1).attach(packageName) 12 | print('[*] process') 13 | js=open("test1.js","r", encoding='UTF-8').read() 14 | script = process.create_script(js) 15 | script.on("message",on_message) 16 | script.load() 17 | sys.stdin.read() 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /DexUnpack/LibArt.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import frida 3 | 4 | def on_message(message, data): 5 | if message['type'] == 'send': 6 | print("[*] {0}".format(message['payload'])) 7 | else: 8 | print(message) 9 | 10 | device = frida.get_usb_device() 11 | print(device) 12 | # packageName = "com.wm.dmall" 13 | # packageName = "com.aigz.cloudgame" 14 | packageName = "com.next.netcraft.aligamet" 15 | pid = device.spawn(packageName) 16 | session =device.attach(pid) 17 | 18 | 19 | js=open("unpack.js","r").read() 20 | script = session.create_script(js) 21 | script.on("message" , on_message) 22 | script.load() 23 | device.resume(pid) 24 | sys.stdin.read() 25 | 26 | 27 | -------------------------------------------------------------------------------- /jd/LibArt.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import frida 3 | 4 | def on_message(message, data): 5 | if message['type'] == 'send': 6 | print("[*] {0}".format(message['payload'])) 7 | else: 8 | print(message) 9 | 10 | device = frida.get_remote_device() 11 | print(device) 12 | packageName = "com.ldzs.zhangxin" 13 | # packageName = "com.baidu.wenku" 14 | # packageName = "com.tuan800.tao800" 15 | # packageName = "com.wm.dmall" 16 | pid = device.spawn(packageName) 17 | session =device.attach(pid) 18 | js=open("dump_dex_3.js","r", encoding='UTF-8').read() 19 | script = session.create_script(js) 20 | script.on("message", on_message) 21 | script.load() 22 | device.resume(pid) 23 | sys.stdin.read() 24 | 25 | 26 | -------------------------------------------------------------------------------- /BaiDuVIPHook.py: -------------------------------------------------------------------------------- 1 | import frida,sys 2 | 3 | jscode = """ 4 | 5 | if(Java.available){ 6 | Java.perform(function () { 7 | var a = Java.use("com.baidu.netdisk.account.io._.a"); 8 | a._.implementation=function (a,b) { 9 | console.log("Hook Start..."); 10 | send('arg0: '+ a); 11 | send('arg1: '+ b); 12 | send('result: '+ this._(a,b)); 13 | return 2; 14 | } 15 | }); 16 | } 17 | 18 | """ 19 | process = frida.get_usb_device().attach('com.baidu.netdisk') 20 | print('[*] process') 21 | script = process.create_script(jscode) 22 | def on_message(message,data): 23 | print (message) 24 | script.on("message",on_message) 25 | 26 | script.load() 27 | sys.stdin.read() -------------------------------------------------------------------------------- /NativeDemo.js: -------------------------------------------------------------------------------- 1 | // setImmediate(function() { 2 | // console.log("[*] Native Starting script"); 3 | // var nativePointer = Module.findExportByName("libnative-lib.so","Java_ese_xposedtest_MainActivity_stringFromJNI"); 4 | // send("nativePointer--->"+nativePointer); 5 | // Interceptor.attach(nativePointer,{ 6 | // onEnter:function(args){ 7 | // console.log("ok"); 8 | // send("Sart arg-->"+args[0]+" "+args[1]); 9 | // }, 10 | // onLeave:function(retval){ 11 | // send("return value:"+retval); 12 | // } 13 | // }); 14 | // }) 15 | 16 | setImmediate(function () { 17 | console.log("start..."); 18 | var nativeso = Module.load() 19 | 20 | }) 21 | -------------------------------------------------------------------------------- /HillClimb.py: -------------------------------------------------------------------------------- 1 | import frida,sys 2 | 3 | # gem lock 1,000,000 4 | jscode=""" 5 | if(Java.available){ 6 | Java.perform(function () { 7 | var InAppPurchaseStore = Java.use("com.fingersoft.game.InAppPurchaseStore"); 8 | InAppPurchaseStore.getGems.implementation=function (a) { 9 | console.log("Hook Start..."); 10 | console.log("gem: "+InAppPurchaseStore.getGems(a)); 11 | return 1000000; 12 | } 13 | }); 14 | } 15 | """ 16 | 17 | process = frida.get_usb_device().attach('com.fingersoft.hillclimb') 18 | print('[*] process') 19 | script = process.create_script(jscode) 20 | def on_message(message,data): 21 | print (message) 22 | script.on("message",on_message) 23 | 24 | script.load() 25 | sys.stdin.read() 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /BaiDuVIPHook.js: -------------------------------------------------------------------------------- 1 | // Java.perform(function () { 2 | // // Function to hook is defined here 3 | // var a = Java.use('com.baidu.netdisk.account.io._.a'); 4 | // a._.implementation=function(){ 5 | // return 2; 6 | // } 7 | // }); 8 | // 9 | // if(Java.available){ 10 | // Java.perform(function(){ 11 | // var MainActivity = Java.use("com.luoyesiqiu.crackme.MainActivity"); 12 | // MainActivity.isExcellent.overload("int","int").implementation=function(chinese,math){ 13 | // return this.isExcellent(95,96); 14 | // } 15 | // }); 16 | // 17 | // } 18 | 19 | if(Java.available){ 20 | Java.perform(function () { 21 | var a = Java.use("com.baidu.netdisk.account.io._.a"); 22 | a._.implementation=function () { 23 | print('[*] Running CTF'); 24 | console.log('[*] Running CTF '); 25 | return 2; 26 | } 27 | }); 28 | } -------------------------------------------------------------------------------- /eleme/ID数据去重后_harf.txt: -------------------------------------------------------------------------------- 1 | 桥福缘花甲粉(瓜瓜美食城店),191842456,酒仙桥, 2 | 杨八婆串串香,169120568,安贞, 3 | 战粮快餐(和平街店),190720200,安贞, 4 | 京秦缘(六佰本广顺北大街店),98440497,望京, 5 | 牛街老爆肚满(雅宝路店),177499997,朝外大街_世贸天阶, 6 | 老乾杯(王府中环店),189707829,王府井_东单, 7 | 丽江庭院私宴,5402225,朝阳门, 8 | 莫离麻辣烫,95071585,西直河_亦庄, 9 | 川湘鲁家常菜(高碑店路店),101013849,王四营, 10 | 董记煎饼,186867907,王四营, 11 | 星野日式料理,1664110178,三里屯_工体, 12 | 面饭香海鲜烧烤,193925241,朝阳大悦城, 13 | 金家活烤鳗鱼(北京店),157725290,东坝, 14 | 牛B烤肉,79149742,双桥, 15 | 美山日本料理(亮马桥店),1652232,朝阳公园, 16 | 王府茶楼养生宴(朝阳公园店),316564,朝阳公园, 17 | 二小碳烤羊腿,160272861,劲松, 18 | 老坛酸菜米线,182139647,劲松, 19 | 紫燕百味鸡(大屯路店),184041031,大屯, 20 | 阿森鲍鱼(亚运村店),265131,大屯, 21 | 好利来(常营华联店),193963943,常营, 22 | 九门炸鸡(常营店),1377797458,常营, 23 | 西四包子铺(长楹天街店),1941944581,常营, 24 | 铁瓷儿小馆,182435473,常营, 25 | 艾谱莉创意烤串(常营华联店),160400813,常营, 26 | 熊成猫串串锅(新奥店),187443587,鸟巢_水立方, 27 | 鸟巢海鲜自助餐厅(鸟巢店),95589893,鸟巢_水立方, 28 | 果知(原麦山丘对面),193877532,鸟巢_水立方, 29 | 立康烤鸭·淮扬菜(亚运村店),159206731,对外经贸, 30 | 贡茶,686291413,对外经贸, 31 | 山西面食,188540508,对外经贸, -------------------------------------------------------------------------------- /eleme/testOpenPic.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | import time 3 | import win32api 4 | import win32con 5 | import os 6 | 7 | list1 = open("bbb.csv", "r", encoding='UTF-8').readlines() 8 | 9 | for i in range(0, len(list1)): 10 | url = list1[i] 11 | print(url) 12 | driver = webdriver.Chrome() 13 | driver.get(url) # 模拟键盘操作 14 | win32api.keybd_event(17, 0, 0, 0) # 按下ctrl 15 | win32api.keybd_event(65, 0, 0, 0) # 按下a 16 | win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放a 17 | win32api.keybd_event(83, 0, 0, 0) # 按下s 18 | win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放s 19 | win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放ctrl 20 | time.sleep(1) 21 | win32api.keybd_event(13, 0, 0, 0) # 按下enter 22 | win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放enter 23 | # 预估下载时间,后期根据实际网速调整 24 | time.sleep(2) 25 | # 关闭webdriver 26 | driver.close() 27 | -------------------------------------------------------------------------------- /HillClimb.js: -------------------------------------------------------------------------------- 1 | if(Java.available){ 2 | Java.perform(function () { 3 | var InAppPurchaseStore = Java.use("com.fingersoft.game.InAppPurchaseStore"); 4 | InAppPurchaseStore.getCoins.implementation=function (a) { 5 | console.log("Hook Start..."); 6 | console.log('arg0: '+ a); 7 | send('arg0: '+ a); 8 | return this.getCoins(a); 9 | } 10 | }); 11 | } 12 | 13 | 14 | if(Java.available){ 15 | Java.perform(function () { 16 | var context = Java.use("android.content.Context"); 17 | console.log('Context is done'); 18 | context.getSharedPreferences.overload("java.lang.String","int").implementation=function () { 19 | console.log("Hook Start..."); 20 | send('arg0: '+ a); 21 | send('arg1: '+ b); 22 | 23 | send('result: '+ this.getSharedPreferences.overload("java.lang.String","int")(a,b)); 24 | return this.getSharedPreferencesoverload("java.lang.String","int")(a,b); 25 | } 26 | }); 27 | } -------------------------------------------------------------------------------- /weibo/LibArt.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import frida 3 | 4 | def on_message(message, data): 5 | if message['type'] == 'send': 6 | print("[*] {0}".format(message['payload'])) 7 | else: 8 | print(message) 9 | 10 | device = frida.get_remote_device() 11 | print(device) 12 | packageName = "com.jingdong.app.mall" 13 | pid = device.spawn(packageName) 14 | session =device.attach(pid) 15 | js=open("libSo.js","r", encoding='UTF-8').read() 16 | script = session.create_script(js) 17 | script.on("message", on_message) 18 | script.load() 19 | device.resume(pid) 20 | sys.stdin.read() 21 | 22 | 23 | 24 | 25 | # 26 | # device = frida.get_remote_device() 27 | # print(device) 28 | # packageName = "com.jingdong.app.mall" 29 | # process = frida.get_remote_device().attach(packageName) 30 | # print('[*] process') 31 | # js=open("test.js","r", encoding='UTF-8').read() 32 | # script = process.create_script(js) 33 | # def on_message(message,data): 34 | # print (message) 35 | # script.on("message",on_message) 36 | # script.load() 37 | # sys.stdin.read() 38 | -------------------------------------------------------------------------------- /moji/LibArt.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import frida 3 | # 4 | def on_message(message, data): 5 | if message['type'] == 'send': 6 | print("[*] {0}".format(message['payload'])) 7 | else: 8 | print(message) 9 | # 10 | # # device = frida.get_remote_device() 11 | # # print(device) 12 | # # packageName = "com.sina.weibo" 13 | # # pid = device.spawn(packageName) 14 | # # print(pid) 15 | # # session =device.attach(pid) 16 | # # js=open("test.js","r", encoding='UTF-8').read() 17 | # # script = session.create_script(js) 18 | # # script.on("message", on_message) 19 | # # script.load() 20 | # # # device.resume(pid) 21 | # # sys.stdin.read() 22 | # # # 23 | # # # 24 | # 25 | packageName = "com.sina.weibo" 26 | process = frida.get_remote_device().attach(packageName) 27 | print('[*] process') 28 | js=open("test.js","r", encoding='UTF-8').read() 29 | script = process.create_script(js) 30 | # def on_message(message,data): 31 | # print (message) 32 | script.on("message",on_message) 33 | script.load() 34 | sys.stdin.read() 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /HookSO/LibArt.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import frida 3 | # 4 | def on_message(message, data): 5 | if message['type'] == 'send': 6 | print("[*] {0}".format(message['payload'])) 7 | else: 8 | print(message) 9 | # 10 | # # device = frida.get_remote_device() 11 | # # print(device) 12 | # # packageName = "com.sina.weibo" 13 | # # pid = device.spawn(packageName) 14 | # # print(pid) 15 | # # session =device.attach(pid) 16 | # # js=open("test.js","r", encoding='UTF-8').read() 17 | # # script = session.create_script(js) 18 | # # script.on("message", on_message) 19 | # # script.load() 20 | # # # device.resume(pid) 21 | # # sys.stdin.read() 22 | # # # 23 | # # # 24 | # 25 | packageName = "com.sina.weibo" 26 | process = frida.get_remote_device().attach(packageName) 27 | print('[*] process') 28 | js=open("test.js","r", encoding='UTF-8').read() 29 | script = process.create_script(js) 30 | # def on_message(message,data): 31 | # print (message) 32 | script.on("message",on_message) 33 | script.load() 34 | sys.stdin.read() 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /haokan/LibArt.py: -------------------------------------------------------------------------------- 1 | import sys 2 | import frida 3 | # 4 | def on_message(message, data): 5 | if message['type'] == 'send': 6 | print("[*] {0}".format(message['payload'])) 7 | else: 8 | print(message) 9 | # 10 | # # device = frida.get_remote_device() 11 | # # print(device) 12 | # # packageName = "com.sina.weibo" 13 | # # pid = device.spawn(packageName) 14 | # # print(pid) 15 | # # session =device.attach(pid) 16 | # # js=open("test.js","r", encoding='UTF-8').read() 17 | # # script = session.create_script(js) 18 | # # script.on("message", on_message) 19 | # # script.load() 20 | # # # device.resume(pid) 21 | # # sys.stdin.read() 22 | # # # 23 | # # # 24 | # 25 | packageName = "com.sina.weibo" 26 | process = frida.get_remote_device().attach(packageName) 27 | print('[*] process') 28 | js=open("test.js","r", encoding='UTF-8').read() 29 | script = process.create_script(js) 30 | # def on_message(message,data): 31 | # print (message) 32 | script.on("message",on_message) 33 | script.load() 34 | sys.stdin.read() 35 | 36 | 37 | 38 | 39 | 40 | 41 | -------------------------------------------------------------------------------- /eleme/testSeleniumHtml.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | import time 3 | 4 | options = webdriver.ChromeOptions() 5 | options.add_argument('--save-page-as-mhtml') 6 | # 设置chromedriver,并打开webdriver 7 | driver = webdriver.Chrome(chrome_options=options) 8 | get_html = "test.html" 9 | # 打开文件,准备写入 10 | f = open(get_html, 'wb') 11 | url = 'https://meishi.meituan.com/i/certificate/foodsafety?mtId=96772281&f=android&token=owBCehCGJhqOWHy7FNUYDrDbOkAAAAAAQgoAAGKADLeGiP-GwlKooA-QA-v3JIr7I53-j-23hg8iPjYW0V58eCgWgK1Bg6kmUd4y9g&userid=290604810&lat=39.87494107082511&lng=116.68543279811433&utm_source=undefined&utm_medium=android&utm_term=1000060203&version_name=10.6.203&utm_content=862400048396856&utm_campaign=AgroupBgroupC0D200E243168466715547220197960310848290710313_a96772281_c5_e7734547612518489833Ghomepage_category2_1__a1__c-1024__gfood__hpoilist__i56&ci=1&msid=8624000483968561585628957294&uuid=000000000000090CAE6634A8D42948748FEBCC1557198A157954239667625851' # 这里填你要保存的网页的网址 12 | driver.get(url) 13 | time.sleep(2) # 保证浏览器响应成功后再进行下一步操作 14 | # 写入文件 15 | f.write(driver.page_source.encode("utf-8", "ignore")) # 忽略非法字符 16 | print('写入成功') 17 | # 关闭文件 18 | f.close() 19 | -------------------------------------------------------------------------------- /DexUnpack/dump_dex_1.js: -------------------------------------------------------------------------------- 1 | //frida -U -f com.min.app.sample -l ./src/script/dump_dex_1.js --no-pause 2 | 3 | var openMemoryName = '_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_'; 4 | 5 | Interceptor.attach(Module.findExportByName('libart.so', openMemoryName), { 6 | onEnter: function(args) { 7 | var begin = args[1]; 8 | var address = parseInt(begin, 16) + 0x20; 9 | var dex_size = Memory.readInt(ptr(address)); 10 | 11 | console.log("\n start dump dex: begin=" + begin + " , dex_size=" + dex_size); 12 | //dump dex 到/data/data/pkg/目录下 13 | var file = new File("/data/data/com.min.app.sample/" + dex_size + ".dex", "wb"); 14 | file.write(Memory.readByteArray(begin, dex_size)); 15 | file.flush(); 16 | file.close(); 17 | console.log("end dump dex"); 18 | }, 19 | onLeave: function(retval) { 20 | if (retval.toInt32() > 0) {} 21 | } 22 | }); 23 | 24 | function dump(pointer, len) { 25 | var str = hexdump(pointer, { 26 | offset: 0, 27 | length: len, 28 | header: true, 29 | ansi: true 30 | }); 31 | console.log(str) 32 | } 33 | -------------------------------------------------------------------------------- /weibo/test.js: -------------------------------------------------------------------------------- 1 | // if (Java.available) { 2 | // Java.perform(function () { 3 | // var c = Java.use("com.sina.weibo.applicationInit.b.a.c");//com.sina.weibo.applicationInit.b.a.c.a 4 | // c.l.implementation = function (a) { 5 | // console.warn("Hook ..."); 6 | // console.warn('a: ' + a); 7 | // console.warn('ret: ' + this.l(a)); 8 | // return this.l(a); 9 | // }; 10 | // 11 | // }); 12 | if(Java.available){ 13 | Java.perform(function () { 14 | var PatchProxy = Java.use("com.meituan.robust.PatchProxy");//com.sina.weibo.applicationInit.b.a.c.a 15 | PatchProxy.isSupport.implementation = function (a) { 16 | console.warn("Hook isSupport ..."); 17 | return this.isSupport(a); 18 | }; 19 | 20 | }); 21 | } 22 | // 23 | // 24 | // var odule = Module.ensureInitialized("libutility.so"); 25 | // var name = Module.getExportByName(null, "getDecryptionString"); 26 | // Interceptor.attach(name, { 27 | // onEnter: function (args) { 28 | // console.log("arg[0]: ", args[0]); 29 | // 30 | // }, 31 | // onLeave: function (retval) { 32 | // console.log("retval: ", retval); 33 | // } 34 | // }); -------------------------------------------------------------------------------- /Wechat/test.py: -------------------------------------------------------------------------------- 1 | import frida,sys 2 | 3 | jscode = """ 4 | 5 | if (Java.available) { 6 | Java.perform(function () { 7 | var SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); 8 | var ContentValues = Java.use("android.content.ContentValues"); 9 | SQLiteDatabase.insert.implementation = function (a, b, c) { 10 | 11 | console.warn("Hook Start..."); 12 | console.warn('arg0: ' + a); 13 | console.warn('arg1: ' + b); 14 | console.warn('arg2: ' + c); 15 | var m_contentCalues = Java.cast(c,ContentValues) 16 | console.warn('type: ' + m_contentCalues.getAsString("cre_name")); 17 | console.warn('content: ' + m_contentCalues.getAsString("content")); 18 | 19 | return this.insert(a, b, c); 20 | } 21 | SQLiteDatabase.getLabel.implementation=function () { 22 | console.warn('result: ' + this.getLable()); 23 | return this.getLabel(); 24 | } 25 | }); 26 | } 27 | 28 | """ 29 | process = frida.get_usb_device().attach('com.tencent.mm') 30 | print('[*] process') 31 | script = process.create_script(jscode) 32 | def on_message(message,data): 33 | print (message) 34 | script.on("message",on_message) 35 | script.load() 36 | sys.stdin.read() -------------------------------------------------------------------------------- /douban/test.py: -------------------------------------------------------------------------------- 1 | import frida,sys 2 | 3 | jscode = """ 4 | 5 | if (Java.available) { 6 | Java.perform(function () { 7 | var SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); 8 | var ContentValues = Java.use("android.content.ContentValues"); 9 | SQLiteDatabase.insert.implementation = function (a, b, c) { 10 | 11 | console.warn("Hook Start..."); 12 | console.warn('arg0: ' + a); 13 | console.warn('arg1: ' + b); 14 | console.warn('arg2: ' + c); 15 | var m_contentCalues = Java.cast(c,ContentValues) 16 | console.warn('type: ' + m_contentCalues.getAsString("cre_name")); 17 | console.warn('content: ' + m_contentCalues.getAsString("content")); 18 | 19 | return this.insert(a, b, c); 20 | } 21 | SQLiteDatabase.getLabel.implementation=function () { 22 | console.warn('result: ' + this.getLable()); 23 | return this.getLabel(); 24 | } 25 | }); 26 | } 27 | 28 | """ 29 | process = frida.get_usb_device().attach('com.tencent.mm') 30 | print('[*] process') 31 | script = process.create_script(jscode) 32 | def on_message(message,data): 33 | print (message) 34 | script.on("message",on_message) 35 | script.load() 36 | sys.stdin.read() -------------------------------------------------------------------------------- /DexUnpack/OpenMemory.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | var liba =Module.findBaseAddress('libart.so'); 3 | Interceptor.attach(Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"), { 4 | onEnter: function (args) { 5 | var begin = args[1] 6 | console.log("magic : " + Memory.readUtf8String(begin)) 7 | var address = parseInt(begin, 16) + 0x20 8 | console.log("address : " + address) 9 | var dex_size = Memory.readInt(ptr(address)) 10 | console.log("dex_size :" + dex_size) 11 | // console.log(hexdump(liba, { 12 | // offset: address, 13 | // length: 16, 14 | // header: false, 15 | // ansi: false 16 | // })); 17 | // hexdump dex to /data/data/pkg/dir 18 | var packageName = "com.aigz.cloudgame" 19 | var file = new File("/data/data/com.aigz.cloudgame/" + dex_size + ".dex", "wb+") 20 | file.write(Memory.readByteArray(begin, dex_size)) 21 | console.log("finish !!") 22 | file.flush() 23 | file.close() 24 | }, 25 | onLeave: function (retval) { 26 | if (retval.toInt32() > 0) { 27 | /* do something */ 28 | } 29 | } 30 | }); -------------------------------------------------------------------------------- /Wechat/test.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | var SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); 4 | var ContentValues = Java.use("android.content.ContentValues"); 5 | SQLiteDatabase.insert.implementation = function (a, b, c) { 6 | 7 | console.warn("Hook Start..."); 8 | console.warn('arg0: ' + a); 9 | console.warn('arg1: ' + b); 10 | console.warn('arg2: ' + c); 11 | var m_contentCalues = Java.cast(obj,ContentValues) 12 | console.warn('type: ' + m_contentCalues.getAsInteger("type")); 13 | 14 | return this.insert(a, b, c); 15 | } 16 | SQLiteDatabase.getLabel.implementation=function () { 17 | console.warn('result: ' + this.getLable()); 18 | return this.getLabel(); 19 | } 20 | }); 21 | } 22 | 23 | 24 | 25 | 26 | if (Java.available) { 27 | Java.perform(function () { 28 | var SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); 29 | var ContentValues = Java.use("android.content.ContentValues"); 30 | SQLiteDatabase.openDatabase.overload('java.lang.String','[B','com.tencent.wcdb.database.SQLiteCipherSpec','com.tencent.wcdb.database.SQLiteDatabase$CursorFactory','int', 'com.tencent.wcdb.DatabaseErrorHandler', 'int' ).implementation = function (a, b, c,d,e,f,g) { 31 | 32 | console.warn("Hook Start..."); 33 | console.warn('arg0: ' + a); 34 | console.warn('arg1: ' + b); 35 | console.warn('arg2: ' + c); 36 | return this.insert(a, b, c,d,e,f,g); 37 | } 38 | }); 39 | } -------------------------------------------------------------------------------- /douban/test.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | var SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); 4 | var ContentValues = Java.use("android.content.ContentValues"); 5 | SQLiteDatabase.insert.implementation = function (a, b, c) { 6 | 7 | console.warn("Hook Start..."); 8 | console.warn('arg0: ' + a); 9 | console.warn('arg1: ' + b); 10 | console.warn('arg2: ' + c); 11 | var m_contentCalues = Java.cast(obj,ContentValues) 12 | console.warn('type: ' + m_contentCalues.getAsInteger("type")); 13 | 14 | return this.insert(a, b, c); 15 | } 16 | SQLiteDatabase.getLabel.implementation=function () { 17 | console.warn('result: ' + this.getLable()); 18 | return this.getLabel(); 19 | } 20 | }); 21 | } 22 | 23 | 24 | 25 | 26 | if (Java.available) { 27 | Java.perform(function () { 28 | var SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase"); 29 | var ContentValues = Java.use("android.content.ContentValues"); 30 | SQLiteDatabase.openDatabase.overload('java.lang.String','[B','com.tencent.wcdb.database.SQLiteCipherSpec','com.tencent.wcdb.database.SQLiteDatabase$CursorFactory','int', 'com.tencent.wcdb.DatabaseErrorHandler', 'int' ).implementation = function (a, b, c,d,e,f,g) { 31 | 32 | console.warn("Hook Start..."); 33 | console.warn('arg0: ' + a); 34 | console.warn('arg1: ' + b); 35 | console.warn('arg2: ' + c); 36 | return this.insert(a, b, c,d,e,f,g); 37 | } 38 | }); 39 | } -------------------------------------------------------------------------------- /moji/test1.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | 4 | var b = Java.use("com.baidu.lbsapi.auth.b"); 5 | var HashMap = Java.use("java.util.HashMap"); 6 | var LBSAuthManager = Java.use("com.baidu.lbsapi.auth.LBSAuthManager"); 7 | var auth_a = Java.use("com.baidu.lbsapi.auth.a"); 8 | LBSAuthManager.a.overload('android.content.Context').implementation = function (a1) { 9 | console.warn("Hook reportWithUrl..."); 10 | console.warn("a: ", a1); 11 | console.warn("mcode: ", b.a(a1)); 12 | // 57:A7:05:06:77:DA:E0:7F:22:1A:DD:60:9F:0F:12:77:97:55:A8:7D;com.soufun.app 13 | //原版签名 3A:11:BC:F4:25:97:BB:A2:F6:26:0B:58:1B:4E:0D:E8:C7:F7:95:3A;com.soufun.app 14 | return this.a(a1); 15 | }; 16 | // HashMap.put.implementation = function (a1,b1) { 17 | // console.warn("Hook put..."); 18 | // console.warn("a: ", a1); 19 | // console.warn("b1: ", b1); 20 | // return this.put(a1,b1); 21 | // }; 22 | 23 | LBSAuthManager.a.overload('boolean', 'java.lang.String', 'java.util.Hashtable', 'java.lang.String').implementation = function (a, b, c, d) { 24 | console.warn("Hook a2..."); 25 | console.warn("a: ", a); 26 | // console.warn("ret: ", this.a(a)); 27 | 28 | return this.a(a, b, c, d); 29 | }; 30 | auth_a.a.overload('java.lang.String').implementation = function (a) { 31 | console.warn("Hook a3..."); 32 | console.warn("a: ", a); 33 | 34 | return this.a(a); 35 | }; 36 | }); 37 | } 38 | 39 | 40 | -------------------------------------------------------------------------------- /eleme/shoplist.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | import time 3 | import win32api 4 | import win32con 5 | import os 6 | offset = 0 7 | # print(url) 8 | for i in range(0, 10): 9 | print(offset) 10 | url = "https://apimeishi.meituan.com/meishi/filter/v7/deal/select?wifi-name=Xiaomi_675D%08lsy0622%08401%08gehua01141610190072869%08&offset="+str(offset)+"&is_preload=1&ci=1&wifi-strength=-30%08-73%08-75%08-77%08&cityId=1&sort=solds&wifi-cur=0&isLocal=1&mypos=39.874932657330994%2C116.68540589919716&wifi-mac=34%3Ace%3A00%3A04%3A67%3A5e%0854%3Aa7%3A03%3A17%3Aab%3Afb%08d0%3Ac7%3Ac0%3A1b%3A7a%3Aae%08bc%3A14%3Aef%3Ac4%3Ad7%3A71%08&areaId=1472&cateId=1&hasGroup=true&metrics_start_time=162281963&newStyle=e&lat=39.874932657330994&lng=116.68540589919716" 11 | offset=offset+25 12 | driver = webdriver.Chrome() 13 | driver.get(url) # 模拟键盘操作 14 | win32api.keybd_event(17, 0, 0, 0) # 按下ctrl 15 | win32api.keybd_event(65, 0, 0, 0) # 按下a 16 | win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放a 17 | win32api.keybd_event(83, 0, 0, 0) # 按下s 18 | win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放s 19 | win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放ctrl 20 | 21 | time.sleep(1) 22 | win32api.keybd_event(13, 0, 0, 0) # 按下enter 23 | win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放enter 24 | # 预估下载时间,后期根据实际网速调整 25 | time.sleep(3) 26 | # 关闭webdriver 27 | driver.close() 28 | path = 'C:/Users/11633/Downloads' 29 | file = "select.json" 30 | # 31 | if file in os.listdir(path): 32 | os.rename(os.path.join(path, file), os.path.join(path, "望京" + str(i) + ".json")) 33 | 34 | 35 | 36 | 37 | -------------------------------------------------------------------------------- /eleme/testWebDriver1.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | import time 3 | import win32api 4 | import win32con 5 | import os 6 | 7 | list1 = open("bbb.txt", "r", encoding='UTF-8').readlines() 8 | 9 | for i in range(0, len(list1)): 10 | list1[i] = list1[i].rstrip('\n') 11 | id = list1[i].split(",")[1] 12 | name = list1[i].split(",")[2]+"_"+list1[i].split(",")[0]+"_"+id 13 | url = "https://meishi.meituan.com/i/certificate/foodsafety?mtId="+id+"&f=android&token=owBCehCGJhqOWHy7FNUYDrDbOkAAAAAAQgoAAGKADLeGiP-GwlKooA-QA-v3JIr7I53-j-23hg8iPjYW0V58eCgWgK1Bg6kmUd4y9g&userid=290604810&lat=39.874913286072044&lng=116.68539728948531&utm_source=undefined&utm_medium=android&utm_term=1000060203&version_name=10.6.203&utm_content=862400048396856&utm_campaign=AgroupBgroupC0D200E243168466715547220197960310848290710313_a168853584_c1_e4320249642646189019Ghomepage_category2_1__a1__c-1024__gfood__hpoilist__i1&ci=1&msid=8624000483968561585628957294&uuid=000000000000090CAE6634A8D42948748FEBCC1557198A157954239667625851" 14 | print(url) 15 | 16 | # 打开另存为mhtml功能 17 | options = webdriver.ChromeOptions() 18 | options.add_argument('--save-page-as-mhtml') 19 | # 设置chromedriver,并打开webdriver 20 | driver = webdriver.Chrome(options=options) 21 | driver.get(url) # 模拟键盘操作 22 | win32api.keybd_event(17, 0, 0, 0) # 按下ctrl 23 | win32api.keybd_event(65, 0, 0, 0) # 按下a 24 | win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放a 25 | win32api.keybd_event(83, 0, 0, 0) # 按下s 26 | win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放s 27 | win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放ctrl 28 | 29 | time.sleep(1) 30 | win32api.keybd_event(13, 0, 0, 0) # 按下enter 31 | win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放enter 32 | # 预估下载时间,后期根据实际网速调整 33 | time.sleep(3) 34 | # 关闭webdriver 35 | driver.close() 36 | 37 | path = 'C:/Users/11633/Downloads' 38 | file = "食品安全档案.mhtml" 39 | 40 | if file in os.listdir(path): 41 | os.rename(os.path.join(path, file), os.path.join(path, name + ".mhtml")) 42 | 43 | 44 | 45 | 46 | 47 | -------------------------------------------------------------------------------- /alipay/collect.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | var H5RpcUtil = Java.use("com.alipay.mobile.nebulaappproxy.api.rpc.H5RpcUtil"); 4 | var H5Page = Java.use("com.alipay.mobile.h5container.api.H5Page"); 5 | var JSONObject = Java.use("com.alibaba.fastjson.JSONObject"); 6 | var H5Response = Java.use("com.alipay.mobile.nebulaappproxy.api.rpc.H5Response"); 7 | //rpcCall(String str, String str2, String str3, boolean z, JSONObject jSONObject, 8 | // String str4, boolean z2, H5Page h5Page, int i, String str5, boolean z3, int i2, String str6) 9 | H5RpcUtil.rpcCall.overload('java.lang.String', 'java.lang.String', 10 | 'java.lang.String', 'boolean', 'com.alibaba.fastjson.JSONObject', 11 | 'java.lang.String', 'boolean', 'com.alipay.mobile.h5container.api.H5Page', 12 | 'int', 'java.lang.String', 'boolean', 'int', 'java.lang.String').implementation = function (str, str2, str3, z, jSONObject, 13 | str4, z2, h5Page, i, str5, z3, i2, str6) { 14 | console.log("============"); 15 | console.log("1: " + str); 16 | console.log("2: " + str2); 17 | console.log("3: " + str3); 18 | console.log("4: " + z); 19 | console.log("5: " + jSONObject.toString()); 20 | console.log("6: " + str4); 21 | console.log("7: " + z2); 22 | console.log("9: " + i); 23 | console.log("10: " + str5); 24 | console.log("11: " + z3); 25 | console.log("12: " + i2); 26 | console.log("13: " + str6); 27 | var result = this.rpcCall(str, str2, str3, z, jSONObject, str4, z2, h5Page, i, str5, z3, i2, str6).toString(); 28 | Java.cast(result,H5Response); 29 | console.log("result->a: " +result.a ); 30 | // if(a.toString()==="alipay.antmember.forest.h5.queryNextAction"){ 31 | // console.log("enter = ",a); 32 | // } 33 | 34 | return this.rpcCall(str, str2, str3, z, jSONObject, str4, z2, h5Page, i, str5, z3, i2, str6); 35 | } 36 | }); 37 | 38 | } -------------------------------------------------------------------------------- /haokan/testWebDriver.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | import time 3 | import win32api 4 | import win32con 5 | import os 6 | 7 | list1 = open("bbb.txt", "r", encoding='UTF-8').readlines() 8 | total = len(list1) 9 | 10 | for i in range(0, total): 11 | # list1[i] = list1[i].rstrip('\n') 12 | id = list1[i].split(",")[1] 13 | name = list1[i].split(",")[2]+"_"+id 14 | url = "https://meishi.meituan.com/i/certificate/foodsafety?mtId="+id+"&f=android&token=owBCehCGJhqOWHy7FNUYDrDbOkAAAAAAQgoAAGKADLeGiP-GwlKooA-QA-v3JIr7I53-j-23hg8iPjYW0V58eCgWgK1Bg6kmUd4y9g&userid=290604810&lat=39.874913286072044&lng=116.68539728948531&utm_source=undefined&utm_medium=android&utm_term=1000060203&version_name=10.6.203&utm_content=862400048396856&utm_campaign=AgroupBgroupC0D200E243168466715547220197960310848290710313_a168853584_c1_e4320249642646189019Ghomepage_category2_1__a1__c-1024__gfood__hpoilist__i1&ci=1&msid=8624000483968561585628957294&uuid=000000000000090CAE6634A8D42948748FEBCC1557198A157954239667625851" 15 | print(url) 16 | 17 | print("当前第"+str(i)+"条,共"+str(total)) 18 | 19 | # 打开另存为mhtml功能 20 | # options = webdriver.ChromeOptions() 21 | # options.add_argument('--save-page-as-mhtml') 22 | 23 | # 设置chromedriver,并打开webdriver 24 | # driver = webdriver.Chrome(options=options) 25 | driver = webdriver.Edge(); 26 | driver.get(url) # 模拟键盘操作 27 | js1="document.documentElement.scrollTop=10000" 28 | driver.execute_script(js1) 29 | time.sleep(1) 30 | 31 | win32api.keybd_event(17, 0, 0, 0) # 按下ctrl 32 | win32api.keybd_event(65, 0, 0, 0) # 按下a 33 | win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放a 34 | win32api.keybd_event(83, 0, 0, 0) # 按下s 35 | win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放s 36 | win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放ctrl 37 | 38 | time.sleep(1) 39 | win32api.keybd_event(13, 0, 0, 0) # 按下enter 40 | win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放enter 41 | # 预估下载时间,后期根据实际网速调整 42 | time.sleep(2) 43 | # 关闭webdriver 44 | driver.close() 45 | path = 'C:/Users/pxc/Downloads' 46 | file = "食品安全档案.html" 47 | filePackage = "食品安全档案_files" 48 | 49 | if file in os.listdir(path): 50 | os.rename(os.path.join(path, file), os.path.join(path, name + ".html")) 51 | 52 | if filePackage in os.listdir(path): 53 | os.rename(os.path.join(path, filePackage), os.path.join(path, name)) 54 | 55 | 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /moji/test.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | // var c = Java.use("com.sina.weibo.applicationInit.b.a.c");//com.sina.weibo.applicationInit.b.a.c.a 4 | // var PreferenceUtil = Java.use("com.sina.push.utils.PreferenceUtil");//com.sina.weibo.applicationInit.b.a.c.a 5 | // PreferenceUtil.getPushChannelType.implementation = function () { 6 | // console.warn("Hook a..."); 7 | // console.warn('ret: ' + this.getPushChannelType()); 8 | // return this.getPushChannelType(); 9 | // }; 10 | 11 | 12 | var b = Java.use("com.sina.weibo.net.carrier.Strategy.b");//com.sina.weibo.applicationInit.b.a.c.a 13 | b.a.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) { 14 | console.warn("Hook isSupport ..."); 15 | return this.a(a, b); 16 | }; 17 | // var ad = Java.use("com.sina.weibo.ad"); 18 | // ad.a.overload('[B').implementation = function (c) { 19 | // console.warn("Hook add..."); 20 | // console.warn("a: ",c); 21 | // return this.a(c); 22 | // }; 23 | var ms = Module.enumerateExports( 24 | { 25 | onMatch: function (exp) { 26 | // if (exp.name === "libutility.so") 27 | // console.warn("exp.name: ", exp.name); 28 | } 29 | , 30 | onComplete: function () { 31 | } 32 | } 33 | ); 34 | 35 | // console.warn("exp.name: ", ms[0].name); 36 | 37 | var baseAddr = Process.findModuleByName("libaccount.so"); 38 | console.warn("baseAddr: ", baseAddr); 39 | baseAddr11 = Process.getModuleByAddress(0x25927); 40 | console.warn("baseAddr11: ", baseAddr11); 41 | 42 | // var baseAddr = Module.findBaseAddress('libaccount.so'); 43 | // var baseAddr = Module.getExportByName 44 | // console.warn("baseAddr: ", baseAddr); 45 | // // var funcAddr = baseAddr.add(0x2400); 46 | // var nativeP = Module.getExportByName("libaccount.so", "Java_com_sina_weibo_statistic_LogFeedbackActivity_encryptData"); 47 | // console.warn("nativeP", nativeP); 48 | // var sub_2400 = new NativePointer(Module.findBaseAddress("libaccount.so")).add(0x2400 + 1); 49 | // Interceptor.attach(sub_2400, { 50 | // onEnter: function (args) { 51 | // console.warn("a: "); 52 | // }, 53 | // onLeave: function (retval) { 54 | // console.warn("retval: ", retval); 55 | // } 56 | // 57 | // }); 58 | 59 | }); 60 | } 61 | 62 | 63 | -------------------------------------------------------------------------------- /HookSO/test.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | // var c = Java.use("com.sina.weibo.applicationInit.b.a.c");//com.sina.weibo.applicationInit.b.a.c.a 4 | // var PreferenceUtil = Java.use("com.sina.push.utils.PreferenceUtil");//com.sina.weibo.applicationInit.b.a.c.a 5 | // PreferenceUtil.getPushChannelType.implementation = function () { 6 | // console.warn("Hook a..."); 7 | // console.warn('ret: ' + this.getPushChannelType()); 8 | // return this.getPushChannelType(); 9 | // }; 10 | 11 | 12 | var b = Java.use("com.sina.weibo.net.carrier.Strategy.b");//com.sina.weibo.applicationInit.b.a.c.a 13 | b.a.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) { 14 | console.warn("Hook isSupport ..."); 15 | return this.a(a, b); 16 | }; 17 | // var ad = Java.use("com.sina.weibo.ad"); 18 | // ad.a.overload('[B').implementation = function (c) { 19 | // console.warn("Hook add..."); 20 | // console.warn("a: ",c); 21 | // return this.a(c); 22 | // }; 23 | var ms = Module.enumerateExports( 24 | { 25 | onMatch: function (exp) { 26 | // if (exp.name === "libutility.so") 27 | // console.warn("exp.name: ", exp.name); 28 | } 29 | , 30 | onComplete: function () { 31 | } 32 | } 33 | ); 34 | 35 | // console.warn("exp.name: ", ms[0].name); 36 | 37 | var baseAddr = Process.findModuleByName("libaccount.so"); 38 | console.warn("baseAddr: ", baseAddr); 39 | baseAddr11 = Process.getModuleByAddress(0x25927); 40 | console.warn("baseAddr11: ", baseAddr11); 41 | 42 | // var baseAddr = Module.findBaseAddress('libaccount.so'); 43 | // var baseAddr = Module.getExportByName 44 | // console.warn("baseAddr: ", baseAddr); 45 | // // var funcAddr = baseAddr.add(0x2400); 46 | // var nativeP = Module.getExportByName("libaccount.so", "Java_com_sina_weibo_statistic_LogFeedbackActivity_encryptData"); 47 | // console.warn("nativeP", nativeP); 48 | // var sub_2400 = new NativePointer(Module.findBaseAddress("libaccount.so")).add(0x2400 + 1); 49 | // Interceptor.attach(sub_2400, { 50 | // onEnter: function (args) { 51 | // console.warn("a: "); 52 | // }, 53 | // onLeave: function (retval) { 54 | // console.warn("retval: ", retval); 55 | // } 56 | // 57 | // }); 58 | 59 | }); 60 | } 61 | 62 | 63 | -------------------------------------------------------------------------------- /haokan/test.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | // var c = Java.use("com.sina.weibo.applicationInit.b.a.c");//com.sina.weibo.applicationInit.b.a.c.a 4 | // var PreferenceUtil = Java.use("com.sina.push.utils.PreferenceUtil");//com.sina.weibo.applicationInit.b.a.c.a 5 | // PreferenceUtil.getPushChannelType.implementation = function () { 6 | // console.warn("Hook a..."); 7 | // console.warn('ret: ' + this.getPushChannelType()); 8 | // return this.getPushChannelType(); 9 | // }; 10 | 11 | 12 | var b = Java.use("com.sina.weibo.net.carrier.Strategy.b");//com.sina.weibo.applicationInit.b.a.c.a 13 | b.a.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) { 14 | console.warn("Hook isSupport ..."); 15 | return this.a(a, b); 16 | }; 17 | // var ad = Java.use("com.sina.weibo.ad"); 18 | // ad.a.overload('[B').implementation = function (c) { 19 | // console.warn("Hook add..."); 20 | // console.warn("a: ",c); 21 | // return this.a(c); 22 | // }; 23 | var ms = Module.enumerateExports( 24 | { 25 | onMatch: function (exp) { 26 | // if (exp.name === "libutility.so") 27 | // console.warn("exp.name: ", exp.name); 28 | } 29 | , 30 | onComplete: function () { 31 | } 32 | } 33 | ); 34 | 35 | // console.warn("exp.name: ", ms[0].name); 36 | 37 | var baseAddr = Process.findModuleByName("libaccount.so"); 38 | console.warn("baseAddr: ", baseAddr); 39 | baseAddr11 = Process.getModuleByAddress(0x25927); 40 | console.warn("baseAddr11: ", baseAddr11); 41 | 42 | // var baseAddr = Module.findBaseAddress('libaccount.so'); 43 | // var baseAddr = Module.getExportByName 44 | // console.warn("baseAddr: ", baseAddr); 45 | // // var funcAddr = baseAddr.add(0x2400); 46 | // var nativeP = Module.getExportByName("libaccount.so", "Java_com_sina_weibo_statistic_LogFeedbackActivity_encryptData"); 47 | // console.warn("nativeP", nativeP); 48 | // var sub_2400 = new NativePointer(Module.findBaseAddress("libaccount.so")).add(0x2400 + 1); 49 | // Interceptor.attach(sub_2400, { 50 | // onEnter: function (args) { 51 | // console.warn("a: "); 52 | // }, 53 | // onLeave: function (retval) { 54 | // console.warn("retval: ", retval); 55 | // } 56 | // 57 | // }); 58 | 59 | }); 60 | } 61 | 62 | 63 | -------------------------------------------------------------------------------- /eleme/testWebDriver.py: -------------------------------------------------------------------------------- 1 | from selenium import webdriver 2 | import time 3 | import win32api 4 | import win32con 5 | import os 6 | 7 | list1 = open("ID数据去重后_harf.txt", "r", encoding='UTF-8').readlines() 8 | 9 | for i in range(0, len(list1)): 10 | # list1[i] = list1[i].rstrip('\n') 11 | id = list1[i].split(",")[1] 12 | name = list1[i].split(",")[2] + "_" + id 13 | # url = "https://meishi.meituan.com/i/certificate/foodsafety?mtId="+id+"&f=android&token=owBCehCGJhqOWHy7FNUYDrDbOkAAAAAAQgoAAGKADLeGiP-GwlKooA-QA-v3JIr7I53-j-23hg8iPjYW0V58eCgWgK1Bg6kmUd4y9g&userid=2906048234&lat=39.874913286072044&lng=116.68539728948531&utm_source=undefined&utm_medium=android&utm_term=1000060203&version_name=10.6.203&utm_content=862400048396856&utm_campaign=AgroupBgroupC0D200E243168466715547220197960310848290710313_a168853584_c1_e4320249642646189019Ghomepage_category2_1__a1__c-1024__gfood__hpoilist__i1&ci=1&msid=8624000483968561585628957294&uuid=000000000000090CAE6634A8D42948748FEBCC1557198A157954239667625851" 14 | url = "https://meishi.meituan.com/i/certificate/foodsafety?mtId=" + id + "&f=android&token=owBCehCGJhqOWHy7FNUYDrDbOkAAAAAAQgoAAGKADL" 15 | # url = "https://meishi.meituan.com/i/certificate/foodsafety?mtId="+id+"&f=android" 16 | print(url) 17 | 18 | # 打开另存为mhtml功能 19 | # options = webdriver.ChromeOptions() 20 | # options.add_argument('--save-page-as-mhtml') 21 | 22 | # 设置chromedriver,并打开webdriver 23 | # driver = webdriver.Chrome(options=options) 24 | driver = webdriver.Chrome() 25 | driver.get(url) # 模拟键盘操作 26 | win32api.keybd_event(17, 0, 0, 0) # 按下ctrl 27 | win32api.keybd_event(65, 0, 0, 0) # 按下a 28 | win32api.keybd_event(65, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放a 29 | win32api.keybd_event(83, 0, 0, 0) # 按下s 30 | win32api.keybd_event(83, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放s 31 | win32api.keybd_event(17, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放ctrl 32 | 33 | time.sleep(1) 34 | win32api.keybd_event(13, 0, 0, 0) # 按下enter 35 | win32api.keybd_event(13, 0, win32con.KEYEVENTF_KEYUP, 0) # 释放enter 36 | # 预估下载时间,后期根据实际网速调整 37 | time.sleep(2) 38 | # 关闭webdriver 39 | driver.close() 40 | path = 'C:/Users/11633/Downloads' 41 | file = "食品安全档案.html" 42 | filePackage = "食品安全档案_files" 43 | 44 | if file in os.listdir(path): 45 | os.rename(os.path.join(path, file), os.path.join(path, name + ".html")) 46 | if filePackage in os.listdir(path): 47 | os.rename(os.path.join(path, filePackage), os.path.join(path, name)) 48 | file = "验证中心.html" 49 | filePackage = "验证中心_files" 50 | if file in os.listdir(path): 51 | os.rename(os.path.join(path, file), os.path.join(path, "验证中心_" +id+ ".html")) 52 | if filePackage in os.listdir(path): 53 | os.rename(os.path.join(path, filePackage), os.path.join(path, "验证中心_" +id)) 54 | -------------------------------------------------------------------------------- /eleme/test.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | // var QualificationViewHolder = Java.use("me.ele.shopping.ui.shop.info.ShopInfoViewHolder$QualificationViewHolder");//com.sina.weibo.applicationInit.b.a.c.a 4 | // QualificationViewHolder.a.implementation = function (a1) { 5 | // console.warn("Hook a ..."); 6 | // return this.a(a1); 7 | // }; 8 | var h = Java.use("me.ele.shopping.biz.model.co$h");//com.sina.weibo.applicationInit.b.a.c.a 9 | h.a.implementation = function () { 10 | console.warn("h_b :", this.a()); 11 | return this.a(); 12 | }; 13 | var h = Java.use("me.ele.shopping.biz.model.co$h");//com.sina.weibo.applicationInit.b.a.c.a 14 | h.b.implementation = function () { 15 | console.warn("h_b :", this.b()); 16 | return this.b(); 17 | }; 18 | var WVApiPlugin = Java.use("android.taobao.windvane.jsbridge.WVApiPlugin");//com.sina.weibo.applicationInit.b.a.c.a 19 | WVApiPlugin.executeSafe.implementation = function (a, b, c) { 20 | console.warn("executeSafe :", a); 21 | console.warn("executeSafe :", b); 22 | console.warn("executeSafe :", this.executeSafe(a, b, c)); 23 | return this.executeSafe(a, b, c); 24 | }; 25 | var TaoLog = Java.use("android.taobao.windvane.util.TaoLog");//com.sina.weibo.applicationInit.b.a.c.a 26 | TaoLog.i.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) { 27 | console.warn("TaoLog.i :", a); 28 | console.warn("TaoLog.i :", b); 29 | return this.i(a, b); 30 | }; 31 | TaoLog.v.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) { 32 | console.warn("TaoLog.v :", a); 33 | console.warn("TaoLog.v :", b); 34 | return this.v(a, b); 35 | }; 36 | TaoLog.e.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) { 37 | console.warn("TaoLog.e :", a); 38 | console.warn("TaoLog.e :", b); 39 | return this.e(a, b); 40 | }; 41 | TaoLog.d.overload('java.lang.String', 'java.lang.String').implementation = function (a, b) { 42 | console.warn("TaoLog.d :", a); 43 | console.warn("TaoLog.d :", b); 44 | return this.d(a, b); 45 | }; 46 | // var ag = Java.use("com.uc.sdk_glue.ag");//com.sina.weibo.applicationInit.b.a.c.a 47 | // ag.b.implementation = function (a) { 48 | // console.warn("ag.b :", a); 49 | // console.warn("ag.b :", this.b(a)); 50 | // return this.b(a); 51 | // }; 52 | // var ErisEntry = Java.use("me.ele.uis.eris.ErisEntry");//com.sina.weibo.applicationInit.b.a.c.a 53 | // ErisEntry.sneer.implementation = function (a,b,c,d) { 54 | // console.warn("sneer a:",a); 55 | // console.warn("sneer b:",b); 56 | // console.warn("sneer c:",c); 57 | // console.warn("sneer d:",d); 58 | // console.warn("sneer res:",this.sneer(a,b,c,d)); 59 | // return this.sneer(a,b,c,d); 60 | // }; 61 | var PasswordLoginView = Java.use("com.alipay.user.mobile.login.view.PasswordLoginView");//com.sina.weibo.applicationInit.b.a.c.a 62 | PasswordLoginView.trustLoginWithExtLoginParam.implementation = function () { 63 | console.warn("trustLoginWithExtLoginParam res:", this.trustLoginWithExtLoginParam()); 64 | return this.trustLoginWithExtLoginParam(); 65 | }; 66 | var h = Java.use("me.ele.android.enet.h");//com.sina.weibo.applicationInit.b.a.c.a 67 | var h_a = Java.use("me.ele.android.enet.h$a");//com.sina.weibo.applicationInit.b.a.c.a 68 | h.$init.implementation = function (a) { 69 | // console.warn(" b:", b); 70 | var ha = Java.cast(a, h_a); 71 | console.warn(" b:", ha.b); 72 | console.warn(" c:", ha.c); 73 | console.warn(" d:", ha.d); 74 | console.warn(" f3128a:", ha.f3128a); 75 | console.warn(" g:", ha.g); 76 | console.warn(" h:", ha.h); 77 | console.warn(" i:", ha.i); 78 | console.warn(" j:", ha.j); 79 | return this.$init(a); 80 | }; 81 | 82 | }); 83 | } 84 | 85 | 86 | -------------------------------------------------------------------------------- /DexUnpack/dump_dex_3.js: -------------------------------------------------------------------------------- 1 | //frida -U -f com.min.app.sample -l ./src/script/hook.js --no-pause 2 | 3 | // var packageName = 'com.min.app.sample'; 4 | var packageName = 'com.ldzs.zhangxin'; 5 | 6 | 7 | var DEX_MAGIC = 0x0A786564; 8 | var placeHolderArray; 9 | var dexrec = []; 10 | 11 | // Interceptor.attach(Module.findExportByName('libart.so', '_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_'), { 12 | Interceptor.attach(Module.findExportByName('libart.so', '_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_7OatFileEPS9_'), { 13 | onEnter: function(args) { 14 | if (Memory.readU32(args[1]) === DEX_MAGIC) { 15 | dexrec.push(args[1]); 16 | } 17 | }, 18 | onLeave: function(retval) {} 19 | }); 20 | 21 | Java.performNow(function() { 22 | var Application = Java.use("android.app.Application"); 23 | Application.onCreate.implementation = function() { 24 | this.onCreate(); 25 | console.log('find application : ' + this); 26 | if (this.toString().indexOf(packageName) < 0) { //防止加壳后的app,两次调用到onCreate 27 | return; 28 | } 29 | var classloader = this.getClassLoader(); // 获取classloader 30 | Java.classFactory.loader = classloader; //替换classloader 31 | loadAllClass(); 32 | dumpDex(); 33 | } 34 | }); 35 | 36 | function loadAllClass() { 37 | placeHolderArray = Java.array("java.lang.Object", []); 38 | 39 | var classLoaderObj = Java.classFactory.loader; 40 | var pathListObj = getPathListObj(classLoaderObj); 41 | var JavaArray = Java.use("java.lang.reflect.Array"); 42 | var dexElementsObj = getDexElementsObj(pathListObj); 43 | 44 | for (var i = 0; i < JavaArray.getLength(dexElementsObj); i++) { 45 | var dexElement = JavaArray.get(dexElementsObj, i); 46 | var dexFileObj = getDexFileObj(dexElement); 47 | console.log('handle dexFile : ' + dexFileObj); 48 | 49 | var enumerations = getMethod("dalvik.system.DexFile", "entries").invoke(dexFileObj, placeHolderArray); 50 | var hasMoreElementsMethod = getMethod("java.util.Enumeration", "hasMoreElements"); 51 | while (true) { 52 | var flag = hasMoreElementsMethod.invoke(enumerations, placeHolderArray); 53 | if (flag.toString() === 'false') { 54 | break; 55 | } 56 | var nextElementMethod = getMethod("java.util.Enumeration", "nextElement"); 57 | var clazzName = nextElementMethod.invoke(enumerations, placeHolderArray).toString(); 58 | if (startWith(clazzName, "android.") || startWith(clazzName, "androidx.") || startWith(clazzName, "dalvik.")) { 59 | continue; 60 | } 61 | try { 62 | console.log("load " + Java.classFactory.loader.loadClass(clazzName)); 63 | } catch (e) { 64 | console.log(e); 65 | } 66 | } 67 | } 68 | } 69 | 70 | function dumpDex() { 71 | for (var i = 0; i < dexrec.length; i++) { 72 | if (Memory.readU32(dexrec[i]) === DEX_MAGIC) { 73 | var beginPtr = dexrec[i]; 74 | var dexLengthPtr = beginPtr.add(0x20); 75 | var dexLength = Memory.readInt(dexLengthPtr); 76 | console.log("\nfind dex ,beginAddress = " + beginPtr + " , dexLength = " + dexLength); 77 | dump(beginPtr, 64); 78 | 79 | console.log("start dump dex ...."); 80 | var filePath = "/data/data/" + packageName + "/" + dexLength + ".dex"; 81 | var file = new File(filePath, "wb"); 82 | file.write(Memory.readByteArray(beginPtr, dexLength)); 83 | file.flush(); 84 | file.close(); 85 | console.log("end dump dex ...." + filePath+"\n"); 86 | } 87 | } 88 | } 89 | 90 | function getMethod(className, methodName) { 91 | var method = Java.use(className).class.getDeclaredMethod(methodName, placeHolderArray); 92 | return method; 93 | } 94 | 95 | function getPathListObj(obj) { 96 | var field = Java.use("dalvik.system.BaseDexClassLoader").class.getDeclaredField("pathList"); 97 | field.setAccessible(true); 98 | return field.get(obj); 99 | } 100 | 101 | function getDexElementsObj(obj) { 102 | var field = Java.use("dalvik.system.DexPathList").class.getDeclaredField("dexElements"); 103 | field.setAccessible(true); 104 | return field.get(obj); 105 | } 106 | 107 | function getDexFileObj(obj) { 108 | var field = Java.use("dalvik.system.DexPathList$Element").class.getDeclaredField("dexFile"); 109 | field.setAccessible(true); 110 | return field.get(obj); 111 | } 112 | 113 | function startWith(str, prefix) { 114 | return str.slice(0, prefix.length) === prefix; 115 | } 116 | 117 | function dump(pointer, len) { 118 | var str = hexdump(pointer, { 119 | offset: 0, 120 | length: len, 121 | header: true, 122 | ansi: true 123 | }); 124 | console.log(str) 125 | } 126 | -------------------------------------------------------------------------------- /moji/fangtianxia.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | var av = Java.use("com.eguan.monitor.av");//com.sina.weibo.applicationInit.b.a.c.a 4 | var am = Java.use("com.eguan.monitor.am");//com.sina.weibo.applicationInit.b.a.c.a 5 | var mJSONObject = Java.use("org.json.JSONObject");//com.sina.weibo.applicationInit.b.a.c.a 6 | // av.a.overload('[B', 'java.lang.String').implementation = function (a, b) { 7 | // console.warn("Hook [B', 'java.lang.String' ..."); 8 | // console.warn("a: ",a); 9 | // console.warn("b: ",b); 10 | // console.warn("res: ",this.a(a,b)); 11 | // return this.a(a,b); 12 | // }; 13 | // var mArray = Java.use("java.lang.reflect.Array"); 14 | // av.a.overload('[B').implementation = function (a) { 15 | // console.warn("Hook [B ..."); 16 | // console.warn("a: ",mArray.get(a)); 17 | // console.warn("res: ",this.a(a)); 18 | // return this.a(a); 19 | // }; 20 | var mBase64 = Java.use("android.util.Base64"); 21 | var mSignature = Java.use("android.content.pm.Signature"); 22 | var mArray = Java.use("java.lang.reflect.Array"); 23 | var DeviceConfig = Java.use("com.umeng.commonsdk.statistics.common.DeviceConfig"); 24 | // DeviceConfig.getAppHashKey.implementation = function (a) { 25 | // console.warn("Hook getAppHashKey ..."); 26 | // console.warn("a: ", a); 27 | // console.warn("res: ", this.getAppHashKey(a)); 28 | // return this.getAppHashKey(a); 29 | // }; 30 | // DeviceConfig.getAppSHA1Key.implementation = function (a) { 31 | // console.warn("Hook getAppSHA1Key ..."); 32 | // console.warn("a: ", a); 33 | // console.warn("res: ", this.getAppSHA1Key(a)); 34 | // return this.getAppSHA1Key(a); 35 | // }; 36 | // DeviceConfig.getAppMD5Signature.implementation = function (a) { 37 | // console.warn("Hook getAppMD5Signature ..."); 38 | // console.warn("a: ", a); 39 | // console.warn("res: ", this.getAppMD5Signature(a)); 40 | // return this.getAppMD5Signature(a); 41 | // }; 42 | 43 | var CommonUtil = Java.use("cn.com.mma.mobile.tracking.util.CommonUtil"); 44 | var Countly_4 = Java.use("cn.com.mma.mobile.tracking.api.Countly$4"); 45 | 46 | CommonUtil.getSignature.implementation = function (a, b, c, d) { 47 | console.warn("Hook getSignature ..."); 48 | console.warn("a: ", a); 49 | console.warn("b: ", b); 50 | console.warn("c: ", c); 51 | console.warn("d: ", d); 52 | console.warn("res: ", this.getSignature(a, b, c, d)); 53 | return this.getSignature(a, b, c, d); 54 | }; 55 | Countly_4.onEventPresent.implementation = function (a) { 56 | console.warn("Hook getSignature ..."); 57 | console.warn("a: ", a); 58 | console.warn("res: ", this.onEventPresent(a)); 59 | return this.onEventPresent(a); 60 | }; 61 | var utils_e = Java.use("com.bytedance.sdk.openadsdk.utils.e"); 62 | 63 | utils_e.a.overload('android.content.Context').implementation = function (a) { 64 | console.warn("Hook utils_e.a ..."); 65 | console.warn("a: ", a); 66 | console.warn("res: ", this.a(a)); 67 | return this.a(a); 68 | }; 69 | var Process = Java.use("android.os.Process"); 70 | 71 | Process.killProcess.implementation = function (a) { 72 | console.warn("Hook killProcess..."); 73 | console.warn("a: ", a); 74 | console.warn("res: ", this.killProcess(a)); 75 | return this.killProcess(a); 76 | }; 77 | 78 | 79 | // am.a.overload('android.content.Context').implementation = function (a) { 80 | // console.warn("Hook aContext ..."); 81 | // console.warn("a: ", a); 82 | // // var aaa = Java.cast(this.a(a), mJSONObject); 83 | // // console.warn("res: ", aaa.toString()); 84 | // var sig = a.getPackageManager().getPackageInfo(a.getPackageName(), 64); 85 | // console.warn('sig: ' + sig); 86 | // var signatures = sig.class.getDeclaredField("signatures"); 87 | // signatures.setAccessible(true); 88 | // var value = signatures.get(sig); 89 | // var abc = value.getClass().isArray(); 90 | // console.warn('abc: ' + abc); 91 | // console.warn('value: ' + value); 92 | // console.warn('value1: ' + mArray.get(value, 0)); 93 | // var sid = Java.cast(mArray.get(value, 0), mSignature); 94 | // console.warn('value2: ' + sid.toByteArray()); 95 | // var sids = mBase64.encodeToString(sid.toByteArray(), 0); 96 | // 97 | // console.warn('sids: ' + sids); 98 | // return this.a(a); 99 | // }; 100 | 101 | 102 | var aa = Java.use("com.pgl.sys.ces.a"); 103 | var ces_c = Java.use("com.pgl.sys.ces.c"); 104 | var mString = Java.use("java.lang.String"); 105 | var a_d = Java.use("com.sijla.i.a.d"); 106 | 107 | // aa.njss.overload('int', 'java.lang.Object').implementation = function (a, b) { 108 | // console.warn("Hook njss ..."); 109 | // console.warn("a: ", a); 110 | // console.warn("b: ", b); 111 | // // console.warn("res: ", this.njss(137, b).toString()); 112 | // return this.njss(a, b); 113 | // }; 114 | // a_d.a.overload('java.lang.String').implementation = function (a) { 115 | // console.warn("Hook E ..."); 116 | // console.warn("a: ", a); 117 | // console.warn("res: ", this.a(a)); 118 | // return this.a(a); 119 | // }; 120 | // ces_c.a.overload('java.lang.String').implementation = function (a) { 121 | // console.warn("Hook ces_c2 ..."); 122 | // console.warn("a: ", a); 123 | // // var aaa= Java.cast(this.njss(a.b),mString); 124 | // console.warn("res2: ", this.a(a)); 125 | // return this.a(a); 126 | // }; 127 | // ces_c.a.overload().implementation = function () { 128 | // console.warn("Hook ces_c1 ..."); 129 | // // var aaa= Java.cast(this.njss(a.b),mString); 130 | // console.warn("res1: ", this.a()); 131 | // return this.a(); 132 | // }; 133 | }); 134 | } 135 | 136 | 137 | -------------------------------------------------------------------------------- /eleme/test1.js: -------------------------------------------------------------------------------- 1 | if (Java.available) { 2 | Java.perform(function () { 3 | 4 | 5 | // var m0 = Java.use("h.a.a.m0");//com.sina.weibo.applicationInit.b.a.c.a 6 | // m0.a.overload('java.lang.String').implementation = function (a) { 7 | // console.warn("------------ m0.a------------"); 8 | // console.warn(a, ",ret: ", this.a(a)); 9 | // return this.a(a); 10 | // }; 11 | // var h = Java.use("h.a.x.h");//com.sina.weibo.applicationInit.b.a.c.a 12 | // h.a.implementation = function (a, b, c) { 13 | // console.warn("------------h.a------------"); 14 | // console.warn(a, ",", b, ",", c); 15 | // return this.a(a, b, c); 16 | // }; 17 | // var Pair = Java.use("android.util.Pair");//com.sina.weibo.applicationInit.b.a.c.a 18 | // Pair.$init.implementation = function (a,b) { 19 | // console.warn("------------Pair.$init------------"); 20 | // console.warn(a, ",", b); 21 | // return this.$init(a,b); 22 | // }; 23 | //2205057699d853d6fef4cf4b68b3f2ffcdfae9af5e 24 | //2205057689d89453942fa4df33d4b9ec0160352f0b 25 | // var JSONObject = Java.use("org.json.JSONObject");//com.sina.weibo.applicationInit.b.a.c.a 26 | // JSONObject.put.overload('java.lang.String', 'java.lang.Object').implementation = function (a, b) { 27 | // console.warn("------------JSONObject.put------------"); 28 | // console.warn(a, ",", b); 29 | // return this.put(a, b); 30 | // }; 31 | var f = Java.use("com.kuaishou.android.security.f");//com.sina.weibo.applicationInit.b.a.c.a 32 | // f.a.overload('java.lang.String', 'boolean').implementation = function (a, b) { 33 | // console.warn("------------f.a------------"); 34 | // console.warn(a, ",", b); 35 | // console.warn("f.a_res:", this.a(a, b)); 36 | // return this.a(a, b); 37 | // }; 38 | var KSecurity = Java.use("com.kuaishou.android.security.KSecurity");//com.sina.weibo.applicationInit.b.a.c.a 39 | // KSecurity.atlasSign.overload('java.lang.String').implementation = function (a) { 40 | // console.warn("------------atlasSign------------"); 41 | // console.warn(a, ",", this.atlasSign(a)); 42 | // return this.atlasSign(a); 43 | // }; 44 | KSecurity.isInitialize.implementation = function () { 45 | console.warn("------------isInitialize------------"); 46 | console.warn(this.isInitialize()); 47 | return true; 48 | }; 49 | // ----getWbKey--- 50 | // lD6We1E8i 51 | 52 | 53 | // i.j.overload().implementation = function () { 54 | // console.warn("----i.j---"); 55 | // console.warn(this.j()); 56 | // return this.j(); 57 | // }; 58 | //contex:com.yxcorp.gifshow.App@4f3754e 59 | var security_i = Java.use("com.kuaishou.android.security.i");//com.sina.weibo.applicationInit.b.a.c.a 60 | // security_i.a.overload('android.content.Context').implementation = function (a) { 61 | // console.warn("----security_i.a(Context)---"); 62 | // console.warn("a:", a); 63 | // console.warn("a(Context)res:", this.a(a)); 64 | // return this.a(a); 65 | // }; 66 | var mBase64 = Java.use("android.util.Base64"); 67 | 68 | //a:MjIwNDYzMzg5OWQ4OWI2MGFkMmNlZGFkMGY3NzA5YWQ2MjEyMWY2ZGRk 69 | // var c_i = Java.use("com.kuaishou.android.security.kfree.c.i");//com.sina.weibo.applicationInit.b.a.c.a 70 | // c_i.c.overload('[B').implementation = function (a) { 71 | // console.warn("----c_i.c---"); 72 | // var sids = mBase64.encodeToString(a, 0); 73 | // console.warn("a:", sids); 74 | // return this.c(a); 75 | // }; 76 | 77 | 78 | // security_i.a.overload('java.lang.String').implementation = function (a) { 79 | // console.warn("----security_i.a(String)---"); 80 | // console.warn("a:", a); 81 | // // var f20565c = security_i.getDeclaredField("f20565c"); 82 | // // f20565c.setAccessible(true); 83 | // console.warn("f20565c:", this.f20565c); 84 | // console.warn("a(String)res:", this.a(a)); 85 | // return this.a(a); 86 | // }; 87 | // security_i.$init.implementation = function (a) { 88 | // console.warn("----security_i.$init---"); 89 | // console.warn("a:", a); 90 | // console.warn(this.$init(a)); 91 | // return this.$init(a); 92 | // }; 93 | // var b_a = Java.use("com.kuaishou.android.security.kfree.b.a");//com.sina.weibo.applicationInit.b.a.c.a 94 | // b_a.$init.overload('java.lang.String').implementation = function (a) { 95 | // console.warn("----b.a$init---"); 96 | // console.warn("a:", a); 97 | // console.warn("b.a$initres:", this.$init(a)); 98 | // return this.$init(a); 99 | // }; 100 | // security_i.b.overload().implementation = function () { 101 | // console.warn("----security_i.b---"); 102 | // console.warn(this.b()); 103 | // return this.b(); 104 | // }; 105 | // var KSecurityContext = Java.use("com.kuaishou.android.security.adapter.common.KSecurityContext");//com.sina.weibo.applicationInit.b.a.c.a 106 | // KSecurityContext.getWbKey.implementation = function () { 107 | // console.warn("----getWbKey---"); 108 | // console.warn(this.getWbKey()); 109 | // return this.getWbKey(); 110 | // }; 111 | var Charset = Java.use("java.nio.charset.Charset");//com.sina.weibo.applicationInit.b.a.c.a 112 | var CPU = Java.use("com.yxcorp.gifshow.util.CPU");//com.sina.weibo.applicationInit.b.a.c.a 113 | var aa = Java.use("m0.a.b.a.b.a");//com.sina.weibo.applicationInit.b.a.c.a 114 | var clazz = Java.use("java.lang.Class"); 115 | var mString = Java.use("java.lang.String"); 116 | CPU.a.implementation = function (a, b, c) { 117 | console.warn("----CPU.a---"); 118 | // var aIns = aa.$new.overload("java.nio.charset.Charset").call(aa,""); 119 | var sids = mBase64.encodeToString(b, 0); 120 | console.warn("b:", sids, "c:", c, "res:", this.a(a, b, c)); 121 | 122 | 123 | var Charset_a = Java.cast(aa.class, clazz).getDeclaredField("a"); 124 | Charset_a.setAccessible(true); 125 | // var mchar = Charset_a.$new(); 126 | // var forName = Java.cast(Charset.class, clazz).getDeclaredMethod("forName"); 127 | // var forName = Charset.getDeclaredMethod("forName"); 128 | // forName.setAccessible(true); 129 | // var ch = forName.invoke(null,"UTF-8"); 130 | // Charset.forName(null, "UTF-8"); 131 | 132 | // var aaa = Charset_a.get(aIns); 133 | 134 | var str = mString.$new.overload("[B","java.nio.charset.Charset").call(mString,b,Charset_a.get(Charset)); 135 | 136 | console.warn("str:", str); 137 | return this.a(a, b, c); 138 | }; 139 | 140 | 141 | }); 142 | } 143 | 144 | 145 | -------------------------------------------------------------------------------- /DexUnpack/dump_dex_2.js: -------------------------------------------------------------------------------- 1 | var DEX_MAGIC = 0x0A786564; 2 | var dexrec = []; 3 | 4 | var openmemory = Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"); 5 | if(openmemory != undefined) { 6 | console.log("openmemory at" + openmemory); 7 | Interceptor.attach(openmemory, { 8 | onEnter: function (args) { 9 | if(Memory.readU32(args[1]) == DEX_MAGIC) { 10 | dexrec.push(args[1]); 11 | } 12 | }, 13 | onLeave: function (retval) { 14 | 15 | } 16 | }); 17 | } 18 | 19 | if(Java.available) { 20 | Java.performNow(function(){ 21 | 22 | var dexBase64 = "ZGV4CjAzNQCjsh5+52qOBRMl1aMHk33QkLmfsSbOla5wDwAAcAAAAHhWNBIAAAAAAAAAAKAOAABpAAAAcAAAABwAAAAUAgAAGgAAAIQCAAABAAAAvAMAACUAAADEAwAAAQAAAOwEAABkCgAADAUAAAwFAAAPBQAAEgUAABcFAAAfBQAAIwUAADgFAABGBQAASQUAAE0FAABSBQAAVQUAAFkFAABeBQAAYwUAAHcFAACXBQAAtgUAAM8FAADiBQAA+AUAABEGAAAoBgAATAYAAG4GAACCBgAAlgYAALEGAADIBgAA4wYAAP4GAAAaBwAAMQcAAEgHAABzBwAAjAcAAKUHAADSBwAA6AcAAPoHAAD/BwAAAggAAAYIAAAKCAAADQgAABEIAAAlCAAAOggAAE8IAABsCAAAcQgAAHkIAACGCAAAlQgAAKAIAACnCAAAqggAALcIAADKCAAA0wgAANYIAADaCAAA4wgAAPEIAAD5CAAAAAkAAAsJAAAQCQAAGgkAACwJAABDCQAAVQkAAGkJAAB0CQAAfQkAAI0JAACgCQAArwkAAMAJAADJCQAAzAkAANQJAADeCQAA7AkAAPoJAAAFCgAADQoAABYKAAAcCgAAJgoAACwKAAA5CgAAQQoAAEcKAABQCgAAWgoAAGsKAABzCgAAggoAAIgKAACOCgAAlwoAAKAKAACqCgAAwAoAAAcAAAAOAAAADwAAABAAAAARAAAAEgAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACIAAAAjAAAAJQAAACYAAAAoAAAAKwAAAC0AAAAuAAAALwAAADAAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAMgKAAAJAAAAAAAAAAgLAAAKAAAABQAAAAAAAAALAAAABQAAAOgKAAAKAAAACgAAAAAAAAALAAAACgAAAMgKAAAMAAAACgAAANAKAAANAAAACgAAANgKAAANAAAACgAAAOAKAAAKAAAACwAAAAAAAAALAAAADAAAAOgKAAALAAAADwAAAOgKAAALAAAAEQAAAPAKAAAKAAAAEwAAAAAAAAAKAAAAFAAAAAAAAAAoAAAAFgAAAAAAAAApAAAAFgAAAPAKAAApAAAAFgAAAPgKAAAqAAAAFgAAAAALAAArAAAAFwAAAAAAAAAsAAAAFwAAAMgKAAAKAAAAGAAAAAAAAAALAAAAGQAAABALAAALAAAAGgAAAPAKAAAKAAAAGwAAAAAAAAACAAsAJwAAAAEAAgA3AAAAAgAQAAMAAAACAA0ARAAAAAIAGABFAAAAAgAIAEoAAAACABEAUwAAAAQADgA9AAAABQAMAEYAAAAFABkARwAAAAUACgBJAAAABQADAEwAAAAGAAQAVAAAAAgAEABfAAAACQAQAF8AAAAKABAAAwAAAAoAAwBDAAAACwAVAD8AAAAMABAAAwAAAAwACwAyAAAADAAKAGYAAAAOAAcAQgAAAA4AAQBIAAAADwAGAEIAAAAPABMAYQAAABAACgBJAAAAEAAWAEsAAAAQAAkAUAAAABEAEAADAAAAEQAVADEAAAARAA8AUQAAABEAAABiAAAAEQAXAGUAAAASABIAYwAAABMAFABNAAAAEwAFAFoAAAAUABQATgAAABQABQBZAAAAAgAAAAEAAAAKAAAAAAAAAAUAAAA8CwAAhA4AABYLAAABKAABKQADLS0+AAY8aW5pdD4AAj47ABNFbnVtZXJhdGVDbGFzcy5qYXZhAAxGUmlEQV9VTlBBQ0sAAUkAAklMAANJTEwAAUwAAkxMAANMTEkAA0xMTAASTGFuZHJvaWQvdXRpbC9Mb2c7AB5MY29tL3NtYXJ0ZG9uZS9FbnVtZXJhdGVDbGFzczsAHUxkYWx2aWsvYW5ub3RhdGlvbi9TaWduYXR1cmU7ABdMZGFsdmlrL3N5c3RlbS9EZXhGaWxlOwARTGphdmEvbGFuZy9DbGFzczsAFExqYXZhL2xhbmcvQ2xhc3M8Kj47ABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwAVTGphdmEvbGFuZy9FeGNlcHRpb247ACJMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ACBMamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uOwASTGphdmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwAZTGphdmEvbGFuZy9yZWZsZWN0L0FycmF5OwAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsAFUxqYXZhL3V0aWwvQXJyYXlMaXN0OwAVTGphdmEvdXRpbC9BcnJheUxpc3Q8AClMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OwAXTGphdmEvdXRpbC9Db2xsZWN0aW9uczsAF0xqYXZhL3V0aWwvRW51bWVyYXRpb247ACtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ABRMamF2YS91dGlsL0l0ZXJhdG9yOwAQTGphdmEvdXRpbC9MaXN0OwADVEFHAAFWAAJWTAACVloAAVoAAlpMABJbTGphdmEvbGFuZy9DbGFzczsAE1tMamF2YS9sYW5nL09iamVjdDsAE1tMamF2YS9sYW5nL1N0cmluZzsAG1tMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwADYWRkAAZhcHBlbmQAC2NsYXNzTG9hZGVyAA1jbGFzc05hbWVMaXN0AAljbGFzc2xpc3QABWNsYXp6AAFkAAtkZXhFbGVtZW50cwARZGV4RWxlbWVudHNMZW5ndGgAB2RleEZpbGUAAWUAAmUyAAdlbnRyaWVzAAxlbnVtZXJhdGlvbnMABmVxdWFscwAFZmllbGQACWZpZWxkTmFtZQADZ2V0AAhnZXRDbGFzcwAQZ2V0Q2xhc3NOYW1lTGlzdAAVZ2V0Q2xhc3NOYW1lTGlzdEFycmF5ABBnZXREZWNsYXJlZEZpZWxkABJnZXREZWNsYXJlZE1ldGhvZHMACWdldExlbmd0aAAHZ2V0TmFtZQAOZ2V0T2JqZWN0RmllbGQAEWdldFBhcmFtZXRlclR5cGVzAA1nZXRTdXBlcmNsYXNzAA9oYXNNb3JlRWxlbWVudHMAB2hhc05leHQAAWkABmludm9rZQAIaXRlcmF0b3IADGxvYWQgY2xhc3M6IAAMbG9hZEFsbENsYXNzAAlsb2FkQ2xhc3MABm1ldGhvZAAHbWV0aG9kcwAEbmFtZQAIbmFtZWxpc3QABG5leHQAC25leHRFbGVtZW50AAZvYmplY3QABG9ianMAB3Bhcm1sZW4ACHBhdGhMaXN0AA9wcmludFN0YWNrVHJhY2UABnJldHZhbAANc2V0QWNjZXNzaWJsZQAEc2l6ZQAEc29ydAAHc3VjY2VzcwAHdG9BcnJheQAIdG9TdHJpbmcAFHRyeSB0byBsb2FkIG1ldGhvZDogAAV2YWx1ZQAAAQAAAAoAAAACAAAACgAAAAIAAAAKAAsAAgAAAAoAGQABAAAACwAAAAEAAAAGAAAAAQAAABUAAAABAAAAFwAAAAIAAAALAAsAAQAAABkAARcGAgMBaBwGFwAXFBcBFyAXGRcEAAAAAAAAAAAAAQAAABkLAAAAAAAAAAAAAAEAAAAAAAAAAgAAADQLAAAOAA4AJAE0DlsEADUSIsMDATkLSwMCOgEdAwNQAS3/BAQ/FCVpoQUEQgUBBQIFAxwfPAA1ATQOSwQAWRIiaQMBYRs8ABMCXEIOSwMANwYBEBBLAwFBEEtdBQEeAwE9CTsFARkeAwE8CjxNBQEfAD0BNA5LBAA2EiL/AwJYDEsEAzcGFEsDBFccARoPaQMHVhFaAwheAS0DCV0aASYPSwJ7dwUHBQgFCUIFAgUDBQQgBQAbIAABAAEAAQAAAFQLAAAEAAAAcBAOAAAADgAHAAEAAgABAFgLAABBAAAAIgARAHAQGwAAABoBXgBxIAQAFgAMARoCOABxIAQAIQAMAXEQFQABAAoCEgM1IyUAcSAUADEADAQaBToAcSAEAFQADAQfBAQAbhAGAAQADARyECEABAAKBTgFDAByECIABAAMBR8FCwBuIBwAUAAo8dgDAwEo3CgCDQFxECAAAAARAAAABQAAADIAAQABAQc8AwABAAIAAACHCwAADgAAAHEQAgACAAwAbhAeAAAACgEjERoAbiAfABAAEQEFAAIAAgABAJgLAAAxAAAAbhAPAAMADABuEAkAAAAMARwCCgBuEAkAAgAMAm4gEAAhAAoBOQEdAG4gBwBAAAwBEhJuIBcAIQBuIBYAMQAMAhECDQFuEAwAAQAoCQ0BbhANAAEAbhAKAAAADAAo1hIBEQEAABQAAAAMAAEAAQIJJgghAAAOAAEAAwABAMILAAB7AAAAcRACAA0ADABuEB0AAAAMAXIQIwABAAoCOAJsAHIQJAABAAwCHwILAG4gCwAtAAwDbhAIAAMADAQaBQYAIgYMAHAQEQAGABoHUgBuIBIAdgBuEAkAAwAMB24gEgB2AG4QEwAGAAwGcSAAAGUAIUUSBjVWPwBGBwQGbhAZAAcADAghiCOJGQAaCgYAIgsMAHAQEQALABoMZwBuIBIAywBuEAkAAwAMDG4gEgDLABoMAgBuIBIAywBuEBgABwAMDG4gEgDLAG4QEwALAAwLcSAAALoAEgpuMBoApwkaCgYAGgtkAHEgAAC6ANgGBgEowiiRKAINAA4AAAAAAAAAdAABAAEBDXkBAAUAABoBgYAEiBgBCaAYAQnAGQEJ7BkBCfAaEQAAAAAAAAABAAAAAAAAAAEAAABpAAAAcAAAAAIAAAAcAAAAFAIAAAMAAAAaAAAAhAIAAAQAAAABAAAAvAMAAAUAAAAlAAAAxAMAAAYAAAABAAAA7AQAAAIgAABpAAAADAUAAAEQAAAKAAAAyAoAAAUgAAABAAAAFgsAAAQgAAABAAAAGQsAAAMQAAADAAAALAsAAAYgAAABAAAAPAsAAAMgAAAFAAAAVAsAAAEgAAAFAAAACAwAAAAgAAABAAAAhA4AAAAQAAABAAAAoA4AAA=="; 23 | var application = Java.use("android.app.Application"); 24 | var BaseDexClassLoader = Java.use("dalvik.system.BaseDexClassLoader"); 25 | var Base64 = Java.use("android.util.Base64"); 26 | var FileOutputStream = Java.use("java.io.FileOutputStream"); 27 | var DexClassLoader = Java.use("dalvik.system.DexClassLoader"); 28 | 29 | var reflectField = Java.use("java.lang.reflect.Field"); 30 | var reflectMethod = Java.use("java.lang.reflect.Method"); 31 | var reflectObject = Java.use("java.lang.Object"); 32 | var reflectClass = Java.use("java.lang.Class"); 33 | var reflectString = Java.use("java.lang.String"); 34 | var reflectClassloader = Java.use("java.lang.ClassLoader"); 35 | 36 | console.log('start dump...') 37 | if(application != undefined) { 38 | application.attachBaseContext.overload('android.content.Context').implementation = function(context) { 39 | // console.log('find application :'+this); 40 | // var result = this.attach(context); 41 | this.attachBaseContext(context); 42 | console.log("find application :",this); 43 | if(this.toString().indexOf('com.min.app.sample')<0){ 44 | return; 45 | } 46 | var classloader = context.getClassLoader(); 47 | var filesDir = context.getFilesDir(); 48 | var codeCacheDir = context.getCodeCacheDir(); 49 | console.log("files dir: " + filesDir); 50 | console.log("code cache dir: " + codeCacheDir); 51 | if(classloader != undefined) { 52 | var casedloader = Java.cast(classloader, BaseDexClassLoader); 53 | var dexbytes = Base64.decode(dexBase64, 0); 54 | var dexpath = filesDir + "/emmm.dex"; 55 | var fout = FileOutputStream.$new(dexpath); 56 | fout.write(dexbytes, 0, dexbytes.length); 57 | fout.close(); 58 | console.log("write dex to " + dexpath); 59 | 60 | var dexstr = dexpath.toString(); 61 | var cachestr = codeCacheDir.toString(); 62 | 63 | var dyndex = DexClassLoader.$new(dexstr, cachestr, cachestr, classloader); 64 | console.log(dyndex.toString()); 65 | var EnumerateClass = dyndex.loadClass("com.smartdone.EnumerateClass"); 66 | var castedEnumerateClass = Java.cast(EnumerateClass, reflectClass); 67 | var methods = castedEnumerateClass.getDeclaredMethods(); 68 | // loadAllClass 69 | var loadAllClass = undefined; 70 | for(var i in methods) { 71 | console.log(methods[i].getName()); 72 | if(methods[i].getName() == "loadAllClass") { 73 | console.log("find loadAllClass"); 74 | loadAllClass = methods[i]; 75 | } 76 | } 77 | if(loadAllClass != undefined) { 78 | console.log("loadAllClass: " + loadAllClass.toString()); 79 | var args = Java.array('Ljava.lang.Object;',[classloader]); 80 | var classlist = loadAllClass.invoke(null , args); 81 | console.log("start dump dex "); 82 | for(var i in dexrec) { 83 | if(Memory.readU32(dexrec[i]) == DEX_MAGIC) { 84 | var dex_len = Memory.readU32(dexrec[i].add(0x20)); 85 | var dumppath = filesDir.toString() + "/" + dex_len.toString(0x10) + ".dex"; 86 | console.log(dumppath); 87 | var dumpdexfile = new File(dumppath, "wb"); 88 | dumpdexfile.write(Memory.readByteArray(dexrec[i], dex_len)); 89 | dumpdexfile.close(); 90 | console.log("write file to " + dumppath); 91 | } 92 | } 93 | } 94 | 95 | 96 | } else { 97 | console.error("unable get classloader"); 98 | } 99 | return result; 100 | } 101 | } 102 | }); 103 | } 104 | -------------------------------------------------------------------------------- /DexUnpack/unpack.js: -------------------------------------------------------------------------------- 1 | var DEX_MAGIC = 0x0A786564; 2 | var dexrec = []; 3 | 4 | var openmemory = Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_10OatDexFileEPS9_"); 5 | if (openmemory != undefined) { 6 | console.log("openmemory at" + openmemory); 7 | Interceptor.attach(openmemory, { 8 | onEnter: function (args) { 9 | if (Memory.readU32(args[1]) == DEX_MAGIC) { 10 | dexrec.push(args[1]); 11 | } 12 | }, 13 | onLeave: function (retval) { 14 | 15 | } 16 | }); 17 | } 18 | 19 | if (Java.available) { 20 | Java.perform(function () { 21 | var dexBase64 = "ZGV4CjAzNQCjsh5+52qOBRMl1aMHk33QkLmfsSbOla5wDwAAcAAAAHhWNBIAAAAAAAAAAKAOAABpAAAAcAAAABwAAAAUAgAAGgAAAIQCAAABAAAAvAMAACUAAADEAwAAAQAAAOwEAABkCgAADAUAAAwFAAAPBQAAEgUAABcFAAAfBQAAIwUAADgFAABGBQAASQUAAE0FAABSBQAAVQUAAFkFAABeBQAAYwUAAHcFAACXBQAAtgUAAM8FAADiBQAA+AUAABEGAAAoBgAATAYAAG4GAACCBgAAlgYAALEGAADIBgAA4wYAAP4GAAAaBwAAMQcAAEgHAABzBwAAjAcAAKUHAADSBwAA6AcAAPoHAAD/BwAAAggAAAYIAAAKCAAADQgAABEIAAAlCAAAOggAAE8IAABsCAAAcQgAAHkIAACGCAAAlQgAAKAIAACnCAAAqggAALcIAADKCAAA0wgAANYIAADaCAAA4wgAAPEIAAD5CAAAAAkAAAsJAAAQCQAAGgkAACwJAABDCQAAVQkAAGkJAAB0CQAAfQkAAI0JAACgCQAArwkAAMAJAADJCQAAzAkAANQJAADeCQAA7AkAAPoJAAAFCgAADQoAABYKAAAcCgAAJgoAACwKAAA5CgAAQQoAAEcKAABQCgAAWgoAAGsKAABzCgAAggoAAIgKAACOCgAAlwoAAKAKAACqCgAAwAoAAAcAAAAOAAAADwAAABAAAAARAAAAEgAAABQAAAAVAAAAFgAAABcAAAAYAAAAGQAAABoAAAAbAAAAHAAAAB0AAAAeAAAAHwAAACIAAAAjAAAAJQAAACYAAAAoAAAAKwAAAC0AAAAuAAAALwAAADAAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAMgKAAAJAAAAAAAAAAgLAAAKAAAABQAAAAAAAAALAAAABQAAAOgKAAAKAAAACgAAAAAAAAALAAAACgAAAMgKAAAMAAAACgAAANAKAAANAAAACgAAANgKAAANAAAACgAAAOAKAAAKAAAACwAAAAAAAAALAAAADAAAAOgKAAALAAAADwAAAOgKAAALAAAAEQAAAPAKAAAKAAAAEwAAAAAAAAAKAAAAFAAAAAAAAAAoAAAAFgAAAAAAAAApAAAAFgAAAPAKAAApAAAAFgAAAPgKAAAqAAAAFgAAAAALAAArAAAAFwAAAAAAAAAsAAAAFwAAAMgKAAAKAAAAGAAAAAAAAAALAAAAGQAAABALAAALAAAAGgAAAPAKAAAKAAAAGwAAAAAAAAACAAsAJwAAAAEAAgA3AAAAAgAQAAMAAAACAA0ARAAAAAIAGABFAAAAAgAIAEoAAAACABEAUwAAAAQADgA9AAAABQAMAEYAAAAFABkARwAAAAUACgBJAAAABQADAEwAAAAGAAQAVAAAAAgAEABfAAAACQAQAF8AAAAKABAAAwAAAAoAAwBDAAAACwAVAD8AAAAMABAAAwAAAAwACwAyAAAADAAKAGYAAAAOAAcAQgAAAA4AAQBIAAAADwAGAEIAAAAPABMAYQAAABAACgBJAAAAEAAWAEsAAAAQAAkAUAAAABEAEAADAAAAEQAVADEAAAARAA8AUQAAABEAAABiAAAAEQAXAGUAAAASABIAYwAAABMAFABNAAAAEwAFAFoAAAAUABQATgAAABQABQBZAAAAAgAAAAEAAAAKAAAAAAAAAAUAAAA8CwAAhA4AABYLAAABKAABKQADLS0+AAY8aW5pdD4AAj47ABNFbnVtZXJhdGVDbGFzcy5qYXZhAAxGUmlEQV9VTlBBQ0sAAUkAAklMAANJTEwAAUwAAkxMAANMTEkAA0xMTAASTGFuZHJvaWQvdXRpbC9Mb2c7AB5MY29tL3NtYXJ0ZG9uZS9FbnVtZXJhdGVDbGFzczsAHUxkYWx2aWsvYW5ub3RhdGlvbi9TaWduYXR1cmU7ABdMZGFsdmlrL3N5c3RlbS9EZXhGaWxlOwARTGphdmEvbGFuZy9DbGFzczsAFExqYXZhL2xhbmcvQ2xhc3M8Kj47ABdMamF2YS9sYW5nL0NsYXNzTG9hZGVyOwAVTGphdmEvbGFuZy9FeGNlcHRpb247ACJMamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb247ACBMamF2YS9sYW5nL05vU3VjaEZpZWxkRXhjZXB0aW9uOwASTGphdmEvbGFuZy9PYmplY3Q7ABJMamF2YS9sYW5nL1N0cmluZzsAGUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsAFUxqYXZhL2xhbmcvVGhyb3dhYmxlOwAZTGphdmEvbGFuZy9yZWZsZWN0L0FycmF5OwAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsAFUxqYXZhL3V0aWwvQXJyYXlMaXN0OwAVTGphdmEvdXRpbC9BcnJheUxpc3Q8AClMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OwAXTGphdmEvdXRpbC9Db2xsZWN0aW9uczsAF0xqYXZhL3V0aWwvRW51bWVyYXRpb247ACtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ABRMamF2YS91dGlsL0l0ZXJhdG9yOwAQTGphdmEvdXRpbC9MaXN0OwADVEFHAAFWAAJWTAACVloAAVoAAlpMABJbTGphdmEvbGFuZy9DbGFzczsAE1tMamF2YS9sYW5nL09iamVjdDsAE1tMamF2YS9sYW5nL1N0cmluZzsAG1tMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwADYWRkAAZhcHBlbmQAC2NsYXNzTG9hZGVyAA1jbGFzc05hbWVMaXN0AAljbGFzc2xpc3QABWNsYXp6AAFkAAtkZXhFbGVtZW50cwARZGV4RWxlbWVudHNMZW5ndGgAB2RleEZpbGUAAWUAAmUyAAdlbnRyaWVzAAxlbnVtZXJhdGlvbnMABmVxdWFscwAFZmllbGQACWZpZWxkTmFtZQADZ2V0AAhnZXRDbGFzcwAQZ2V0Q2xhc3NOYW1lTGlzdAAVZ2V0Q2xhc3NOYW1lTGlzdEFycmF5ABBnZXREZWNsYXJlZEZpZWxkABJnZXREZWNsYXJlZE1ldGhvZHMACWdldExlbmd0aAAHZ2V0TmFtZQAOZ2V0T2JqZWN0RmllbGQAEWdldFBhcmFtZXRlclR5cGVzAA1nZXRTdXBlcmNsYXNzAA9oYXNNb3JlRWxlbWVudHMAB2hhc05leHQAAWkABmludm9rZQAIaXRlcmF0b3IADGxvYWQgY2xhc3M6IAAMbG9hZEFsbENsYXNzAAlsb2FkQ2xhc3MABm1ldGhvZAAHbWV0aG9kcwAEbmFtZQAIbmFtZWxpc3QABG5leHQAC25leHRFbGVtZW50AAZvYmplY3QABG9ianMAB3Bhcm1sZW4ACHBhdGhMaXN0AA9wcmludFN0YWNrVHJhY2UABnJldHZhbAANc2V0QWNjZXNzaWJsZQAEc2l6ZQAEc29ydAAHc3VjY2VzcwAHdG9BcnJheQAIdG9TdHJpbmcAFHRyeSB0byBsb2FkIG1ldGhvZDogAAV2YWx1ZQAAAQAAAAoAAAACAAAACgAAAAIAAAAKAAsAAgAAAAoAGQABAAAACwAAAAEAAAAGAAAAAQAAABUAAAABAAAAFwAAAAIAAAALAAsAAQAAABkAARcGAgMBaBwGFwAXFBcBFyAXGRcEAAAAAAAAAAAAAQAAABkLAAAAAAAAAAAAAAEAAAAAAAAAAgAAADQLAAAOAA4AJAE0DlsEADUSIsMDATkLSwMCOgEdAwNQAS3/BAQ/FCVpoQUEQgUBBQIFAxwfPAA1ATQOSwQAWRIiaQMBYRs8ABMCXEIOSwMANwYBEBBLAwFBEEtdBQEeAwE9CTsFARkeAwE8CjxNBQEfAD0BNA5LBAA2EiL/AwJYDEsEAzcGFEsDBFccARoPaQMHVhFaAwheAS0DCV0aASYPSwJ7dwUHBQgFCUIFAgUDBQQgBQAbIAABAAEAAQAAAFQLAAAEAAAAcBAOAAAADgAHAAEAAgABAFgLAABBAAAAIgARAHAQGwAAABoBXgBxIAQAFgAMARoCOABxIAQAIQAMAXEQFQABAAoCEgM1IyUAcSAUADEADAQaBToAcSAEAFQADAQfBAQAbhAGAAQADARyECEABAAKBTgFDAByECIABAAMBR8FCwBuIBwAUAAo8dgDAwEo3CgCDQFxECAAAAARAAAABQAAADIAAQABAQc8AwABAAIAAACHCwAADgAAAHEQAgACAAwAbhAeAAAACgEjERoAbiAfABAAEQEFAAIAAgABAJgLAAAxAAAAbhAPAAMADABuEAkAAAAMARwCCgBuEAkAAgAMAm4gEAAhAAoBOQEdAG4gBwBAAAwBEhJuIBcAIQBuIBYAMQAMAhECDQFuEAwAAQAoCQ0BbhANAAEAbhAKAAAADAAo1hIBEQEAABQAAAAMAAEAAQIJJgghAAAOAAEAAwABAMILAAB7AAAAcRACAA0ADABuEB0AAAAMAXIQIwABAAoCOAJsAHIQJAABAAwCHwILAG4gCwAtAAwDbhAIAAMADAQaBQYAIgYMAHAQEQAGABoHUgBuIBIAdgBuEAkAAwAMB24gEgB2AG4QEwAGAAwGcSAAAGUAIUUSBjVWPwBGBwQGbhAZAAcADAghiCOJGQAaCgYAIgsMAHAQEQALABoMZwBuIBIAywBuEAkAAwAMDG4gEgDLABoMAgBuIBIAywBuEBgABwAMDG4gEgDLAG4QEwALAAwLcSAAALoAEgpuMBoApwkaCgYAGgtkAHEgAAC6ANgGBgEowiiRKAINAA4AAAAAAAAAdAABAAEBDXkBAAUAABoBgYAEiBgBCaAYAQnAGQEJ7BkBCfAaEQAAAAAAAAABAAAAAAAAAAEAAABpAAAAcAAAAAIAAAAcAAAAFAIAAAMAAAAaAAAAhAIAAAQAAAABAAAAvAMAAAUAAAAlAAAAxAMAAAYAAAABAAAA7AQAAAIgAABpAAAADAUAAAEQAAAKAAAAyAoAAAUgAAABAAAAFgsAAAQgAAABAAAAGQsAAAMQAAADAAAALAsAAAYgAAABAAAAPAsAAAMgAAAFAAAAVAsAAAEgAAAFAAAACAwAAAAgAAABAAAAhA4AAAAQAAABAAAAoA4AAA=="; 22 | var application = Java.use("android.app.Application"); 23 | var BaseDexClassLoader = Java.use("dalvik.system.BaseDexClassLoader"); 24 | var Base64 = Java.use("android.util.Base64"); 25 | var FileOutputStream = Java.use("java.io.FileOutputStream"); 26 | var DexClassLoader = Java.use("dalvik.system.DexClassLoader"); 27 | 28 | var reflectField = Java.use("java.lang.reflect.Field"); 29 | var reflectMethod = Java.use("java.lang.reflect.Method"); 30 | var reflectObject = Java.use("java.lang.Object"); 31 | var reflectClass = Java.use("java.lang.Class"); 32 | var reflectString = Java.use("java.lang.String"); 33 | var reflectClassloader = Java.use("java.lang.ClassLoader"); 34 | 35 | 36 | // hexdump dex to /data/data/pkg/dir 37 | 38 | if(application != undefined) { 39 | application.attach.overload('android.content.Context').implementation = function(context) { 40 | var result = this.attach(context); 41 | var classloader = context.getClassLoader(); 42 | var filesDir = context.getFilesDir(); 43 | var codeCacheDir = context.getCodeCacheDir(); 44 | console.log("files dir: " + filesDir); 45 | console.log("code cache dir: " + codeCacheDir); 46 | if(classloader != undefined) { 47 | var casedloader = Java.cast(classloader, BaseDexClassLoader); 48 | var dexbytes = Base64.decode(dexBase64, 0); 49 | var dexpath = filesDir + "/emmm.dex"; 50 | var fout = FileOutputStream.$new(dexpath); 51 | fout.write(dexbytes, 0, dexbytes.length); 52 | fout.close(); 53 | console.log("write dex to " + dexpath); 54 | // 55 | var dexstr = dexpath.toString(); 56 | var cachestr = codeCacheDir.toString(); 57 | 58 | var dyndex = DexClassLoader.$new(dexstr, cachestr, cachestr, classloader); 59 | console.log(dyndex.toString()); 60 | var EnumerateClass = dyndex.loadClass("com.smartdone.EnumerateClass"); 61 | var castedEnumerateClass = Java.cast(EnumerateClass, reflectClass); 62 | var methods = castedEnumerateClass.getDeclaredMethods(); 63 | // loadAllClass 64 | var loadAllClass = undefined; 65 | for(var i in methods) { 66 | console.log(methods[i].getName()); 67 | if(methods[i].getName() == "loadAllClass") { 68 | console.log("find loadAllClass"); 69 | loadAllClass = methods[i]; 70 | } 71 | } 72 | if(loadAllClass != undefined) { 73 | console.log("loadAllClass: " + loadAllClass.toString()); 74 | var args = Java.array('Ljava.lang.Object;',[classloader]); 75 | var classlist = loadAllClass.invoke(null , args); 76 | console.log("start dump dex "); 77 | for(var i in dexrec) { 78 | if(Memory.readU32(dexrec[i]) == DEX_MAGIC) { 79 | var dex_len = Memory.readU32(dexrec[i].add(0x20)); 80 | var dumppath = filesDir.toString() + "/" + dex_len.toString(0x10) + ".dex"; 81 | console.log(dumppath); 82 | var dumpdexfile = new File(dumppath, "wb"); 83 | dumpdexfile.write(Memory.readByteArray(dexrec[i], dex_len)); 84 | dumpdexfile.close(); 85 | console.log("write file to " + dumppath); 86 | } 87 | } 88 | } 89 | 90 | 91 | } else { 92 | console.error("unable get classloader"); 93 | } 94 | return result; 95 | } 96 | } 97 | }); 98 | } -------------------------------------------------------------------------------- /jd/libSo.js: -------------------------------------------------------------------------------- 1 | var DEX_MAGIC = 0x0A786564; 2 | var dexrec = []; 3 | 4 | var openmemory = Module.findExportByName("libart.so", "_ZN3art7DexFile10OpenMemoryEPKhjRKNSt3__112basic_stringIcNS3_11char_traitsIcEENS3_9allocatorIcEEEEjPNS_6MemMapEPKNS_7OatFileEPS9_"); 5 | if (openmemory !== undefined) { 6 | console.log("openmemory at" + openmemory); 7 | Interceptor.attach(openmemory, { 8 | onEnter: function (args) { 9 | console.log('args[0] : ' + Memory.readU32(args[0])); 10 | console.log('DEX_MAGIC : ' + DEX_MAGIC); 11 | if (Memory.readU32(args[0]) === DEX_MAGIC) { 12 | dexrec.push(args[0]); 13 | } 14 | }, 15 | onLeave: function (retval) { 16 | 17 | } 18 | }); 19 | } 20 | console.log('===' ); 21 | if (Java.available) { 22 | console.log('2' ); 23 | Java.perform(function () { 24 | console.log('3' ); 25 | var dexBase64 = "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Zy9yZWZsZWN0L01ldGhvZDsAFUxqYXZhL3V0aWwvQXJyYXlMaXN0OwAVTGphdmEvdXRpbC9BcnJheUxpc3Q8AClMamF2YS91dGlsL0FycmF5TGlzdDxMamF2YS9sYW5nL1N0cmluZzs+OwAXTGphdmEvdXRpbC9Db2xsZWN0aW9uczsAF0xqYXZhL3V0aWwvRW51bWVyYXRpb247ACtMamF2YS91dGlsL0VudW1lcmF0aW9uPExqYXZhL2xhbmcvU3RyaW5nOz47ABRMamF2YS91dGlsL0l0ZXJhdG9yOwAQTGphdmEvdXRpbC9MaXN0OwADVEFHAAFWAAJWTAACVloAAVoAAlpMABJbTGphdmEvbGFuZy9DbGFzczsAE1tMamF2YS9sYW5nL09iamVjdDsAE1tMamF2YS9sYW5nL1N0cmluZzsAG1tMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOwADYWRkAAZhcHBlbmQAC2NsYXNzTG9hZGVyAA1jbGFzc05hbWVMaXN0AAljbGFzc2xpc3QABWNsYXp6AAFkAAtkZXhFbGVtZW50cwARZGV4RWxlbWVudHNMZW5ndGgAB2RleEZpbGUAAWUAAmUyAAdlbnRyaWVzAAxlbnVtZXJhdGlvbnMABmVxdWFscwAFZmllbGQACWZpZWxkTmFtZQADZ2V0AAhnZXRDbGFzcwAQZ2V0Q2xhc3NOYW1lTGlzdAAVZ2V0Q2xhc3NOYW1lTGlzdEFycmF5ABBnZXREZWNsYXJlZEZpZWxkABJnZXREZWNsYXJlZE1ldGhvZHMACWdldExlbmd0aAAHZ2V0TmFtZQAOZ2V0T2JqZWN0RmllbGQAEWdldFBhcmFtZXRlclR5cGVzAA1nZXRTdXBlcmNsYXNzAA9oYXNNb3JlRWxlbWVudHMAB2hhc05leHQAAWkABmludm9rZQAIaXRlcmF0b3IADGxvYWQgY2xhc3M6IAAMbG9hZEFsbENsYXNzAAlsb2FkQ2xhc3MABm1ldGhvZAAHbWV0aG9kcwAEbmFtZQAIbmFtZWxpc3QABG5leHQAC25leHRFbGVtZW50AAZvYmplY3QABG9ianMAB3Bhcm1sZW4ACHBhdGhMaXN0AA9wcmludFN0YWNrVHJhY2UABnJldHZhbAANc2V0QWNjZXNzaWJsZQAEc2l6ZQAEc29ydAAHc3VjY2VzcwAHdG9BcnJheQAIdG9TdHJpbmcAFHRyeSB0byBsb2FkIG1ldGhvZDogAAV2YWx1ZQAAAQAAAAoAAAACAAAACgAAAAIAAAAKAAsAAgAAAAoAGQABAAAACwAAAAEAAAAGAAAAAQAAABUAAAABAAAAFwAAAAIAAAALAAsAAQAAABkAARcGAgMBaBwGFwAXFBcBFyAXGRcEAAAAAAAAAAAAAQAAABkLAAAAAAAAAAAAAAEAAAAAAAAAAgAAADQLAAAOAA4AJAE0DlsEADUSIsMDATkLSwMCOgEdAwNQAS3/BAQ/FCVpoQUEQgUBBQIFAxwfPAA1ATQOSwQAWRIiaQMBYRs8ABMCXEIOSwMANwYBEBBLAwFBEEtdBQEeAwE9CTsFARkeAwE8CjxNBQEfAD0BNA5LBAA2EiL/AwJYDEsEAzcGFEsDBFccARoPaQMHVhFaAwheAS0DCV0aASYPSwJ7dwUHBQgFCUIFAgUDBQQgBQAbIAABAAEAAQAAAFQLAAAEAAAAcBAOAAAADgAHAAEAAgABAFgLAABBAAAAIgARAHAQGwAAABoBXgBxIAQAFgAMARoCOABxIAQAIQAMAXEQFQABAAoCEgM1IyUAcSAUADEADAQaBToAcSAEAFQADAQfBAQAbhAGAAQADARyECEABAAKBTgFDAByECIABAAMBR8FCwBuIBwAUAAo8dgDAwEo3CgCDQFxECAAAAARAAAABQAAADIAAQABAQc8AwABAAIAAACHCwAADgAAAHEQAgACAAwAbhAeAAAACgEjERoAbiAfABAAEQEFAAIAAgABAJgLAAAxAAAAbhAPAAMADABuEAkAAAAMARwCCgBuEAkAAgAMAm4gEAAhAAoBOQEdAG4gBwBAAAwBEhJuIBcAIQBuIBYAMQAMAhECDQFuEAwAAQAoCQ0BbhANAAEAbhAKAAAADAAo1hIBEQEAABQAAAAMAAEAAQIJJgghAAAOAAEAAwABAMILAAB7AAAAcRACAA0ADABuEB0AAAAMAXIQIwABAAoCOAJsAHIQJAABAAwCHwILAG4gCwAtAAwDbhAIAAMADAQaBQYAIgYMAHAQEQAGABoHUgBuIBIAdgBuEAkAAwAMB24gEgB2AG4QEwAGAAwGcSAAAGUAIUUSBjVWPwBGBwQGbhAZAAcADAghiCOJGQAaCgYAIgsMAHAQEQALABoMZwBuIBIAywBuEAkAAwAMDG4gEgDLABoMAgBuIBIAywBuEBgABwAMDG4gEgDLAG4QEwALAAwLcSAAALoAEgpuMBoApwkaCgYAGgtkAHEgAAC6ANgGBgEowiiRKAINAA4AAAAAAAAAdAABAAEBDXkBAAUAABoBgYAEiBgBCaAYAQnAGQEJ7BkBCfAaEQAAAAAAAAABAAAAAAAAAAEAAABpAAAAcAAAAAIAAAAcAAAAFAIAAAMAAAAaAAAAhAIAAAQAAAABAAAAvAMAAAUAAAAlAAAAxAMAAAYAAAABAAAA7AQAAAIgAABpAAAADAUAAAEQAAAKAAAAyAoAAAUgAAABAAAAFgsAAAQgAAABAAAAGQsAAAMQAAADAAAALAsAAAYgAAABAAAAPAsAAAMgAAAFAAAAVAsAAAEgAAAFAAAACAwAAAAgAAABAAAAhA4AAAAQAAABAAAAoA4AAA=="; 26 | var application = Java.use("android.app.Application"); 27 | var BaseDexClassLoader = Java.use("dalvik.system.BaseDexClassLoader"); 28 | var Base64 = Java.use("android.util.Base64"); 29 | var FileOutputStream = Java.use("java.io.FileOutputStream"); 30 | var DexClassLoader = Java.use("dalvik.system.DexClassLoader"); 31 | 32 | var reflectField = Java.use("java.lang.reflect.Field"); 33 | var reflectMethod = Java.use("java.lang.reflect.Method"); 34 | var reflectObject = Java.use("java.lang.Object"); 35 | var reflectClass = Java.use("java.lang.Class"); 36 | var reflectString = Java.use("java.lang.String"); 37 | var reflectClassloader = Java.use("java.lang.ClassLoader"); 38 | 39 | 40 | if (application !== undefined) { 41 | application.attach.overload('android.content.Context').implementation = function (context) { 42 | var result = this.attach(context); 43 | var classloader = context.getClassLoader(); 44 | var filesDir = context.getFilesDir(); 45 | var codeCacheDir = context.getCodeCacheDir(); 46 | console.log("files dir: " + filesDir); 47 | console.log("code cache dir: " + codeCacheDir); 48 | if (classloader !== undefined) { 49 | var casedloader = Java.cast(classloader, BaseDexClassLoader); 50 | var dexbytes = Base64.decode(dexBase64, 0); 51 | var dexpath = filesDir + "/emmm.dex"; 52 | var fout = FileOutputStream.$new(dexpath); 53 | fout.write(dexbytes, 0, dexbytes.length); 54 | fout.close(); 55 | console.log("write dex to " + dexpath); 56 | 57 | var dexstr = dexpath.toString(); 58 | var cachestr = codeCacheDir.toString(); 59 | 60 | var dyndex = DexClassLoader.$new(dexstr, cachestr, cachestr, classloader); 61 | console.log(dyndex.toString()); 62 | var EnumerateClass = dyndex.loadClass("com.smartdone.EnumerateClass"); 63 | var castedEnumerateClass = Java.cast(EnumerateClass, reflectClass); 64 | var methods = castedEnumerateClass.getDeclaredMethods(); 65 | // loadAllClass 66 | var loadAllClass = undefined; 67 | for (var i in methods) { 68 | console.log(methods[i].getName()); 69 | if (methods[i].getName() == "loadAllClass") { 70 | console.log("find loadAllClass"); 71 | loadAllClass = methods[i]; 72 | } 73 | } 74 | if (loadAllClass != undefined) { 75 | console.log("loadAllClass: " + loadAllClass.toString()); 76 | var args = Java.array('Ljava.lang.Object;', [classloader]); 77 | var classlist = loadAllClass.invoke(null, args); 78 | console.log("start dump dex "); 79 | for (var i in dexrec) { 80 | if (Memory.readU32(dexrec[i]) === DEX_MAGIC) { 81 | var dex_len = Memory.readU32(dexrec[i].add(0x20)); 82 | var dumppath = filesDir.toString() + "/" + dex_len.toString(0x10) + ".dex"; 83 | console.log(dumppath); 84 | var dumpdexfile = new File(dumppath, "wb"); 85 | dumpdexfile.write(Memory.readByteArray(dexrec[i], dex_len)); 86 | dumpdexfile.close(); 87 | console.log("write file to " + dumppath); 88 | } 89 | } 90 | } 91 | 92 | 93 | } else { 94 | console.error("unable get classloader"); 95 | } 96 | return result; 97 | } 98 | } else { 99 | 100 | console.log("false "); 101 | } 102 | }); 103 | } -------------------------------------------------------------------------------- /eleme/test.html: -------------------------------------------------------------------------------- 1 |

