- 浏览: 2196942 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (1240)
- mac/IOS (287)
- flutter (1)
- J2EE (115)
- android基础知识 (582)
- android中级知识 (55)
- android组件(Widget)开发 (18)
- android 错误 (21)
- javascript (18)
- linux (70)
- 树莓派 (18)
- gwt/gxt (1)
- 工具(IDE)/包(jar) (18)
- web前端 (17)
- java 算法 (8)
- 其它 (5)
- chrome (7)
- 数据库 (8)
- 经济/金融 (0)
- english (2)
- HTML5 (7)
- 网络安全 (14)
- 设计欣赏/设计窗 (8)
- 汇编/C (8)
- 工具类 (4)
- 游戏 (5)
- 开发频道 (5)
- Android OpenGL (1)
- 科学 (4)
- 运维 (0)
- 好东西 (6)
- 美食 (1)
最新评论
-
liangzai_cool:
请教一下,文中,shell、C、Python三种方式控制led ...
树莓派 - MAX7219 -
jiazimo:
...
Kafka源码分析-序列5 -Producer -RecordAccumulator队列分析 -
hp321:
Windows该命令是不是需要安装什么软件才可以?我试过不行( ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
hp321:
Chenzh_758 写道其实直接用一下代码就可以解决了:JP ...
ImageIO读jpg的时候出现javax.imageio.IIOException: Unsupported Image Type -
huanghonhpeng:
大哥你真强什么都会,研究研究。。。。小弟在这里学到了很多知识。 ...
android 浏览器
伪加密的apk有那么难么?了解原理就没啥可怕的。放出java代码,python的早就有了。
---------------
------------------
代码都是从jdk7修扣出来的。
jdk6的zip api是native的,没发绕过密码检测,jdk7倒是可以覆写绕过
jdk7用java实现了zipfilesystem,这代码就是从那里面扣出来的,简单修改下判断就ok了
package com.rover12421.apkutil; 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.rover12421.apkutil.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 ((CEN***(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] ^= CEN***(cen, pos) % 2; // cen[pos+8] ^= cen[pos+8] % 2; // zerror("invalid CEN header (encrypted entry)"); } } else { if ((CEN***(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; } } }
---------------
/* * 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.rover12421.apkutil; /** * * @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 LOC*** = 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 CEN*** = 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 LOC***(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 CEN***(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; }
------------------
代码都是从jdk7修扣出来的。
jdk6的zip api是native的,没发绕过密码检测,jdk7倒是可以覆写绕过
jdk7用java实现了zipfilesystem,这代码就是从那里面扣出来的,简单修改下判断就ok了
发表评论
-
带你深入理解 FLUTTER 中的字体“冷”知识
2020-08-10 23:40 627本篇将带你深入理解 Flutter 开发过程中关于字体和文 ... -
Flutter -自定义日历组件
2020-03-01 17:56 1100颜色文件和屏幕适配的文件 可以自己给定 import ... -
Dart高级(一)——泛型与Json To Bean
2020-02-23 19:13 993从 Flutter 发布到现在, 越来越多人开始尝试使用 Da ... -
flutter loading、Progress进度条
2020-02-21 17:03 1168Flutter Progress 1 条形无固定值进度条 ... -
Flutter使用Https加载图片
2020-02-21 01:39 1004Flutter使用Https加载图片 使用http加载图片出 ... -
flutter shared_preferences 异步变同步
2020-02-21 00:55 839前言 引用 在开发原生iOS或Native应用时,一般有判断上 ... -
Flutter TextField边框颜色
2020-02-19 21:31 929监听要销毁 myController.dispose(); T ... -
flutter Future的正确用法
2020-02-18 21:55 800在flutter中经常会用到异步任务,dart中异步任务异步处 ... -
记一次Flutter简单粗暴处理HTTPS证书检验方法
2020-02-18 14:13 949最近在做Flutter项目到了遇到一个无解的事情,当使用Ima ... -
flutter 获取屏幕宽度高度 通知栏高度等屏幕信息
2019-07-27 08:39 1327##MediaQuery MediaQuery.of(con ... -
关于flutter RefreshIndicator扩展listview下拉刷新的问题
2019-07-10 19:40 1115当条目过少时listview某些嵌套情况下可能不会滚动(条目 ... -
flutter listview 改变状态的时候一直无限添加
2019-07-10 16:01 778setstate的时候会一直无限的调用listview.bui ... -
Flutter Android端启动白屏问题的解决
2019-07-09 00:51 1507问题描述 Flutter 应用在 Android 端上启动时 ... -
Flutter中SnackBar使用
2019-07-08 23:43 767底部弹出,然后在指定时间后消失。 注意: build(Bui ... -
Flutter 之点击空白区域收起键盘
2019-07-08 18:43 1782点击空白处取消TextField焦点这个需求是非常简单的,在学 ... -
Flutter 弹窗 Dialog ,AlertDialog,IOS风格
2019-07-08 18:04 1370import 'package:flutter/mate ... -
flutter ---TextField 之 输入类型、长度限制
2019-07-08 14:30 2314TextField想要实现输入类型、长度限制需要先引入impo ... -
【flutter 溢出BUG】键盘上显示bottom overflowed by 104 PIXELS
2019-07-08 11:13 1549一开始直接使用Scaffold布局,body:new Colu ... -
解决Flutter项目卡在Initializing gradle...界面的问题
2019-07-07 12:53 865Flutter最近很火,我抽出了一点时间对Flutter进行了 ... -
关于android O 上 NotificationChannel 的一些注意事项
2019-07-04 11:47 932最近在适配android O,遇到个问题,应用中原本有设置界面 ...
相关推荐
【Android APK 文件与伪加密】 在移动应用开发领域,Android 应用程序通常以 APK(Android Package)格式分发。APK 文件本质上是 ZIP 压缩格式,包含应用程序的代码、资源、元数据等。由于 APK 文件是可读的,为了...
源码参考,欢迎下载
apk加壳和伪加密(防止反编译) 包括3个工程: 一个是加壳java工程; 一个是加壳安卓工程; 一个是apkdemo源程序; 直接运行Packers工程下面的build.xml文件后,在Packers的bin目录下查看Packers-release.apk即可...
在Android应用开发中,保护APK文件中的代码和资源安全是非常重要的一步,因为源码如果不进行加密,可能会被恶意用户逆向工程分析,导致敏感信息泄露或者应用被篡改。本话题将深入探讨如何对Android APK文件进行代码...
总之,"apk加密-java-src"是一个关于使用Java源码进行APK安全保护的技术,涉及到加密、混淆、字节码变换等多个环节,以提升APK的安全性和对抗逆向工程的能力。在实际操作中,开发者需要根据具体需求选择合适的加密...
JAVA语言,加密的可以反编译二开修改 源码说明: 系统通过对apk反编译,随机包名,随机签名,混淆代码等方式,回编译生成新的apk安装包 通过系统智能自动处理,间隔5分钟(可以自定义时间)生成一个新包,通过...
本篇文章将详细阐述如何将一个APK文件反编译为Java源码。 首先,我们需要了解APK的基本结构。APK是Android应用程序的打包格式,包含了应用的代码(.dex文件)、资源文件(如图片、布局等)以及AndroidManifest.xml...
【标题】"开心超级签系统源码 Java超级签名系统apk分发系统源码"涉及到的主要知识点是Android应用的签名机制、Java编程以及应用分发。 首先,我们需要理解Android应用的签名机制。在Android系统中,每个应用在安装...
Java混淆和加密JavaScript代码是保护Web应用程序源代码安全的重要手段,尤其是在公开发布或者与第三方共享时,能够防止恶意用户分析和篡改代码。本压缩包包含的资源专注于这个主题,让我们详细了解一下相关知识点。 ...
有时候,为了学习、分析或者调试其他开发者编写的APK,我们需要将其反编译成Java源码,以便更好地理解其工作原理。本文将深入探讨如何将APK反编译为Java源码,并介绍相关工具和技术。 首先,我们要了解APK的结构。...
通过理解这两种文件的结构以及Java的文件处理能力,你可以轻松地实现这些功能,并根据需要扩展到其他元数据的读取。希望这个指南对你有所帮助,如果你在实践中遇到问题,记得查阅相关文档或使用调试工具进行排查。
Android高级应用源码-java 对apk 文件进行伪加密,然后进行字节码变换的工具,可运行的源代码,其中的apk的目录,需要自己修改成,你的自己的目录。.zip
当开发者需要深入理解他人的应用或者进行二次开发时,可能会需要将APK反编译为Java源码和其他相关资源。这个过程涉及到多个步骤和技术,让我们详细探讨一下。 首先,APK文件本质上是ZIP格式的压缩包,包含了Dalvik...
Java源码打包分发源码是开发者们进行软件发布与管理的一种常见方式,尤其是在移动应用开发领域。这个打包免签分发平台提供了便捷的途径,让开发者能够将他们的应用程序打包并分发出去,而无需经过复杂的签名过程。...
准备一个壳DEX文件(源码位置:shellApplicationSourceCode),将原APK的DEX文件加密保存到壳DEX尾部,然后将原APK文件中的原DEX文件替换为壳DEX,并修改原APK文件里AndroidManifest.xml的applicationandroid:name字段...
本篇文章将详细介绍如何使用"Apk 反编译成Java源代码工具"来获取APK中的源码。 首先,我们需要了解反编译的基本概念。反编译是将已编译的二进制代码转换回接近原始源代码的过程。在Android世界里,APK中的代码主要...
这个过程主要包括dex文件(Dalvik字节码)到Java源码的转换,以及资源文件的解析。 1. **dex2jar**:APK中的.dex文件是Dalvik虚拟机执行的字节码,而dex2jar工具可以将.dex文件转换为Java的.class文件,这是反编译...
在这个"apk加壳源码.zip"压缩包中,我们很可能会找到实现这一技术的相关源代码。通过分析这些源代码,我们可以深入了解APK加壳的工作原理以及如何在自己的项目中应用。 首先,APK加壳的目的是为原始APK创建一个保护...
免责声明:资料部分来源于合法的互联网渠道收集和整理,部分自己学习积累成果,供大家学习参考与交流。收取的费用仅用于收集和整理资料耗费时间的酬劳。 本人尊重原创作者或出版方,资料版权归原作者或出版方所有,...
2. **Android应用开发**:使用Java或Kotlin编写APK源码,遵循Android SDK和编程规范。 3. **PHP Web开发**:构建后台管理系统,处理HTTP请求,与数据库交互,实现用户认证、内容管理等功能。 4. **MySQL/SQLite...