DEX加壳加密解决方案的设计与实现Word下载.docx

上传人:b****1 文档编号:14258511 上传时间:2022-10-21 格式:DOCX 页数:34 大小:119.29KB
下载 相关 举报
DEX加壳加密解决方案的设计与实现Word下载.docx_第1页
第1页 / 共34页
DEX加壳加密解决方案的设计与实现Word下载.docx_第2页
第2页 / 共34页
DEX加壳加密解决方案的设计与实现Word下载.docx_第3页
第3页 / 共34页
DEX加壳加密解决方案的设计与实现Word下载.docx_第4页
第4页 / 共34页
DEX加壳加密解决方案的设计与实现Word下载.docx_第5页
第5页 / 共34页
点击查看更多>>
下载资源
资源描述

DEX加壳加密解决方案的设计与实现Word下载.docx

《DEX加壳加密解决方案的设计与实现Word下载.docx》由会员分享,可在线阅读,更多相关《DEX加壳加密解决方案的设计与实现Word下载.docx(34页珍藏版)》请在冰豆网上搜索。

DEX加壳加密解决方案的设计与实现Word下载.docx

(一)解壳数据位于解壳程序文件尾部

该种方式简单实用,合并后的DEX文件结构如下。

加壳程序工作流程:

1、加密源程序APK文件为解壳数据

2、把解壳数据写入解壳程序Dex文件末尾,并在文件尾部添加解壳数据的大小。

3、修改解壳程序DEX头中checksum、signature和file_size头信息。

4、修改源程序AndroidMainfest.xml文件并覆盖解壳程序AndroidMainfest.xml文件。

解壳DEX程序工作流程:

1、读取DEX文件末尾数据获取借壳数据长度。

2、从DEX文件读取解壳数据,解密解壳数据。

以文件形式保存解密数据到a.APK文件

3、通过DexClassLoader动态加载a.apk。

(二)解壳数据位于解壳程序文件头

该种方式相对比较复杂,合并后DEX文件结构如下:

2、计算解壳数据长度,并添加该长度到解壳DEX文件头末尾,并继续解壳数据到文件头末尾。

(插入数据的位置为0x70处)

3、修改解壳程序DEX头中checksum、signature、file_size、header_size、string_ids_off、type_ids_off、proto_ids_off、field_ids_off、

method_ids_off、class_defs_off和data_off相关项。

分析map_off数据,修改相关的数据偏移量。

1、从0x70处读取解壳数据长度。

以文件形式保存解密数据到a.APK

3、通过DexClassLoader动态加载a.APK。

一、序言

在上篇“AndroidAPK加壳技术方案”(Dex加壳技术实现方案,本片博文将对方案1代码实现进行讲解。

博友可以根据方案1的代码实现原理对方案2自行实现。

在方案1的代码实现过程中,各种不同的问题接踵出现,最初的方案也在不同问题的出现、解决过程中不断的得到调整、优化。

本文的代码实现了对整个APK包的加壳处理。

加壳程序不会对源程序有任何的影响。

二、代码实现

本程序基于Android2.3代码实现,因为牵扯到系统代码的反射修改,本程序不保证在其它android版本正常工作,博友可以根据实现原理,自行实现对其它Android版本的兼容性开发。

1、 

加壳程序流程及代码实现

1、加密源程序APK为解壳数据

2、把解壳数据写入解壳程序DEX文件末尾,并在文件尾部添加解壳数据的大小。

代码实现如下:

[java] 

viewplaincopy

1.package 

.android.dexshell;

2.import 

java.io.ByteArrayOutputStream;

3.import 

java.io.File;

4.import 

java.io.FileInputStream;

5.import 

java.io.FileOutputStream;

6.import 

java.io.IOException;

7.import 

java.security.MessageDigest;

8.import 

java.security.NoSuchAlgorithmException;

9.import 

java.util.zip.Adler32;

10. 

11.public 

class 

DexShellTool 

12. 

/** 

13. 

@param 

args 

14. 

*/ 

15. 

public 

static 

void 

main(String[] 

args) 

16. 

// 

TODO 

Auto-generated 

method 

stub 

17. 

try 

18. 

File 

payloadSrcFile 

new 

File("

g:

/payload.apk"

);

19. 

unShellDexFile 

/unshell.dex"

20. 

byte[] 

payloadArray 

encrpt(readFileBytes(payloadSrcFile));

21. 

unShellDexArray 

readFileBytes(unShellDexFile);

22. 

int 

payloadLen 

payloadArray.length;

23. 

unShellDexLen 

unShellDexArray.length;

24. 

totalLen 

+4;

25. 

newdex 

byte[totalLen];

26. 

//添加解壳代码 

27. 

System.arraycopy(unShellDexArray, 

0, 

newdex, 

unShellDexLen);

28. 

//添加加密后的解壳数据 

29. 

System.arraycopy(payloadArray, 

unShellDexLen, 

30. 

payloadLen);

31. 

//添加解壳数据长度 

32. 

System.arraycopy(intToByte(payloadLen), 

totalLen-4, 

4);

33. 

//修改DEX 

file 

size文件头 

34. 

fixFileSizeHeader(newdex);

35. 

SHA1 

文件头 

36. 

fixSHA1Header(newdex);

37. 

CheckSum文件头 

38. 

fixCheckSumHeader(newdex);

39. 

40. 

41. 

String 

str 

"

/classes.dex"

;

42. 

File(str);

43. 

if 

(!

file.exists()) 

44. 

file.createNewFile();

45. 

46. 

47. 

FileOutputStream 

localFileOutputStream 

FileOutputStream(str);

48. 

localFileOutputStream.write(newdex);

49. 

localFileOutputStream.flush();

50. 

localFileOutputStream.close();

51. 

52. 

53. 

catch 

(Exception 

e) 

54. 

block 

55. 

e.printStackTrace();

56. 

57. 

58. 

59. 

//直接返回数据,读者可以添加自己加密方法 

60. 

private 

encrpt(byte[] 

srcdata){ 

61. 

return 

srcdata;

62. 

63. 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 工作总结汇报

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1