Android的伪加密出来了一段时间,Python的早就出了还原代码,java的在网上也可以找到的,为了更加方便大家的查阅,eoe官方破解组整理了一份资料。
现在对于一些apk,我们用rar打开后可以发现下图情况:
可以发现后面都是加密的,但是我们将此aa.apk改为aa.rar之后,发现里面还是加密,没法正常解压,这种情况就是android中的伪加密。
关于伪加密的具体分析可以百度找一找。
下面是代码部分,包括加密,解密,以及测试代码.
--------------------------------------------------------------分割线-----------------------------------------------
关键类,JDK7中拿出来的zip
------------------------------------------------------------分割线-------------------------------------------------------------
用于加密与解密的代码.
-------------------------------------------------------------------分割线---------------------------------------------------------------
测试代码:
代码已经很明显了,直接使用即可。
进行伪加密,或者将伪加密的软件进行解密都可。
附上最开始的apk解密后的插图:
现在对于一些apk,我们用rar打开后可以发现下图情况:
![](http://www.eoeandroid.com/data/attachment/forum/201309/22/132530iljjl7c9mgjolk7l.jpg)
可以发现后面都是加密的,但是我们将此aa.apk改为aa.rar之后,发现里面还是加密,没法正常解压,这种情况就是android中的伪加密。
关于伪加密的具体分析可以百度找一找。
下面是代码部分,包括加密,解密,以及测试代码.
--------------------------------------------------------------分割线-----------------------------------------------
关键类,JDK7中拿出来的zip
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
/*
* Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* - Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* - Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* - Neither the name of Oracle nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
* IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package com.ggz;
/**
*
* @author Xueming Shen
*/
class ZipConstants {
/*
* Compression methods
*/
static final int METHOD_STORED = 0;
static final int METHOD_DEFLATED = 8;
static final int METHOD_DEFLATED64 = 9;
static final int METHOD_BZIP2 = 12;
static final int METHOD_LZMA = 14;
static final int METHOD_LZ77 = 19;
static final int METHOD_AES = 99;
/*
* General purpose big flag
*/
static final int FLAG_ENCRYPTED = 0x01;
static final int FLAG_DATADESCR = 0x08; // crc, size and csize in dd
static final int FLAG_EFS = 0x800; // If this bit is set the filename and
// comment fields for this file must be
// encoded using UTF-8.
/*
* Header signatures
*/
static long LOCSIG = 0x04034b50L; // "PK\003\004"
static long EXTSIG = 0x08074b50L; // "PK\007\008"
static long CENSIG = 0x02014b50L; // "PK\001\002"
static long ENDSIG = 0x06054b50L; // "PK\005\006"
/*
* Header sizes in bytes (including signatures)
*/
static final int LOCHDR = 30; // LOC header size
static final int EXTHDR = 16; // EXT header size
static final int CENHDR = 46; // CEN header size
static final int ENDHDR = 22; // END header size
/*
* Local file (LOC) header field offsets
*/
static final int LOCVER = 4; // version needed to extract
static final int LOCFLG = 6; // general purpose bit flag
static final int LOCHOW = 8; // compression method
static final int LOCTIM = 10; // modification time
static final int LOCCRC = 14; // uncompressed file crc-32 value
static final int LOCSIZ = 18; // compressed size
static final int LOCLEN = 22; // uncompressed size
static final int LOCNAM = 26; // filename length
static final int LOCEXT = 28; // extra field length
/*
* Extra local (EXT) header field offsets
*/
static final int EXTCRC = 4; // uncompressed file crc-32 value
static final int EXTSIZ = 8; // compressed size
static final int EXTLEN = 12; // uncompressed size
/*
* Central directory (CEN) header field offsets
*/
static final int CENVEM = 4; // version made by
static final int CENVER = 6; // version needed to extract
static final int CENFLG = 8; // encrypt, decrypt flags
static final int CENHOW = 10; // compression method
static final int CENTIM = 12; // modification time
static final int CENCRC = 16; // uncompressed file crc-32 value
static final int CENSIZ = 20; // compressed size
static final int CENLEN = 24; // uncompressed size
static final int CENNAM = 28; // filename length
static final int CENEXT = 30; // extra field length
static final int CENCOM = 32; // comment length
static final int CENDSK = 34; // disk number start
static final int CENATT = 36; // internal file attributes
static final int CENATX = 38; // external file attributes
static final int CENOFF = 42; // LOC header offset
/*
* End of central directory (END) header field offsets
*/
static final int ENDSUB = 8; // number of entries on this disk
static final int ENDTOT = 10; // total number of entries
static final int ENDSIZ = 12; // central directory size in bytes
static final int ENDOFF = 16; // offset of first CEN header
static final int ENDCOM = 20; // zip file comment length
/*
* ZIP64 constants
*/
static final long ZIP64_ENDSIG = 0x06064b50L; // "PK\006\006"
static final long ZIP64_LOCSIG = 0x07064b50L; // "PK\006\007"
static final int ZIP64_ENDHDR = 56; // ZIP64 end header size
static final int ZIP64_LOCHDR = 20; // ZIP64 end loc header size
static final int ZIP64_EXTHDR = 24; // EXT header size
static final int ZIP64_EXTID = 0x0001; // Extra field Zip64 header ID
static final int ZIP64_MINVAL32 = 0xFFFF;
static final long ZIP64_MINVAL = 0xFFFFFFFFL;
/*
* Zip64 End of central directory (END) header field offsets
*/
static final int ZIP64_ENDLEN = 4; // size of zip64 end of central dir
static final int ZIP64_ENDVEM = 12; // version made by
static final int ZIP64_ENDVER = 14; // version needed to extract
static final int ZIP64_ENDNMD = 16; // number of this disk
static final int ZIP64_ENDDSK = 20; // disk number of start
static final int ZIP64_ENDTOD = 24; // total number of entries on this disk
static final int ZIP64_ENDTOT = 32; // total number of entries
static final int ZIP64_ENDSIZ = 40; // central directory size in bytes
static final int ZIP64_ENDOFF = 48; // offset of first CEN header
static final int ZIP64_ENDEXT = 56; // zip64 extensible data sector
/*
* Zip64 End of central directory locator field offsets
*/
static final int ZIP64_LOCDSK = 4; // disk number start
static final int ZIP64_LOCOFF = 8; // offset of zip64 end
static final int ZIP64_LOCTOT = 16; // total number of disks
/*
* Zip64 Extra local (EXT) header field offsets
*/
static final int ZIP64_EXTCRC = 4; // uncompressed file crc-32 value
static final int ZIP64_EXTSIZ = 8; // compressed size, 8-byte
static final int ZIP64_EXTLEN = 16; // uncompressed size, 8-byte
/*
* Extra field header ID
*/
static final int EXTID_ZIP64 = 0x0001; // ZIP64
static final int EXTID_NTFS = 0x000a; // NTFS
static final int EXTID_UNIX = 0x000d; // UNIX
static final int EXTID_EFS = 0x0017; // Strong Encryption
static final int EXTID_EXTT = 0x5455; // Info-ZIP Extended Timestamp
/*
* fields access methods
*/
///
static final int CH(byte[] b, int n) {
return b[n] & 0xff;
}
static final int SH(byte[] b, int n) {
return (b[n] & 0xff) | ((b[n + 1] & 0xff) << 8);
}
static final long LG(byte[] b, int n) {
return ((SH(b, n)) | (SH(b, n + 2) << 16)) & 0xffffffffL;
}
static final long LL(byte[] b, int n) {
return (LG(b, n)) | (LG(b, n + 4) << 32);
}
static final long GETSIG(byte[] b) {
return LG(b, 0);
}
// local file (LOC) header fields
static final long LOCSIG(byte[] b) { return LG(b, 0); } // signature
static final int LOCVER(byte[] b) { return SH(b, 4); } // version needed to extract
static final int LOCFLG(byte[] b) { return SH(b, 6); } // general purpose bit flags
static final int LOCHOW(byte[] b) { return SH(b, 8); } // compression method
static final long LOCTIM(byte[] b) { return LG(b, 10);} // modification time
static final long LOCCRC(byte[] b) { return LG(b, 14);} // crc of uncompressed data
static final long LOCSIZ(byte[] b) { return LG(b, 18);} // compressed data size
static final long LOCLEN(byte[] b) { return LG(b, 22);} // uncompressed data size
static final int LOCNAM(byte[] b) { return SH(b, 26);} // filename length
static final int LOCEXT(byte[] b) { return SH(b, 28);} // extra field length
// extra local (EXT) header fields
static final long EXTCRC(byte[] b) { return LG(b, 4);} // crc of uncompressed data
static final long EXTSIZ(byte[] b) { return LG(b, 8);} // compressed size
static final long EXTLEN(byte[] b) { return LG(b, 12);} // uncompressed size
// end of central directory header (END) fields
static final int ENDSUB(byte[] b) { return SH(b, 8); } // number of entries on this disk
static final int ENDTOT(byte[] b) { return SH(b, 10);} // total number of entries
static final long ENDSIZ(byte[] b) { return LG(b, 12);} // central directory size
static final long ENDOFF(byte[] b) { return LG(b, 16);} // central directory offset
static final int ENDCOM(byte[] b) { return SH(b, 20);} // size of zip file comment
static final int ENDCOM(byte[] b, int off) { return SH(b, off + 20);}
// zip64 end of central directory recoder fields
static final long ZIP64_ENDTOD(byte[] b) { return LL(b, 24);} // total number of entries on disk
static final long ZIP64_ENDTOT(byte[] b) { return LL(b, 32);} // total number of entries
static final long ZIP64_ENDSIZ(byte[] b) { return LL(b, 40);} // central directory size
static final long ZIP64_ENDOFF(byte[] b) { return LL(b, 48);} // central directory offset
static final long ZIP64_LOCOFF(byte[] b) { return LL(b, 8);} // zip64 end offset
// central directory header (CEN) fields
static final long CENSIG(byte[] b, int pos) { return LG(b, pos + 0); }
static final int CENVEM(byte[] b, int pos) { return SH(b, pos + 4); }
static final int CENVER(byte[] b, int pos) { return SH(b, pos + 6); }
static final int CENFLG(byte[] b, int pos) { return SH(b, pos + 8); }
static final int CENHOW(byte[] b, int pos) { return SH(b, pos + 10);}
static final long CENTIM(byte[] b, int pos) { return LG(b, pos + 12);}
static final long CENCRC(byte[] b, int pos) { return LG(b, pos + 16);}
static final long CENSIZ(byte[] b, int pos) { return LG(b, pos + 20);}
static final long CENLEN(byte[] b, int pos) { return LG(b, pos + 24);}
static final int CENNAM(byte[] b, int pos) { return SH(b, pos + 28);}
static final int CENEXT(byte[] b, int pos) { return SH(b, pos + 30);}
static final int CENCOM(byte[] b, int pos) { return SH(b, pos + 32);}
static final int CENDSK(byte[] b, int pos) { return SH(b, pos + 34);}
static final int CENATT(byte[] b, int pos) { return SH(b, pos + 36);}
static final long CENATX(byte[] b, int pos) { return LG(b, pos + 38);}
static final long CENOFF(byte[] b, int pos) { return LG(b, pos + 42);}
/* The END header is followed by a variable length comment of size < 64k. */
static
final
long
END_MAXLEN =
0xFFFF
+ ENDHDR;
static
final
int
READBLOCKSZ =
128
;
}
|
------------------------------------------------------------分割线-------------------------------------------------------------
用于加密与解密的代码.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
|
package
com.ggz;
import
java.io.File;
import
java.io.FileInputStream;
import
java.io.FileOutputStream;
import
java.io.IOException;
import
java.nio.ByteBuffer;
import
java.nio.channels.FileChannel;
import
java.util.Arrays;
import
java.util.zip.ZipError;
import
static
com.ggz.ZipConstants.*;
public
class
ApkUtilTool {
private
FileChannel ch;
// channel to the zipfile
private
FileChannel fc;
/**
* 修复zip伪加密状态的Entry
* @param inZip
* @param storeZip
* @throws IOException
*/
public
void
FixEncryptedEntry(File inZip, File fixZip)
throws
IOException {
changEntry(inZip, fixZip,
true
);
}
/**
* 修复zip伪加密状态的Entry
* @param inZip
* @param storeZip
* @throws IOException
*/
public
void
FixEncryptedEntry(String inZip, String fixZip)
throws
IOException {
FixEncryptedEntry(
new
File(inZip),
new
File(fixZip));
}
/**
* 修改zip的Entry为伪加密状态
* @param inZip
* @param storeZip
* @throws IOException
*/
public
void
ChangToEncryptedEntry(File inZip, File storeZip)
throws
IOException {
changEntry(inZip, storeZip,
false
);
}
/**
* 修改zip的Entry为伪加密状态
* @param inZip
* @param storeZip
* @throws IOException
*/
public
void
ChangToEncryptedEntry(String inZip, String storeZip)
throws
IOException {
ChangToEncryptedEntry(
new
File(inZip),
new
File(storeZip));
}
/**
* 更改zip的Entry为伪加密状态
* @param inZip
* @param storeZip
* @param fix ture:修复伪加密 false:更改到伪加密
* @throws IOException
*/
private
void
changEntry(File inZip, File storeZip,
boolean
fix)
throws
IOException {
FileInputStream fis =
new
FileInputStream(inZip);
FileOutputStream fos =
new
FileOutputStream(storeZip);
byte
[] buf =
new
byte
[
10240
];
int
len;
while
((len = fis.read(buf)) != -
1
) {
fos.write(buf,
0
, len);
}
ch = fis.getChannel();
fc = fos.getChannel();
changEntry(fix);
ch.close();
fc.close();
fis.close();
fos.close();
}
// Reads zip file central directory. Returns the file position of first
// CEN header, otherwise returns -1 if an error occured. If zip->msg != NULL
// then the error was a zip format error and zip->msg has the error text.
// Always pass in -1 for knownTotal; it's used for a recursive call.
private
void
changEntry(
boolean
fix)
throws
IOException {
END end = findEND();
if
(end.cenlen > end.endpos)
zerror(
"invalid END header (bad central directory size)"
);
long
cenpos = end.endpos - end.cenlen;
// position of CEN table
// Get position of first local file (LOC) header, taking into
// account that there may be a stub prefixed to the zip file.
long
locpos = cenpos - end.cenoff;
if
(locpos <
0
)
zerror(
"invalid END header (bad central directory offset)"
);
// read in the CEN and END
byte
[] cen =
new
byte
[(
int
)(end.cenlen + ENDHDR)];
if
(readFullyAt(cen,
0
, cen.length, cenpos) != end.cenlen + ENDHDR) {
zerror(
"read CEN tables failed"
);
}
int
pos =
0
;
int
limit = cen.length - ENDHDR;
while
(pos < limit) {
if
(CENSIG(cen, pos) != CENSIG)
zerror(
"invalid CEN header (bad signature)"
);
int
method = CENHOW(cen, pos);
int
nlen = CENNAM(cen, pos);
int
elen = CENEXT(cen, pos);
int
clen = CENCOM(cen, pos);
if
(fix) {
if
((CENFLG(cen, pos) &
1
) !=
0
) {
byte
[] name = Arrays.copyOfRange(cen, pos + CENHDR, pos + CENHDR + nlen);
System.out.println(
"Found the encrypted entry : "
+
new
String(name) +
", fix..."
);
//b[n] & 0xff) | ((b[n + 1] & 0xff) << 8
cen[pos+
8
] &=
0xFE
;
// cen[pos+8] ^= CENFLG(cen, pos) % 2;
// cen[pos+8] ^= cen[pos+8] % 2;
// zerror("invalid CEN header (encrypted entry)");
}
}
else
{
if
((CENFLG(cen, pos) &
1
) ==
0
) {
byte
[] name = Arrays.copyOfRange(cen, pos + CENHDR, pos + CENHDR + nlen);
System.out.println(
"Chang the entry : "
+
new
String(name) +
", Encrypted..."
);
//b[n] & 0xff) | ((b[n + 1] & 0xff) << 8
cen[pos+
8
] |=
0x1
;
// zerror("invalid CEN header (encrypted entry)");
}
}
if
(method != METHOD_STORED && method != METHOD_DEFLATED)
zerror(
"invalid CEN header (unsupported compression method: "
+ method +
")"
);
if
(pos + CENHDR + nlen > limit)
zerror(
"invalid CEN header (bad header size)"
);
// skip ext and comment
pos += (CENHDR + nlen + elen + clen);
}
writeFullyAt(cen,
0
, cen.length, cenpos);
if
(pos + ENDHDR != cen.length) {
zerror(
"invalid CEN header (bad header size)"
);
}
}
// Reads len bytes of data from the specified offset into buf.
// Returns the total number of bytes read.
// Each/every byte read from here (except the cen, which is mapped).
final
long
readFullyAt(
byte
[] buf,
int
off,
long
len,
long
pos)
throws
IOException
{
ByteBuffer bb = ByteBuffer.wrap(buf);
bb.position(off);
bb.limit((
int
)(off + len));
return
readFullyAt(bb, pos);
}
private
final
long
readFullyAt(ByteBuffer bb,
long
pos)
throws
IOException
{
synchronized
(ch) {
return
ch.position(pos).read(bb);
}
}
final
long
writeFullyAt(
byte
[] buf,
int
off,
long
len,
long
pos)
throws
IOException
{
ByteBuffer bb = ByteBuffer.wrap(buf);
bb.position(off);
bb.limit((
int
)(off + len));
return
writeFullyAt(bb, pos);
}
private
final
long
writeFullyAt(ByteBuffer bb,
long
pos)
throws
IOException
{
synchronized
(fc) {
return
fc.position(pos).write(bb);
}
}
// Searches for end of central directory (END) header. The contents of
// the END header will be read and placed in endbuf. Returns the file
// position of the END header, otherwise returns -1 if the END header
// was not found or an error occurred.
private
END findEND()
throws
IOException
{
byte
[] buf =
new
byte
[READBLOCKSZ];
long
ziplen = ch.size();
long
minHDR = (ziplen - END_MAXLEN) >
0
? ziplen - END_MAXLEN :
0
;
long
minPos = minHDR - (buf.length - ENDHDR);
for
(
long
pos = ziplen - buf.length; pos >= minPos; pos -= (buf.length - ENDHDR))
{
int
off =
0
;
if
(pos <
0
) {
// Pretend there are some NUL bytes before start of file
off = (
int
)-pos;
Arrays.fill(buf,
0
, off, (
byte
)
0
);
}
int
len = buf.length - off;
if
(readFullyAt(buf, off, len, pos + off) != len)
zerror(
"zip END header not found"
);
// Now scan the block backwards for END header signature
for
(
int
i = buf.length - ENDHDR; i >=
0
; i--) {
if
(buf[i+
0
] == (
byte
)
'P'
&&
buf[i+
1
] == (
byte
)
'K'
&&
buf[i+
2
] == (
byte
)
'\005'
&&
buf[i+
3
] == (
byte
)
'\006'
&&
(pos + i + ENDHDR + ENDCOM(buf, i) == ziplen)) {
// Found END header
buf = Arrays.copyOfRange(buf, i, i + ENDHDR);
END end =
new
END();
end.endsub = ENDSUB(buf);
end.centot = ENDTOT(buf);
end.cenlen = ENDSIZ(buf);
end.cenoff = ENDOFF(buf);
end.comlen = ENDCOM(buf);
end.endpos = pos + i;
if
(end.cenlen == ZIP64_MINVAL ||
end.cenoff == ZIP64_MINVAL ||
end.centot == ZIP64_MINVAL32)
{
// need to find the zip64 end;
byte
[] loc64 =
new
byte
[ZIP64_LOCHDR];
if
(readFullyAt(loc64,
0
, loc64.length, end.endpos - ZIP64_LOCHDR)
!= loc64.length) {
return
end;
}
long
end64pos = ZIP64_LOCOFF(loc64);
byte
[] end64buf =
new
byte
[ZIP64_ENDHDR];
if
(readFullyAt(end64buf,
0
, end64buf.length, end64pos)
!= end64buf.length) {
return
end;
}
// end64 found, re-calcualte everything.
end.cenlen = ZIP64_ENDSIZ(end64buf);
end.cenoff = ZIP64_ENDOFF(end64buf);
end.centot = (
int
)ZIP64_ENDTOT(end64buf);
// assume total < 2g
end.endpos = end64pos;
}
return
end;
}
}
}
zerror(
"zip END header not found"
);
return
null
;
//make compiler happy
}
static
void
zerror(String msg) {
throw
new
ZipError(msg);
}
// End of central directory record
static
class
END {
int
disknum;
int
sdisknum;
int
endsub;
// endsub
int
centot;
// 4 bytes
long
cenlen;
// 4 bytes
long
cenoff;
// 4 bytes
int
comlen;
// comment length
byte
[] comment;
/* members of Zip64 end of central directory locator */
int
diskNum;
long
endpos;
int
disktot;
@Override
public
String toString() {
return
"disknum : "
+ disknum +
"\n"
+
"sdisknum : "
+ sdisknum +
"\n"
+
"endsub : "
+ endsub +
"\n"
+
"centot : "
+ centot +
"\n"
+
"cenlen : "
+ cenlen +
"\n"
+
"cenoff : "
+ cenoff +
"\n"
+
"comlen : "
+ comlen +
"\n"
+
"diskNum : "
+ diskNum +
"\n"
+
"endpos : "
+ endpos +
"\n"
+
"disktot : "
+ disktot;
}
}
}
|
-------------------------------------------------------------------分割线---------------------------------------------------------------
测试代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
package
com.ggz;
import
java.io.IOException;
public
class
TestApkUtil {
public
static
void
main(String[] args) {
String file =
"C:/Users/Gui/Desktop/ab/aa.apk"
;
String fix =
"C:/Users/Gui/Desktop/ab/zz.apk"
;
// String fix2 = "C:/Users/Zhou/Desktop/tesa/bb.apk";
try
{
ApkUtilTool apkUtilTool =
new
ApkUtilTool();
// apkUtilTool.FixEncryptedEntry(file, fix);
//进行加密
apkUtilTool.ChangToEncryptedEntry(file, fix);
//进行解密
// apkUtilTool.FixEncryptedEntry(fix, fix2);
}
catch
(IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
|
代码已经很明显了,直接使用即可。
进行伪加密,或者将伪加密的软件进行解密都可。
附上最开始的apk解密后的插图:
![](http://www.eoeandroid.com/data/attachment/forum/201309/22/132556s7fpumv0o2y7f9od.jpg)