谓APK指的是Android操作系统的应用程序安装文件。所谓Crack,简单地理解为“破解”。我具体指的是反编译APK文件进行汇编级的代码分析,并修改或插入自己的代码,重新签名打包为APK文件,以达到改变程序原有行为的目的。

由以上的说明可知,我们要Crack一个APK文件,主要流程有三步:反编译、代码分析、重新打包签名。

基本准备


=================

我们需要一些基本的工具进行一些主要的工作。如果你是一个会做Android APK汉化的朋友,那么你应该对这些工具非常熟悉:

第一个工具是android-apktool,A tool for reengineering Android apk files 。这个工具是我们完成APK Crack的核心,利用它实现APK文件的反编译和重新打包。它是Google Code上一个非常著名的开源项目,大家可以在Google Code的网页上获取它和它的Wiki、源码及其他相关信息。网址是:http://code.google.com/p/android-apktool/

第二个工具是Auto-sign。这个工具实现的是APK打包后的签名工作,属于一个小工具。

除了这些基本工具外,为了更好的分析代码,你可能还需要用到一些其他工具,例如:dex2jar和jd-gui等,这里不做详述。

反编译

如果你是一个经常汉化APK程序的朋友,那么反编译这一步你肯定不会陌生。不过,既然这篇文章侧重于基本流程讲解,那么这一步想来是不能省掉的。所以,觉得罗嗦的朋友,请跳过。首先我们需要有一个待反编译的APK。这里我自己写了一个HelloWorld的APK,代码如下:
01.package com.zh_weir.helloworld;import android.app.Activity;

02.

03.

04.

05.import android.os.Bundle;

06.

07.

08.

09.public class MainActivity extends Activity {

10.

11.

12.

13. /** Called when the activity is first created. */

14.

15.

16.

17. @Override

18.

19.

20.

21. public void onCreate(Bundle savedInstanceState) {

22.

23.

24.

25. super.onCreate(savedInstanceState);

26.

27.

28.

29. setContentView(R.layout.main);

30.

31.

32.

33. }

34.

35.

36.

37.}
复制代码我们通过android-apktool对这个APK进行反编译。对于android-apktool的使用,我就不做太多翻译的工作,直接给出说明文档吧。简单一句话,就是命令行执行。
01.Apktool v1.3.2 - a tool for reengineering Android apk files

02.

03.

04.

05.Copyright 2010 Ryszard Wi?niewski <brut.alll@gmail.com>

06.

07.

08.

09.Apache License 2.0 (http://www.apache.org/licenses/LICENSE-2.0)

10.

11.

12.

13.Usage: apktool [-v|--verbose] COMMAND [...]

14.

15.

16.

17.COMMANDs are:

18.

19.

20.

21. d[ecode] [OPTS] <file.apk> [<dir>]

22.

23.

24.

25. Decode <file.apk> to <dir>.

26.

27.

28.

29. OPTS:

30.

31.

32.

33. -s, --no-src

34.

35.

36.

37. Do not decode sources.

38.

39.

40.

41. -r, --no-res

42.

43.

44.

45. Do not decode resources.

46.

47.

48.

49. -d, --debug

50.

51.

52.

53. Decode in debug mode. Check project page for more info.

54.

55.

56.

57. -f, --force

58.

59.

60.

61. Force delete destination directory.

62.

63.

64.

65. -t <tag>, --frame-tag <tag>

66.

67.

68.

69. Try to use framework files tagged by <tag>.

70.

71.

72.

73. --keep-broken-res

74.

75.

76.

77. Use if there was an error and some resources were dropped, e.g.:

78.

79.

80.

81. "Invalid config flags detected. Dropping resources", but you

82.

83.

84.

85. want to decode them anyway, even with errors. You will have to

86.

87.

88.

89. fix them manually before building.

90.

91.

92.

93. b[uild] [OPTS] [<app_path>] [<out_file>]

94.

95.

96.

97. Build an apk from already decoded application located in <app_path>.

98.

99.

100.

101. It will automatically detect, whether files was changed and perform.
102.

103.

104.

105. needed steps only.

106.

107.

108.

109. If you omit <app_path> then current directory will be used.

110.

111.

112.

113. If you omit <out_file> then <app_path>/dist/<name_of_original.apk>

114.

115.

116.

117. will be used.

118.

119.

120.

121. OPTS:

122.

123.

124.

125. -f, --force-all

126.

127.

128.

129. Skip changes detection and build all files.

130.

131.

132.

133. -d, --debug

134.

135.

136.

137. Build in debug mode. Check project page for more info.

138.

139.

140.

141. if|install-framework <framework.apk>

142.

143.

144.

145. Install framework file to your system.

146.

147.For additional info, see: http://code.google.com/p/android-apktool/
复制代码通过apktool d HelloWorld.apk的命令,我们就完成了一个简单的APK的反编译工作。得到了一个叫做“HelloWorld”的文件夹。你可以看见文件夹下有Manifest文件,有反编译出的res资源文件。这些东西都是平时汉化特别关心的,而不是我们要注意的重点。我们需要注意的是一个叫做“smali”的文件夹。

仔细观察,你会发现这个文件夹下的文件组织结构和我们的Android工程中java源码的组织结构几乎一致。只不过Java文件被.smali的文件取而代之了。我们用文本编辑器打开这些.smali文件,你会发现它们都是可识别的、并且非常“整齐”的文本文件,大致如下:
01..class public Lcom/zh_weir/helloworld/MainActivity;

02.

03.

04.

05..super Landroid/app

=================
06.

07.

08.

09..source "MainActivity.java"

10.

11