Android APP打包的时候提示错误

Android APP打包的时候提示错误,第1张

Android系统的开放性和免费性等特征让开发者和用户趋之若鹜,用户也渐渐习惯了Android应用的这种免费午餐,但在免费的背后却有着巨大的安全阴影。

“Android APP二次打包”则是盗版正规Android APP,破解后植入恶意代码重新打包。不管从性能、用户体验、外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕的程序,它会在不知不觉中浪费手机电量、流量,恶意扣费、偷窥隐私等等行为。

面对二次打包不少公司都有自己的防范措施,知名公司的APP几乎都是自己在程序内部做过处理防止其APP被二次打包,一旦打包后重新运行则程序自动退出。接下来,我就来详解一下如何防止APP被二次打包。

要实现代码内部防止APP被二次打包首先得了解APK的机器识别原理,APK的唯一识别是依靠包名和签名来做鉴定的,类似豌豆夹的洗白白、360手机卫士等安全软件对APK的山寨识别,他们就是依赖包名来确定APK然后通过签名来确定其是否山寨。所以说自己的程序内部在启动的时候可以通过获取APK本身的签名然后和正确的签名做对比来识别自己是否被二次打包。

通过PackageManag对象可以获取APK自身的签名。

通过对签名的码的分解得到一串20左右的字符串,此字符串则是APK的签名的MD5值,通过获取的签名MD5值与正确的MD5值进行对比,就可以识别其APK是否被盗版。

下图是一些已做过保护的APP的代码块分析:

上图是“XX省电王“的防止二次打包的关键代码

上图是”XX电池管家”的防止二次打包的关键代码

以上两处都是smali层的代码,以上2处代码的截图都是下载量非常高的APP所做的防止二次打包的处理,其处理的代码肯定会使用到的关键代码是

Landroid/content/pm/PackageInfo;->signatures:[Landroid/content/pm/Signature。

此方法能够起到一定的安全作用,一般的打包党面对它是无可奈何的,如果你了解一些smali语法它的作用就等于0了。

爱加密——专业的APP安全保护加固平台!

package mybag;

import javaioFile;

import javaioFileInputStream;

import javamathBigInteger;

import javasecurityMessageDigest;

import javautilHashMap;

import javautilMap;

import androidappActivity;

import androidosBundle;

import androidutilLog;

public class FileDigest extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

superonCreate(savedInstanceState);

File file = new File("/mnt/sdcard/123txt");

Loge("MD5", getFileMD5(file));

}

public static String getFileMD5(File file) {

if (!fileisFile()) {

return null;

}

MessageDigest digest = null;

FileInputStream in = null;

byte buffer[] = new byte[1024];

int len;

try {

digest = MessageDigestgetInstance("MD5");

in = new FileInputStream(file);

while ((len = inread(buffer, 0, 1024)) != -1) {

digestupdate(buffer, 0, len);

}

inclose();

} catch (Exception e) {

eprintStackTrace();

return null;

}

BigInteger bigInt = new BigInteger(1, digestdigest());

return bigInttoString(16);

}

public static Map getDirMD5(File file, boolean listChild) {

if (!fileisDirectory()) {

return null;

}

Map map = new HashMap();

String md5;

File files[] = filelistFiles();

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

File f = files[i];

if (fisDirectory() && listChild) {

mapputAll(getDirMD5(f, listChild));

} else {

md5 = getFileMD5(f);

if (md5 != null) {

mapput(fgetPath(), md5);

}

}

}

return map;

}

}

最后不要忘了在manifest中添加权限

最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理。首先贴出网上找来的读写Excel的脚本。

1读取Excel(需要安装xlrd):

123456789101112131415161718192021222324#-- coding: utf8 --import xlrd  fname = "reflectxls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname#获取行数nrows = shnrows#获取列数ncols = shncolsprint "nrows %d, ncols %d" % (nrows,ncols)#获取第一行第一列数据cell_value = shcell_value(1,1)#print cell_value  row_list = []#获取各行数据for i in range(1,nrows): row_data = shrow_values(i) row_listappend(row_data)

2写入Excel(需安装pyExcelerator)

12345678from pyExcelerator import  w = Workbook()  #创建一个工作簿ws = wadd_sheet('Hey, Hades')  #创建一个工作表wswrite(0,0,'bit') #在1行1列写入bitwswrite(0,1,'huang') #在1行2列写入huangwswrite(1,0,'xuan') #在2行1列写入xuanwsave('minixls')  #保存

3再举个自己写的读写Excel的例子

