Android对抗反编译

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return null;

}

包名–思路:获取App的包名,检查APP包名是否与自己的包名一样,如果不一样,设置点用户不友好操作(崩溃啥的)。

/*

  • 获取当前应用的包名

*/

public static String getPackageName(Context context) {

PackageManager pm = context.getPackageManager();

try {

PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);

//拿到版本名称

return packageInfo.packageName;

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return null;

}

APP图标–同上,先获取APP的图标,然后对APP的图片进行验证。

博主的做法是:对图片获取五个点的rgb值,输出一个关于RGB的值(误差在0.1-3之间),然后进行值的大小范围判断。

/**

  • 获取图标 bitmap

*/

public static Bitmap getAppImageBitmap(Context context) {

PackageManager packageManager = null;

ApplicationInfo applicationInfo = null;

try {

packageManager = context.getApplicationContext()

.getPackageManager();

applicationInfo = packageManager.getApplicationInfo(

context.getPackageName(), 0);

} catch (PackageManager.NameNotFoundException e) {

applicationInfo = null;

}

Drawable d = packageManager.getApplicationIcon(applicationInfo);

if (d == null) {

return null;

}

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && d instanceof AdaptiveIconDrawable) {

Bitmap bitmap = Bitmap.createBitmap(d.getMinimumWidth(), d.getMinimumHeight(), Bitmap.Config.ARGB_8888);

Canvas canvas = new Canvas(bitmap);

d.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());

d.draw(canvas);

return bitmap;

} else {

return ((BitmapDrawable) d).getBitmap();

}

}

//输出一个关于此bitmap的值

public static float getBitmapColorScale(Bitmap bitmap){

Bitmap src =bitmap;

int R, G, B;

float Rmax=0,Gmax=0,Bmax=0;

float bitmapScale=0.f;

int pixelColor;

int height = src.getHeight()/4;

int width = src.getWidth()/4;

int heightscale[]={1,1,2,3,3};

int widthscale[]={1,3,2,1,3};

for (int i = 0; i <5 ; i++) {

pixelColor = src.getPixel(widthwidthscale[i],heightheightscale[i] );

R = Color.red(pixelColor);

G = Color.green(pixelColor);

B = Color.blue(pixelColor);

Rmax+=R;

Gmax+=G;

Bmax+=B;

}

bitmapScale=(Rmax+Gmax+Bmax)/5;

return bitmapScale;

}

2…想模仿实现某个功能,数据库

思路:对一些核心的数据进行伪装或者加密(秘钥,将一个数据以各种不同的方式存储)

最后:对classes.dex文件进行CRC值的验证(从服务器或者数据库获取CRC值与之进行对比)

//CRC是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数

public void apkIntegralityForCRC(Context context, String orginalCRC) {

// 获取Apk包的存储路径

String apkPath = context.getPackageCodePath();

try {

ZipFile zipFile = new ZipFile(apkPath);

// 读取ZIP包中的classes.dex文件

ZipEntry dexEntry = zipFile.getEntry(“classes.dex”);

// 得到classes.dex文件的CRC值

String dexCRC = String.valueOf(dexEntry.getCrc());

// 将此次得到的CRC值与数据库/服务器数据的CRC值进行比较校验

if (!dexCRC.equals(orginalCRC)) {

Toast.makeText(context,“APP已经被修改”,Toast.LENGTH_SHORT).show();

}

} catch (IOException e) {

e.printStackTrace();

}

}

以上所有操作为增大反编译的难度。

工具类如下:

/*用途

  • 1.获取当前应用的名称:getAppName

  • 2.获取当前应用的版本号:getVersionCode

  • 3.获取当前应用的版本名称:getVersionName

*/

public class PackageUtils {

public PackageUtils() {

}

/*

  • 获取当前应用的名称

*/

public static String getAppName(Context context) {

//获取 PackageManager

PackageManager pm = context.getPackageManager();

try {

//通过PackageManager这个Api可以拿到应用的一些信息

//packgeName:包名 flag:获取额外信息的标识

PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);

int labelRes = packageInfo.applicationInfo.labelRes;

return context.getResources().getString(labelRes);

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return null;

}

/*

  • 获取当前应用的版本号

*/

public static int getVersionCode(Context context) {

//获取 PackageManager

PackageManager pm = context.getPackageManager();

//通过PackageManager这个Api可以拿到应用的一些信息

//packgeName:包名 flag:获取额外信息的标识

try {

PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);

//拿到版本号

return packageInfo.versionCode;

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return -1;

}

/*

  • 获取当前应用的版本名称

*/

public static String getVersionName(Context context) {

PackageManager pm = context.getPackageManager();

try {

PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);

//拿到版本名称

return packageInfo.versionName;

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return null;

}

/*

  • 获取当前应用的包名

*/

public static String getPackageName(Context context) {

PackageManager pm = context.getPackageManager();

try {

PackageInfo packageInfo = pm.getPackageInfo(context.getPackageName(), 0);

//拿到版本名称

return packageInfo.packageName;

} catch (PackageManager.NameNotFoundException e) {

e.printStackTrace();

}

return null;

}

/**

  • 获取图标 bitmap

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

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

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

结语

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是目录截图:

由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。

再附一部分Android架构面试视频讲解:

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

可以扫码获取!!(备注:Android)**

[外链图片转存中…(img-Nj5hh0Eb-1713804360646)]

结语

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!以下是目录截图:

[外链图片转存中…(img-RwH08gfS-1713804360647)]

由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示 。

再附一部分Android架构面试视频讲解:

[外链图片转存中…(img-0vhHhA8w-1713804360648)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android Studio本身并不直接支持反编译APK文件。正如引用所述,通过Android Studio安装的debug APK实际上是不能安装的。Android Studio只是为我们提供了一些开发和调试工具。 要反编译APK文件,可以使用一些第三方工具。引用中介绍了一种工具叫做AndroidKiller,它可以帮助我们非常简单地反编译APK文件。通过AndroidKiller,我们可以打开APK文件并修改其中的内容,例如修改App的名字。AndroidKiller底层使用的是apktool.jar这个工具,它是谷歌官方推出的反编译软件。 具体操作步骤如下: 1. 使用Android Studio创建一个HelloWorld项目,并编译生成APK文件。 2. 使用AndroidKiller打开APK文件,它会自动将APK文件反编译成一些文件。 3. 在反编译后的文件中,找到res/values/strings.xml文件,里面有一个name="app_name"字段,将其值修改为想要的新App名称。 4. 在AndroidKiller中点击左上角的编译按钮,它会自动重新打包并加上签名。 5. 如果成功,AndroidKiller会在日志的最后一行告诉你生成的APK文件的位置。 6. 将生成的APK文件安装到模拟器或真机上即可。 需要注意的是,如果使用模拟器进行安装,请避免使用AndroidKiller提供的安装功能,因为在Windows系统上可能会遇到设备连接问题。可以手动将APK文件拖到模拟器中进行安装。 总结来说,要进行Android Studio的反编译,需要借助第三方工具,如AndroidKiller,并按照特定的步骤进行操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span>

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值