迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试
迷你播放器--第一阶段(7)
安全攻防第一战--对抗反编译,代码混淆和对抗动态调试;
本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article/details/38349741
查看项目源代码请前往:迷你播放器-综述
1、对抗反编译
#使用windows保留名或超长文件名以增加破解难度。
-classobfuscationdictionary ./dictionaries/windows.txt
-packageobfuscationdictionary ./dictionaries/windows.txt
对抗的另一种方法是使用花指令,这一点我研究的不是很深入。花指令来源于汇编,指的是程序中的无用代码,程序对它没影响,少了它也能正常运行,没有改变特征码的位置,但是他改变了程序执行顺序,有的也能改变文件结构。其实反编译工具是很笨的,花指令在跳转的时候可以跳转到一些不存在的地方是的反编译工具崩溃,让破解者无法清楚正确地反汇编程序的内容,迷失方向。jd-gui的bug其实挺多的,很多特殊代码块或者字段集也会让其崩溃无法反编译出源码。。。,例如在每个类添加如下代码可使得jd-gui崩溃,不过别高兴,最新版已经修复好该bug了
private static final char[] wJ = "0123456789abcdef".toCharArray();public static String imsi = "204046330839890";public static String p = "0";public static String keyword = "电话";public static String tranlateKeyword = "%E7%94%B5%E8%AF%9D";
2、对抗静态编译
反编译工具的漏洞是会修复好的,其实这也是编译于反编译一直对抗的结果。我们不能指望反编译工具永远无法反编译你的apk包,那么怎么办呢,一个初级的保护方法是在java层使用代码混淆技术。
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
-optimizationpasses 5-dontusemixedcaseclassnames-dontskipnonpubliclibraryclasses-dontpreverify-ignorewarnings #这1句是屏蔽警告,脚本中把这行注释去掉-verbose-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*-libraryjars libs/mmbilling.jar #这1句是导入第三方的类库mmbilling.jar,防止混淆时候读取包内容出错,脚本中把这行注释去掉-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class com.android.vending.licensing.ILicensingService-keep classeswithmembernames class * {native <methods>;}-keep classeswithmembernames class * {public <init>(android.content.Context, android.util.AttributeSet);}-keep classeswithmembernames class * {public <init>(android.content.Context, android.util.AttributeSet, int);}-keep classmembers enum * {public static **[] values();public static ** valueOf(java.lang.String);}-keep class * implements android.os.Parcelable {public static final android.os.Parcelable$Creator *;}#这4句是不混淆第三方包中的指定内容,脚本中把这行注释去掉,具体处理。-keep class com.ccit.** {*; } -keep class ccit.** { *; }-keep class com.aspire.**-keep class mm.vending.**#不要混淆,防止发生错误android-support-v4而发生混淆错误,导致无法打包。-libraryjars libs/android-support-v4.jar #这里根据你的jar包的路径做改动-dontwarn android.support.v4.**-keep class android.support.v4.** { *; }-keep interface android.support.v4.app.** { *; }-keep public class * extends android.support.v4.**-keep public class * extends android.app.Fragment#不混淆webview中对javascript接口,具体处理-keep public class com.igrs.dlna.activity.webviewActivity.JavaScriptInterface-keep classmembers class com.igrs.dlna.activity.webviewActivity.JavaScriptInterface{void showSource(java.lang.String,java.lang.String);}-keep classmembers class com.igrs.dlna.activity.webviewActivity$InJavaScriptLocalObj {public void showSource(java.lang.String,java.lang.String);public void showTitle(java.lang.String);}#使用windows保留名或超长文件名以增加破解难度。-classobfuscationdictionary ./dictionaries/windows.txt-packageobfuscationdictionary ./dictionaries/windows.txt
-target 1.6 #指定版本号-forceprocessing #强制执行,即使过期-allowaccessmodification #指定,当执行修改方法或属性的modifer范围-printmapping #指定混淆后,类或方法生成的map,后跟指定的路径及文件名 *.map-overloadaggressively-repackageclasses #把执行后的类重新放在某一个目录下,后跟一个目录名-dontpreverify #不用预先检查-verbose #不用输出详细的过程-dontwarn #不用输出警告-dontnote #不用输出通知
if ((getApplicationInfo().flags &= ApplicationInfo.FLAG_DEBUGGABLE) != 0) {System.out.println("程序被改为可调试状态");android.os.Process.killProcess(android.os.Process.myPid());}
if (android.os.Debug.isDebuggerConnected()) {System.out.println("程序被改为可调试状态");android.os.Process.killProcess(android.os.Process.myPid());}
boolean isRunningInEmualtor() {boolean qemuKernel = false;Process process = null;DataOutputStream os = null;try{ process = Runtime.getRuntime().exec("getprop ro.kernel.qemu"); os = new DataOutputStream(process.getOutputStream());BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream(),"GBK"));os.writeBytes("exit\n"); os.flush();process.waitFor();// getprop ro.kernel.qemu == 1 在模拟器// getprop ro.product.model == "sdk" 在模拟器// getprop ro.build.tags == "test-keys" 在模拟器qemuKernel = (Integer.valueOf(in.readLine()) == 1);Log.d("com.droider.checkqemu", "检测到模拟器:" + qemuKernel); } catch (Exception e){ qemuKernel = false;Log.d("com.droider.checkqemu", "run failed" + e.getMessage()); } finally {try{ if (os != null) { os.close(); } process.destroy(); } catch (Exception e) {} Log.d("com.droider.checkqemu", "run finally"); }return qemuKernel;}
迷你播放器--第一阶段(7)--安全攻防第一战--对抗反编译,代码混淆和对抗动态调试相关推荐
- 迷你播放器--第一阶段(6)--添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配
迷你播放器--第一阶段(6) 添加搜索定位功能(进阶)-使用filter过滤以及对汉语拼音的排序匹配; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs030 ...
- 迷你播放器--第一阶段(3)--MediaPlayer的封装
迷你播放器--第一阶段(3) MediaPlayer的封装--利用intent实现消息传递 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/arti ...
- 迷你播放器--第一阶段(1)--检索媒体音乐并添加到List播放列表
迷你播放器--第一阶段(1) 检索音乐并添加到List播放列表--媒体库的检索以及list列表使用 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/ ...
- 迷你播放器--第一阶段(5)--添加搜索功能--autoCompleteBox的使用
迷你播放器--第一阶段(5) 添加搜索功能--autoCompleteBox的使用; 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article ...
- 迷你播放器--第一阶段(2)--退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果
迷你播放器--第一阶段(2) 退出时自动最小化(不是关闭),增加当前播放曲目的跑马灯效果 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/artic ...
- 迷你播放器--第一阶段(4)--内存卡检索不到音乐的错误处理--程序内部空间管理
迷你播放器--第一阶段(4) 内存卡检索不到音乐的错误处理--程序内部空间管理 本文章为CSDN作者原创,转载请保留出处:http://blog.csdn.net/lrs0304/article/de ...
- 做一个迷你播放器放在桌面
效果如图 功能 随意选取歌曲,循环播放,有音谱效果,音量控制,显示歌曲名,歌曲控制(播放与暂停.下一首和上一首) 操作 将下面文件下载解压后放在MP3音乐文件夹内(该文件用FLASHPACKER打包) ...
- (十八)用JAVA编写MP3解码器——迷你播放器
2019独角兽企业重金招聘Python工程师标准>>> 1.定义解码一帧的接口 ILayer123 Layer1.Layer2和Layer3这三个类都实现了ILayer123的d ...
- 在线播放器 在网页中插入MediaPlayer 兼容IE和FF的代码调试
<!– 在线播放器 在网页中插入MediaPlayer 兼容IE和FF的代码调试 Internet Explorer 和 Netscape 都支持 <embed> 元素,但它不是标准 ...
最新文章
- 用Leangoo Scrum看板工具管理OKR-目标管理
- python elementtree 父节点_python-访问ElementTree节点父节点
- Java培训总结:过滤器链的实现方法、配置和案例分析
- Codeforces Round #552 (Div. 3) —— A. Restoring Three Numbers
- input的表单验证(不断更新中~~)
- 分布式搜索ElasticSearch单机与服务器环境搭建
- C#与VB.NET代码互相转换在线工具
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---4
- Gartner发布云产品评估报告:阿里云计算能力全球第一
- scala入门-07特质类(trait)的使用
- 有关php链接MySql数据库的总结
- android sqlite 保存图片,android-如何将图像在Sqlite数据库中另存为blob?
- java邮件服务器搭建_邮件服务器+javamail(仅包括发送)搭建
- PS批量制作获奖证书并导出PNG
- CSDN首页 云计算 孙玄:解析58同城典型技术架构及演变
- 前端数据可视化之使用 canvas、svg、zrender画图
- android 系统默认字体大小,Android系统默认字体大小
- mediasoup数据转发 源码剖析
- vue-cli实现多页面多路由
- 我们是怎么看中国企业服务的​