防止/使修补二进制程序集变得困难

2024-01-27

我不确定术语是否正确,您可以使用哪些代码实践来使某人难以修改二进制文件/程序集以绕过检查:

例如在源代码中。

bool verificationResult = verify();
if (verificationResult){
 allow_Something();
}else{
 prevent_Something();
} 

如果查看上述代码的反汇编版本的人可以修改“jump opcodes(?)”以运行allow_Something,即使验证结果为假。

这里涵盖了类似的内容http://www.codeproject.com/Articles/18961/Tamper-Aware-and-Self-Healing-Code#pre0 http://www.codeproject.com/Articles/18961/Tamper-Aware-and-Self-Healing-Code#pre0

请注意,我正在使用 C++ 创建二进制文件,以便通过 Android 上的 NDK 使用它。


就目前为止的普遍共识而言,不可能阻止任何一心想要“破解”您的 APK 的人这样做。混淆技术只会增加一次“破解”APK 所需的复杂性。当它被上传到无数提供免费托管 APK 的网站后,即使是“最菜鸟”的 Android 菜鸟也只需通过 google 搜索即可。

Also 通过默默无闻实现安全 http://en.wikipedia.org/wiki/Security_through_obscurity will 不会让你走得太远 https://stackoverflow.com/questions/533965/why-is-security-through-obscurity-a-bad-idea.

关于保护您的 APK 免遭黑客攻击,我建议您阅读以下文章,其中讨论了当前的状态Android 上 APK 的许可证验证 http://www.digipom.com/how-the-android-license-verification-library-is-lulling-you-into-a-false-sense-of-security/。其中描述的技术应该让您了解需要防范的常见攻击媒介。

Proguard http://developer.android.com/tools/help/proguard.html是一个很好的起点混淆你的APK http://android-developers.blogspot.tw/2010/09/proguard-android-and-licensing-server.html.

当你成功获得混淆后的APK后,请通过以下工具运行它并观察反编译的源代码。所有这些都是非常流行的免费开源工具,并且肯定是任何像样的“破解者”首先尝试的:
1. baksmali https://code.google.com/p/smali/
2. apktool https://code.google.com/p/android-apktool/
3. Dex2Jar http://code.google.com/p/dex2jar/ + JD-Gui http://java.decompiler.free.fr/?q=jdgui

