Android获取当前前台包名/进程的方法

获取当前前台进程的方法有很多,不过有的方法在高版本安卓可能不好使,通常5.0之前的设备可以用ActivityManager的getRunningTasks方法,5.0使用ActivityManager的getRunningAppprocesses方法,5.1及之后版本可以用UsageStatsManager的queryEvents方法 封装成一个方法如下: public static String getTopAppPackageName(Context context) {     String packageName = "";     ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);     try {         if(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP){             List<ActivityManager.RunningTaskInfo> rti = activityManager.getRunningTasks(1);             packageName = rti.get(0).topActivity.getPackageName();         } else if(Build.VERSION.SDK_INT == Build.VERSION_CODES.LOLLIPOP) {             List<ActivityManager.RunningAppProcessInfo> processes = activityManager.getRunningAppProcesses();             if (processes.size() == 0) {                 return packageName;             }             for (ActivityManager.RunningAppProcessInfo process : processes) {                 if (process.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {                     return process.processName;                 }             }         } else if(Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP){             final long end = System.currentTimeMillis();             final UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService( Context.USAGE_STATS_SERVICE);             if (null == usageStatsManager) {                 return packageName;             }             final UsageEvents events = usageStatsManager.queryEvents((end – 60 * 1000), end);             if (null == events) {                 return packageName;             }             UsageEvents.Event usageEvent = new UsageEvents.Event();             UsageEvents.Event lastMoveToFGEvent = null;             while (events.hasNextEvent()) {                 events.getNextEvent(usageEvent);                 if (usageEvent.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {                     lastMoveToFGEvent = usageEvent;                 }             }             if (lastMoveToFGEvent != null) {                 packageName = lastMoveToFGEvent.getPackageName();             }         }     }catch (Exception ignored){     }     return packageName; } 其中5.1以上的api需要申请权限: android.permission.PACKAGE_USAGE_STATS private boolean isNoSwitch() {     if (Build.VERSION.SDK_INT < 21) {         return true;     }     List<UsageStats> queryUsageStats = ((UsageStatsManager) getApplicationContext().             getSystemService(Context.USAGE_STATS_SERVICE))             .queryUsageStats(4, 0, System.currentTimeMillis());     return queryUsageStats != null && !queryUsageStats.isEmpty(); … Read more

Android使用系统签名签名apk

1. java -jar signapk.jar platform.x509.pem platform.pk8 Demo.apk signedDemo.apk 或者直接在Ubuntu 编译环境执行 java -jar out/host/linux-x86/framework/signapk.jar build/target/product/security/platform.x509.pem build/target/product/security/platform.pk8 input.apk output.apk 2. a:把pkcs8格式的私钥转化成pkcs12格式 openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out shared.priv.pem -nocrypt b:x509.pem公钥转换成pkcs12格式 openssl pkcs12 -export -in platform.x509.pem -inkey     shared.priv.pem -out shared.pk12 -name androiddebugkey 密码都是:android c:生成platform.keystore keytool -importkeystore -deststorepass android -destkeypass android -destkeystore platform.keystore -srckeystore shared.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey

Frida hook 微信掷骰子

import  frida,sys rdev=frida.get_usb_device() session=rdev.attach("com.tencent.mm") print(session) # 1对应2点 # 4对应5点 # 3对应4点 # 0对应1点 # 2对应3点 # 5对应6点 jsr=""" Java.perform(function(){ var native=Java.use("com.tencent.mm.sdk.xx.xx"); native.方法名.overload("int","int").implementation=function(arr1,arr2){ console.log("调用了",arr1,arr2); var res=this.方法名(arr1,arr2); console.log("结果是"+res);  return 5; } }); """ def on_msg(message,data):     print(message) script=session.create_script(jsr) script.on("message",on_msg) script.load() sys.stdin.read()

Frida获取类下的所有方法和属性

Java.perform(function(){ var native=Java.use("com.tencent.mm.sdk.platformtools.bo"); console.log( Object.getOwnPropertyNames(native.__proto__).join("—") ); }); 以上js代码获取  com.tencent.mm.sdk.platformtools.bo 下所有的方法和属性 输出: (tensorflow) E:androiddevsdkplatform-tools>python wx.py Session(pid=3791) constructor—$new—$alloc—$init—$dispose—$isSameObject—class—$className—B—C—D—E—ET—G—H—K—N—P—PM—Q—R—SU—Y—a—aB—aC—aH—ag—ah—am—aq—arY—arZ—asA—asB—asC—asD—asE—asF—asG—asa—asb—asc—asd—ase—asf—asg—ash—asi—asj—ask—asl—asm—asn—aso—asp—asq—asr—ass—ast—asu—asv—asw—asx—asy—asz—ayF—ayG—b—bK—bL—bn—bq—c—cP—ci—cm—cn—co—convertStreamToString—cp—cq—cv—dNR—dNS—dNT—dNU—dNV—dNW—dNX—dNY—dNZ—dOa—deleteFile—dp—dq—e—eT—f—fH—fI—getBoolean—getDouble—getFloat—getInt—getLong—gp—h—hJ—hK—hL—hM—hN—hO—hP—hQ—hR—hS—hT—hb—hc—hideVKB—i—if—ig—isEqual—isNullOrNil—j—jf—jg—k—l—n—nN—nO—nP—nQ—nR—nullAsNil—o—om—q—r—readFromFile—t—wk—y—AzT—AzU—GMT—hij—kbE—kbF

adb 导出安装包

#列出已安装的所有包  adb shell pm list package package:com.miui.screenrecorder package:com.github.shadowsocks package:com.android.cts.priv.ctsshim package:com.qualcomm.qti.auth.sampleextauthservice package:com.qualcomm.qti.perfdump package:com.miui.contentextension package:com.oasisfeng.greenify package:com.android.providers.telephony package:com.miui.powerkeeper package:com.unionpay.tsmservice.mi package:com.mi.liveassistant package:com.android.providers.calendar package:com.miui.contentcatcher #查看要导出安装包的路径 adb shell pm path com.github.shadowsocks package:/data/app/com.github.shadowsocks-cCS55QKHkkCVrRtJVa79Rw==/base.apk #复制地址导出安装包 adb pull  /data/app/com.github.shadowsocks-cCS55QKHkkCVrRtJVa79Rw==/base.apk   shadowsocks.apk  over

Anroid开发安全技巧

混淆 加固 https 检测wifi代理 /**  * 检测是否使用了代理  * @return  */ public static boolean checkIsProxy(){     String host = System.getProperty("http.proxyHost");     String port = System.getProperty("http.proxyPort");     if (port == null) {         port = "-1";     }     int p = Integer.parseInt(port);     if(!TextUtils.isEmpty(host)&&p!=-1){         return  true;     }     return  false; } 检测是否手机是否root package com.bianyi.toufang.util; import android.content.Context; import android.content.pm.PackageManager; import java.io.BufferedReader; import java.io.File; import java.io.InputStreamReader; public class RootUtils {     public static boolean isDeviceRooted(Context context) {         return checkRootMethod1() || checkRootMethod2() || checkRootMethod3()||checkRootMethod4(context);     }     private static boolean checkRootMethod1() {         String buildTags = android.os.Build.TAGS;         return buildTags != null && buildTags.contains("test-keys");     }     private static boolean checkRootMethod2() {         String[] paths = { "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su",                 "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"};         for (String path : paths) {             if (new File(path).exists()) return true;         }         return false;     }     private static boolean checkRootMethod3() {         Process process = null;         try {             process = Runtime.getRuntime().exec(new String[] { "/system/xbin/which", "su" });             BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));             if (in.readLine() != null) return true;             return false;         } catch (Throwable t) {             return false;         } finally {             if (process != null) process.destroy();         } … Read more

Android 使用adb WIFI调试

嫌麻烦的话可以用Android Studio的插件Android wifi adb  ,这里记录了一下使用adb命令行进行wifi调试的过程,前提是手机 要和pc连同一个局域网 1. 手机连接usb 2. 命令行切到android sdk/platform-tools 目录下  E:>cd E:androiddevsdkplatform-tools 3.  查看设备    adb devices 4. 设置tcp端口  adb tcpip 5555 5. 连接设备  adb connect 192.168.3.172:5555 192.168.3.172是你手机设备在局域网的ip,下面就可以愉快的调试了 

Fiddler Android 7.0以上无法抓取https包问题解决

Fiddler提供的证书是.cer格式的证书,而安卓系统跟证书是.0格式的证书,我们需要做的是把fiddler证书先转换成安卓需要的.0证书格式,然后将证书拷贝到Andorid根证书存放目录 /system/etc/security/cacerts/目录下面,具体参见下面流程 第一步准备一部获取root权限的android手机 第二步浏览器输入fiddler证书下载地址,下载FiddlerRoot.cer证书 第三步,将cer证书转换成.0证书  openssl x509 -inform DER -subject_hash_old -in FiddlerRoot.cer    269953fb  #输出cer证书hash,转换成android证书的命名就用 269953fb.0 openssl x509 -inform DER -in FiddlerRoot.cer -text > 269953fb.0   #导出android证书 编辑输出的文件,把"—–BEGIN CERTIFICATE—–"到文件结束这部分移动到文件首部 第四步,将证书导入android系统证书目录  adb devices #查看设备 adb root #root用户   adb push 269953fb.0 /sdcard  #推送证书到手机  adb disable-verity  adb reboot  adb remount  adb root  adb shell  su  mount -o rw,remount /system  cp /sdcard/269953fb.0 /system/ect/security/cacerts/ cd /system/etc/security/cacerts chmod 644 269953fb.0  #分配权限  exit; 这样证书就被导入到android根目录了,打开任意app,小程序,fiddler完美展示数据,舒服 ~ 参考链接 http://wiki.cacert.org/FAQ/ImportRootCert#Android_Phones_.26_Tablets https://blog.csdn.net/xiangguiwang/article/details/76400805 https://segmentfault.com/a/1190000017035564 https://www.openssl.org/docs/manmaster/man1/x509.html https://blog.csdn.net/houxn22/article/details/81901520 ps:2020.4.8更新   参考链接  https://blog.csdn.net/liuluok123/article/details/95971731 三、Openssl安装完成后把证书导入到Linux系统下并进行转换 转换命令: 1.openssl x509 -inform der -in fiddler.cer -out fiddler.pem 2.openssl x509 -inform PEM -subject_hash_old -in fiddler.pem | head -1 得到类似字符串:9a5ba575 … Read more

Android Apktool工具解包修改合重新打包过程

很早就一直在用apktool工具了,但是一直局限于解包看layout的接口等,反编译的时候基本上都用封装好的jadx-gui(加壳的可能得先要去壳)。 今天简单的看了下apktool官方文档,尝试了解包 打包 再签名的过程 。   1.requirements     jdk7+   2. apktool  https://ibotpeaches.github.io/Apktool/install/ (我这需要跨过gfw) 操作步骤: 一. 解包   apktool d xxxx.apk 二.修改图片文字信息 三. 生成签名  keytool -genkey -alias adam.keystore -keyalg RSA -validity 20000 -keystore adam.keystore 四.生成APK  apktool b xxxx -o adam.apk 五.APK签名 jarsigner -verbose -keystore adam.keystore -signedjar adam_signed.apk adam.apk adam.keystore over