你发布的Android 应用安全吗?(2),2024年最新实战篇

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新网络安全全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上网络安全知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注网络安全)
img

正文

-keepclasseswithmembernames class * { # 保持 native 方法不被混淆
native ;
}

-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public (android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * { # 保持自定义控件类不被混淆
public (android.content.Context, android.util.AttributeSet, int);
}

-keepclassmembers class * extends android.app.Activity { //保持类成员
public void *(android.view.View);
}

-keepclassmembers enum * { # 保持枚举 enum 类不被混淆
public static **[] values();
public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
public static final android.os.Parcelable$Creator *;
}

-keep class MyClass; # 保持自己定义的类不被混淆

**注意: ** 在Android中有一部分是不能够被混淆的,混淆了之后就会出现异常:

  • 四大组件由于在Mainfest中注册了,所以不能被混淆
  • jin调用的Java的接口方法
  • 系统接口方法
  • R文件的混淆可能会导致引用错误(如果有地方使用反射机制,R文件被混淆之后就会找不到资源)

防止反编译

防止反编译方法

1 . Proguard混淆不仅仅可以混淆代码,还能反编译工具失效或者奔溃

2 . 使用现在国内的APK加固方法,就我所知目前你想要在360市场和腾讯的市场上发布应用,都要必须要使用他们对应的市场的加固方式:360加固和乐固加固

我们常用的反编译工具有哪些呢?

  • apkTool
  • baksmali
  • dex2.jar
  • JEB

我们通过上面的两种方法可以让这些反编译工具反编译出来不易阅读甚至让反编译工具失效或者。

由于前面已经提到过混淆的方法就不在赘述,使用国内的APK加固方法就更加的简单了,到指定的官网下载工具加固即可,文档描述很详细。

防止模拟器

防止模拟器逆向分析

原因:一般被处于逆向分析状态是在Android模拟器中运行的,所以我们只需要在代码中判断我们当前的APK是否运行在模拟器中即可。

检测是否是模拟器 一般有一下几种方式:

  • 检测模拟器上的几个特殊文件
  • 检测模拟器上的特殊号码
  • 检测设备IDS是不是“000000000000000”
  • 检测是否还有传感器、蓝牙
  • 检测手机上才有的硬件信息
  • 检测手机的运营商

下面我用代码来演示一下:

检查IDS

/**

  • 检查IDS
  • @param context
  • @return
    */
    public static boolean chechDeviceIDS(Context context) {
    @SuppressLint(“ServiceCast”)
    TelephonyManager telecomManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint(“MissingPermission”)
    String deviceId = telecomManager.getDeviceId();
    if (deviceId.equalsIgnoreCase(DEVICE_ID)) {
    Log.e(TAG, “chechDeviceIDS==” + DEVICE_ID);
    return true;
    }
    return false;
    }

检查模拟器特有文件

/**

  • 检查模拟器特有的文件
  • @param context
  • @return
    */
    public static boolean chechDeviceFile(Context context) {
    for (int i = 0; i < DEVICE_FILE.length; i++) {
    String file_name = DEVICE_FILE[i];
    File qemu_file = new File(file_name);
    if (qemu_file.exists()) {
    Log.e(TAG, “chechDeviceFile==” + true);
    return true;
    }
    }
    return false;
    }

检查模拟器特有号码

/**

  • 检查特有电话号码
  • @param context
  • @return
    */
    public static boolean chechDevicePhone(Context context) {
    @SuppressLint(“ServiceCast”)
    TelephonyManager telecomManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
    @SuppressLint(“MissingPermission”)
    String phoneNumber = telecomManager.getLine1Number();
    for (String phone : DEVICE_PHONE) {
    if (phone.equalsIgnoreCase(phoneNumber)) {
    Log.e(TAG, “chechDevicePhone==” + phoneNumber);
    return true;
    }
    }
    return false;
    }

检查模拟器是否含有这些设备

/**

  • 检查特是否含有设备
  • @param context
  • @return
    */
    public static boolean chechDeviceBuild(Context context) {
    String board = Build.BOARD;
    String bootloader = Build.BOOTLOADER;
    String brand = Build.BRAND;
    String device = Build.DEVICE;
    String hardware = Build.HARDWARE;
    String model = Build.MODEL;
    String product = Build.PRODUCT;

if (board.equalsIgnoreCase(“unknown”) || bootloader.equalsIgnoreCase(“unknown”)
|| brand.equalsIgnoreCase(“generic”) || model.equalsIgnoreCase(“sdk”)
|| product.equalsIgnoreCase(“goldfish”)) {
Log.e(TAG, “chechDeviceBuild==” + “find emulatorBuild”);
return true;
}
return false;
}

运行结果:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以看到打印结果是都显示是模拟器,提醒一点获取这些信息的时候别忘记添加权限:

通过上面我们可以判断是否是模拟器,那么这时我们就可以通过判断来杀死APP或者杀死APP所在的进程。

二次打包

防止二次打包

  • 什么是二次打包?
  • 通过反编译工具得到smali代码,然后再由smali代码,重打包形成APK,最后重新签名才能运行。

如果程序处于破解状态,那么我们的APK肯定是要运行在真机或者模拟器上,必须要重新签名,那么此时的签名和原来的签名必然不一致,我们就可以在程序的入口判断我们的签名,来以此判断二次打包。

代码如下:

public class MainActivity extends AppCompatActivity {
private static final String TAG = “MainActivity”;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.e(TAG, “getSignature==”+getSignature(“demo.lt.com.repacking”));
}

private int getSignature(String packageName) {
PackageManager packageManager = this.getPackageManager();
PackageInfo info = null;
int sig = 0;
try {
info = packageManager.getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
Signature[] signatures = info.signatures;
sig = signatures[0].hashCode();
} catch (Exception e) {
sig = 0;
e.printStackTrace();
}

return sig;
}
}

获取到签名hashCode是唯一值:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因此我们只需要再增加代码即可判断二次打包:

public class MainActivity extends AppCompatActivity {
private static final String TAG = “MainActivity”;

给大家的福利

零基础入门

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:

在这里插入图片描述

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

因篇幅有限,仅展示部分资料

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注网络安全)
[外链图片转存中…(img-iEgscu7G-1713217841832)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值