读取reflectxls中的某些信息进行处理后写入minixls文件中。 

1234567891011121314151617181920212223242526272829303132333435363738394041424344#-- coding: utf8 --import xlrdfrom pyExcelerator import   w = Workbook()ws = wadd_sheet('Sheet1') fname = "reflectxls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname nrows = shnrowsncols = shncolsprint "nrows %d, ncols %d" % (nrows,ncols)  cell_value = shcell_value(1,1)#print cell_value  row_list = []mydata = []for i in range(1,nrows): row_data = shrow_values(i) pkgdatas = row_data[3]split(',') #pkgdatassplit(',') #获取每个包的前两个字段 for pkgdata in pkgdatas:  pkgdata = ''join((pkgdatasplit(''))[:2])  mydataappend(pkgdata) #将列表排序 mydata = list(set(mydata)) print mydata #将列表转化为字符串 mydata = ','join(mydata) #写入数据到每行的第一列 wswrite(i,0,mydata) mydata = [] row_listappend(row_data[3])#print row_list wsave('minixls')

4现在我需要根据Excel文件中满足特定要求的apk的md5值来从服务器获取相应的apk样本,就需要这样做: 

123456789101112131415161718192021222324252627282930313233#--coding:utf8--import xlrdimport osimport shutil  fname = "/excelnamexls"bk = xlrdopen_workbook(fname)shxrange = range(bknsheets)try: #打开Sheet1工作表 sh = bksheet_by_name("Sheet1")except: print "no sheet in %s named Sheet1" % fname#获取行数nrows = shnrows#获取列数ncols = shncols#print "nrows %d, ncols %d" % (nrows,ncols)#获取第一行第一列数据cell_value = shcell_value(1,1)#print cell_value  row_list = []#range(起始行,结束行)for i in range(1,nrows): row_data = shrow_values(i) if row_data[6] == "HXB":  filename = row_data[3]+"apk"  #print "%s %s %s" %(i,row_data[3],filename)  filepath = r"/1/"+filename  print "%s %s %s" %(i,row_data[3],filepath)  if ospathexists(filepath):   shutilcopy(filepath, r"/myapk/")

补充一个使用xlwt3进行Excel文件的写 *** 作。

1234567891011121314151617181920212223242526import xlwt3 if __name__ == '__main__':         datas = [['a', 'b', 'c'], ['d', 'e', 'f'], ['g', 'h']]#二维数组    file_path = 'D:\\testxlsx'         wb = xlwt3Workbook()    sheet = wbadd_sheet('test')#sheet的名称为test         #单元格的格式    style = 'pattern: pattern solid, fore_colour yellow; '#背景颜色为**    style += 'font: bold on; '#粗体字    style += 'align: horz centre, vert center; '#居中    header_style = xlwt3easyxf(style)         row_count = len(datas)    col_count = len(datas[0])    for row in range(0, row_count):        col_count = len(datas[row])        for col in range(0, col_count):            if row == 0:#设置表头单元格的格式                sheetwrite(row, col, datas[row][col], header_style)            else:                sheetwrite(row, col, datas[row][col])    wbsave(file_path)

输出的文件内容如下图:

注:以上代码在Python 3x版本测试通过。

好了,python *** 作Excel就这么!些了,简单吧

方法如下:

1FILE="yourappapk"

cert_XSA=`jar tf $FILE | grep SA`

此时得到的cert_XSA可能是META-INF/RSA或者META-INF/DSA。

2apk中提取具体的签名文件。

jar xf $FILE $cert_XSA

此时会在当前目录得到cert_XSA文件。

3对于得到的签名文件,提取其中签名的MD5值

keytool -printcert -file $cert_XSA | grep MD5 > "$FILEcertMD5"

这时候yourappcertMD5这个文件中就保存了yourappapkk中的签名MD5值。

4最后比较两个app的签名可以用diff

FILE1="yourapp1apk"

FILE2="yourapp2apk"

//经过上述步骤得到$FILE1certMD5和$FILE2certMD5

certMD5_diff=`diff $FILE1certMD5 $FILE2certMD5`

if [ "$certMD5_diff" = "" ]; then

echo "$FILE1certMD5 == $FILE2certMD5"

fi

若输出yourapp1apkcertMD5 == yourapp2apkcertMD5那么这两个应用的签名就一致。

以上就是关于Android APP打包的时候提示错误全部的内容,包括:Android APP打包的时候提示错误、android开发中怎么获取文件的正确md5值、python怎么读取excel的数据等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9594167.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存