不断向代码中添加混淆层,直到您确信上述工具的输出相当复杂而无法理解为止。 (再次强调,不要低估一个拿着可乐、披萨和DVM操作码的知识 http://source.android.com/devices/tech/dalvik/dalvik-bytecode.html可以在一个周末完成)。

关于中讨论的技术link http://www.codeproject.com/Articles/18961/Tamper-Aware-and-Self-Healing-Code你分享了,我不知道如何实施它们来保护.dex在安卓上。如果您最终在单独的中实现验证逻辑.so那么所有“破解者”需要做的就是将 java 代码中的调用修补到以下代码中的 verify() 函数:.so.


UPDATE:

额外的混淆步骤以确保.so.

1. 不要遵循或多或少的线性路径。
在整个地方添加额外的跳转是通过向“破解者”淹没如此多的潜在目标来实现的,这些潜在目标需要单独修改和修补,并验证是否已绕过保护。

2.添加时序检查这主要是为了通过使代码在调试和实际运行时遵循不同的路径来摆脱“破解者”。如果两点之间花费的时间比平常多得多,那么就清楚地表明您的程序正在调试。即是时候跳入计算世界上钢琴数量的垃圾代码部分了。

3.编写自修改代码
这再次阻碍了静态分析。例如,如果您的jump验证函数不存在于二进制文件中,但作为某些 init() 函数的一部分在各处进行了修补.so.

以下文章中通过示例描述了所有上述技术(以及更多技术)反调试技术 http://thelegendofrandom.com/blog/archives/2100.

更全面的指南是Peter Ferrie 的终极反调试参考 http://pferrie.host22.com/papers/antidebug.pdf.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止/使修补二进制程序集变得困难 的相关文章

  • 模拟器中 Google Wear 上的语音识别器没有语音输入

    我试图使用 Google Wear 网站上的自由形式语音输入 在 hello world 示例中 我刚刚添加了对 textView 的单击 它确实从语音意图中调出 立即发言 活动 但模拟器无法检测到我的麦克风发出的任何声音 我使用的是 Ma
  • Android EditText 和 addTextChangedListener

    我目前正在将数据库管理器移植到 Android 由于性能原因 我喜欢 仅更新已修改的属性 我尝试使用 addTextChangedListener 执行此操作 以便将修改后的条目添加到列表中 但我的程序从未输入其任何方法 EditText
  • Android ToggleButton 始终检查

    如果切换按钮处于选中或取消选中状态 我想存储在 SharedPreferences 中 toggle setOnCheckedChangeListener new OnCheckedChangeListener public void on
  • Android中将JSON数据存储到本地数据库

    好的 我创建了一个应用程序 它使用 JSON 从我的服务器检索数据 现在我想将检索到的数据存储在手机的本地存储 数据库中 我该怎么做 我是android编程新手 这是我从服务器收到的 JSON messages id 44 issender
  • 音频流的最佳实践

    我正在编写一个应用程序来播放远程服务器的音频 我尝试了多种方法来实现流音频 但它们对我来说都不够好 这就是我尝试过的 幼稚地使用 MediaPlayer 就像是 MediaPlayer player new MediaPlayer play
  • 使用 proguard 混淆文件名

    我正在使用 proguard 和 Android Studio 混淆我的 apk 当我反编译我的apk时 我可以看到很多文件 例如aaa java aab java ETC 但我项目中的所有文件都有原始名称 有没有办法混淆我的项目的文件名
  • 写入 Android UI Automator 输出控制台

    我正在 Android UI Automator 上编写一个小包装器 通常我们可以在控制台看到测试用例的状态 我可以访问它并添加我自己的消息吗 我努力了System out println 但这没有用 有什么办法可以做到这一点吗 您可以使用
  • Android L,使用 joda.time 库的异常

    该应用程序适用于所有设备 包括 nexus 5 和 nexus 7 在 Android L 预览版上运行相同的应用程序时 应用程序崩溃了 我一直在调试 并且调用 DateTime 构造函数发现了异常 public static String
  • 什么是 Android 测试协调器?

    谷歌最近发布了Android测试支持库1 0 读完后overview https android developers googleblog com 2017 07 android testing support library 10 is
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • AndEngine MenuScene - 无法单击按钮

    我有一个关于 android 和 andengine 的小问题 这是我的主菜单的源代码 AbstractScene is extending Scene public class MainMenuScene extends Abstract
  • 如何在同一设备上运行的 Android 应用程序之间传输文件?

    我正在编写一个与 RESTful 服务交互的 Android 应用程序 该 Web 服务本质上是一个文件系统 并提供元数据以及对文件的 CRUD 访问 我的应用程序检索元数据 并通过ContentProvider 我需要添加与我的应用程序在
  • Android 中 Activity 之间的 3D 动画

    How to create animation between two Activity look like As Screen shot in android 搜索jazzyviewpager 这是link https github co
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • Android计算两个日期之间的天数

    我编写了以下代码来查找两个日期之间的天数 startDateValue new Date startDate endDateValue new Date endDate long diff endDateValue getTime star
  • 使 Recyclerview 固定高度并可滚动

    已解决以下检查答案 所以我试图为我的 Android 应用程序创建评论功能 我想在 recyclerview 中显示评论 然后在 recyclerview 下方有一个按钮和文本视图来添加评论 我想让 recyclerview 具有一定的高度
  • 如何知道我的应用程序的活动计数?

    我的应用程序中有多项活动 请考虑以下案例 Activity A 调用 Activity B B 调用 C 当用户按后退键时 C 生成通知并转到 B 现在再次按后退 因此将显示 A 再次按后退键也会终止 A 并显示通知 现在 当用户按下通知图
  • XML 配置中的 screenName 不起作用

    我刚刚在我的应用程序中添加了对 Google Analytics 分析 的支持 但我无法
  • onPrepareOptionsMenu 复制 ActionBar 中的项目

    当我使用 onPrepareOptionsMenu 添加菜单项时 该菜单项会在操作栏中复制其自身 我正在使用片段并在主要活动的 ActionBar 中创建初始菜单 如下所示 Override public boolean onCreateO
  • 调试android数据绑定?

    谁能告诉我如何调试或找到数据绑定生成的代码 从this https www youtube com watch v NBbeQMOcnZ0链接我发现它生成了所需的代码 我猜您正在寻找自动生成的绑定 java 文件 我也在寻找他们 最后我在这

随机推荐

  • 在 Mustache (php) 中使用点表示法是不好的做法吗?

    我在 github 上发现了这张票 https github com bobthecow mustache php issues 34 issuecomment 805892 https github com bobthecow musta
  • 迭代 Data.Set 直到成功

    假设我有一个代表某些可能失败的计算的函数 f a gt Maybe b 如果我有一个清单l 我可以找到列表中的第一个 从左到右扫描时 项目f成功使用findList f l where findList是下面的函数 findList a g
  • SQL Server 脚本 2012 项目集成到 Team Foundation Server 2012 中

    我有一个包含多个 SQL 查询和存储过程的 SQL Server 脚本 2012 项目 我们使用 Team Foundation Server 2012 来管理 Visual Studio 解决方案的源代码 如何将 SQL Server S
  • 基于 Scanline 的 2D 渲染引擎如何工作?

    您能否为我提供一个参考 以帮助我了解基于扫描线的渲染引擎的工作原理 我想实现一个 2D 渲染引擎 它可以支持基于区域的剪切 基本形状绘制和抗锯齿填充以及基本变换 透视 旋转 缩放 我需要优先考虑性能而不是质量的算法 因为我想为没有 fpu
  • Rails 5.2 Active Storage 清除/删除附件

    因此 我使用 Active Storage 上传附加到集合模型的多个图像 一切正常 除非我尝试从集合中清除 删除单个附件 问题 由于某种原因 每当我加载集合的显示页面时 我的所有图像都会立即被清除 删除 当然 我只想在单击链接时删除文件 有
  • ios11如何防止录屏

    由于某些原因 我们的APP不希望人们录制屏幕 但是在ios11中 一个新功能可以让用户录制iPhone屏幕 那么是否有API或通知表明用户正在录制 十分感谢 您可以通过以下方式检测屏幕是否正在录制 UIScreen main isCaptu
  • 无法创建 F# Android 项目 - Visual Studio 2015 Xamarin 社区

    我正在按照对话选项从 Xamarin 下载页面在 Visual Studio 社区版中创建新的 F Android 空白活动 但运气不佳 C android 项目似乎工作得很好 这是 Xamarin 开源公告后不久发布的 Visual St
  • 将嵌套列表(不等长)转换为数据框[重复]

    这个问题在这里已经有答案了 我有一个嵌套列表 对于某些指数 缺少一些变量 1 sk ques pval 10 sfsf 0 05 2 sk ques pval diff 24 wwww 0 11 0 3 3 sk ques pval dif
  • Java 使用 Cassandra 的最佳 api/库是什么? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找具有以下要求的 API 它使用简单且简洁 它并不臃肿 以 Spring 的方式工作 或者至少很容易使其与 Spring 一起工作
  • WKWebView 添加为子视图在 Swift 中旋转时不会调整大小

    我正在努力向我的浏览器应用程序添加新的阅读视图 它是另一个视图控制器 仅包含作为子视图添加的 WKWebView 并带有用于关闭视图的按钮 和手势 一切都很好 但是当我旋转设备时 子视图的大小没有调整 所以我的屏幕的一半是空的 阅读视图中的
  • Shared_ptr 和 unique_ptr 有例外

    From en cppreference com http en cppreference com w cpp memory unique ptr std unique ptr 的典型用途包括 提供异常安全 处理具有动态生命周期的对象的类和
  • 为什么角度日期过滤器将 2 添加到小时?

    我使用角度 日期 过滤器在角度js中创建了一个持续时间计时器 由于某种原因 小时部分以 2 而不是 0 开头 我像这样使用过滤器 runningDuration date HH mm ss http jsfiddle net rpg2kil
  • 有没有办法通过图形浏览器API获取所有应用程序的主列表

    In Azure Active Directory 管理中心 我可以看到下面有近200个应用程序企业应用 我怎样才能通过这个微软图形资源管理器 我尝试过这个 https graph microsoft com beta applicatio
  • 如何将所有 VBScript 文件的 cscript.exe 更改为 wscript.exe 执行?

    安装新服务器后 我遇到了一个问题 我有很多 vbs 文件 都需要在 wscript 中运行 原因是 我使用所有这些命令 例如 WScript Echo hello 我希望双击时能够看到输出VBScript http en wikipedia
  • 如何复制字典并仅编辑副本

    I set dict2 dict1 当我编辑时dict2 原本的dict1也发生变化 为什么 gt gt gt dict1 key1 value1 key2 value2 gt gt gt dict2 dict1 gt gt gt dict
  • 我需要一个 hack 来制作 xslt 让我们为变量设置新值

    我读到 与编程语言不同 XSLT 不允许我们为变量设置新值 我只是想知道是否有任何技巧可以绕过人们正在使用的这个限制 因为有能力重置 a 的值variableAFAIK 本质上很有用 好吧 至少如果我们可以重置变量的值 我可以在这里解决我的
  • Flutter - 如何在 GetStorage 中存储列表?

    对于用户浏览的每一篇文章 我想保存ID信息 我正在使用 getstorage 我的代码示例如下 我也找不到真正的方法 我正在寻找保存 id 列表的最佳方法 final box GetStorage List
  • 防止隐藏字段改变

    如果我的 ChangePassword 表单包含隐藏的用户 ID 字段怎么办 BadPerson 知道 GoodPerson 的 ID 他使用 FireBug 打开 更改密码 表单 将其 Id 更改为 GoodPerson 的 Id 因此
  • 如何在Python中的函数调用之间维护列表和字典?

    我有一个功能 在里面我维护着一个值字典 我希望在不同的函数调用之间维护该字典 假设 dic 是 a a 1 b 2 c 3 第一次打电话说 我变了a a to 100 字典变成a a 100 b 2 c 3 在另一个电话中 我改变了a b
  • 防止/使修补二进制程序集变得困难

    我不确定术语是否正确 您可以使用哪些代码实践来使某人难以修改二进制文件 程序集以绕过检查 例如在源代码中 bool verificationResult verify if verificationResult allow Somethin