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

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(使用前将#替换为@)

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

  • Flutter 中的 AndroidManifest 中缺少默认通知通道元数据

    我在用firebase messaging 5 0 1软件包来实现推送通知 在 IOS 中一切正常 而在 Android 中 当我的移动应用程序在后台运行时 我收到通知 但它没有导航到相应的屏幕 它只是打开默认屏幕 如何实现到该特定屏幕的导
  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • Android:我可以创建一个不是矩形的视图/画布吗?圆形的?

    我有一个圆形视图 悬停在主要内容上方 gt 从屏幕出来的 z 轴方向 当有人点击屏幕时 我希望选择主要内容或悬停在上方的视图 当它覆盖主视图时 到目前为止效果很好 我在透明画布上有一个圆形物品 这意味着您可以看到该圆圈之外的背景的所有内容
  • 当不支持 Google Play 应用内结算 V.3 时

    在 Google Play 的应用内结算 V 3 中 有一个选项可以检查用户设备是否支持它 使用是否支持计费 http developer android com google play billing versions html meth
  • 如何向开发人员发送崩溃报告?

    我开发 Android 应用程序 但在某些情况下我的应用程序force close 如果出现以下情况 我如何向开发人员发送包含详细信息的电子邮件force close随时发生 The ACRA https github com ACRA a
  • Android中如何检测WIFI连接何时建立?

    我需要检测何时通过 WIFI 建立网络连接 发送什么广播来确定已建立有效的网络连接 我需要验证是否存在有效的 HTTP 网络连接 我应该监听什么以及需要进行哪些额外测试才能知道是否存在有效连接 您可以注册一个BroadcastReceive
  • 我想从 android 中服务器的视频 url 创建缩略图

    My code public static Bitmap retriveVideoFrameFromVideo String videoPath throws Throwable Bitmap bitmap null MediaMetada
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • 如何制作在手机和平​​板电脑上使用的响应式Android应用程序?

    我创建了一个 Android 应用程序 当我运行我的应用程序时Mobile Phone它工作得很好 但是当我跑进去时Tablet应用程序的布局已更改 那么 如何制作响应式Android应用程序用于Mobile并且也在Tablet 在Andr
  • 有多少种方法可以将位图转换为字符串,反之亦然?

    在我的应用程序中 我想以字符串的形式将位图图像发送到服务器 我想知道有多少种方法可以将位图转换为字符串 现在我使用 Base64 格式进行编码和解码 它需要更多的内存 是否有其他可能性以不同的方式做同样的事情 从而消耗更少的内存 现在我正在
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • Glass 语音命令给定列表中最接近的匹配项

    使用 Glass 您可以通过 确定 Glass 菜单启动应用程序 它似乎会选择最接近的匹配项 除非命令相距数英里 并且您可以明显看到命令列表 无论如何 是否可以从应用程序内或从语音提示 在初始应用程序触发后 给出类似的列表并返回最接近的匹配
  • 如何构建自定义摄像机应用程序?

    我正在尝试开发一个自定义摄像机录像机 当我的设备在 Activity 的 beginRecording 中执行 start MediaRecorder 方法时 应用程序崩溃 我不知道出了什么问题 因为我遵循谷歌API指南 http deve
  • 我在 PopupMenu 中使用 ShareActionProvider,但显示两个 PopupMenu?

    我在 PopupMenu 中使用 ShareActionProvider 但是当我单击共享菜单项时 它会在屏幕上显示两个 PopupMenus 一个被另一个覆盖 一个显示应用程序图标和名称 另一个仅显示应用程序名称 除了这个问题之外 它工作
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • Android Gradle 同步失败:无法解析配置“:classpath”的所有工件

    错误如下 Caused by org gradle api internal artifacts ivyservice DefaultLenientConfiguration ArtifactResolveException Could n
  • Flash 对象未显示在phonegap android 中

    我已经在 android 手机间隙创建了一个应用程序 我有一个屏幕 我想显示一个静态 flash obj 所以我在屏幕 HTML 页面中放入了以下代码
  • 我应该如何在 Android 上使用 Retrofit 处理“无互联网连接”

    我想处理没有互联网连接的情况 通常我会运行 ConnectivityManager cm ConnectivityManager context getSystemService Context CONNECTIVITY SERVICE N

随机推荐

  • 在 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