揭露AMR隐私 - OD 手脱带 KEY 的 ARM 程序

ARM Linux ELF加壳方案 随着移动应用和IoT设备的普及,大量的硬件抛弃了传统的x86架构,选择使用能耗低、性价比高的ARM芯片,ARM指令级渐渐成为主流,但随之而来的,是愈发严峻的安全问题。 早期的加壳产品主要利用压缩加密技术对文件进行整体性保护,但随着逆向技术的提升,整体性的文件保护方案已经被攻克,于是加壳产品引入虚拟机概念,可以实现函数级的代码控制流保护,加密的颗粒度更加细致,破解难度呈几何级增加。 压缩加密 技术原理类似桌面应用的「压缩壳」,将 SO 文件中的代码段压缩或加密,在入口函数中解密再执行。 这种保护方式可 阅读详情
 作 者: RegKiller
时 间: 2006-03-26,13:52
链 接: http://bbs.pediy.com/showthread.php?t=23174

【脱壳作者】 刹那恍惚
【作者邮箱】  RegKiller2002@yahoo.com.cn
【使用工具】 OllyDBG ,LordPE,ImportREC,PEiD v0.94
【脱壳平台】 WinXP SP2
【软件名称】 Win98 记事本
【软件大小】 568 KB
【保护选项】 Standard protection only 仅仅标准保护 + KEY 保护 (单进程)
【加壳方式】 Armadillo v4.40
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)

--------------------------------------------------------------------------------
【脱壳内容】

关于 ARM 带 KEY 的问题 N 多人问过了。再次解答一次,首先我们必须有一个可用的 KEY 否则程序是无法解码的(前辈的话,我只是站了一下他们的肩膀.嘿嘿),对于 ARM 我了解甚少,我的理解是如果你的程序无 KEY 的话就好像你有个 RAR 却没密码无法解压一样。又有人要说 RAR 可以穷举了,拜托,我加 RAR 密码从来都是中文做密码,你举出来的话可以发一份给我做纪念。呵呵。跑题了没?跑了大家记得把我叫回来。OK。我们继续,首先我们要弄个可用的 KEY,然后替换我们的机器指纹为可用 KEY 的机器指纹,注册正确之后开始脱壳基本上就跟没脱没 KEY 的 ARM 完全相同了。下面是这个程序的一个可用 KEY 是我用 ARM 在另一台机器上加壳的。


Hardware fingerprint: 5F48-DD41

Name: RegKiller

Key: 00001K-VKY502-J4WZFV-GXFK3Z-KD82T6-C0K6UK-6PCH59-WUAZP9-EX7HGD-4K9KVF-W0CRJZ

一、准备工作

侦壳:用PEiD查壳 Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks

老规矩设置Ollydbg忽略所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志。

OD 载入

Shift+F9 运行,直到程序提示:This program requires a security key. If you have one, select OK to enter it. After entering a valid key, you will not be prompted again.

按 OK 按钮让程序弹出输入 KEY 的对话框,记下你自己的 Hardware fingerprint(我这里是 Hardware fingerprint: 0073-3907 这个值一会要用) 然后回到 OD下 he GetDlgItem 断点后回到程序随便输入一个名字和 KEY 后按 OK 按钮。断下后看堆栈提示

00128088   00C244FC  /CALL 到 GetDlgItem 来自 00C244FA
0012808C   000607F0  |hWnd = 000607F0 ('Enter Key',class='#32770')
00128090   00000407  /ControlID = 407 (1031.)

ALT+F9 返回程序领空

00C244FC    85C0            TEST EAX,EAX                             ; 返回到此处
00C244FE    74 33           JE SHORT 00C24533

此时你可以找这段代码的开始处下硬件执行断点然后 Ctrl+F2 重载程序再分析。

这里我就不这么做了。删除刚才的硬件断点,向下找到这段代码

00C2467D   /0F84 B7000000   JE 00C2473A
00C24683   |53              PUSH EBX
00C24684   |B9 98FAC300     MOV ECX,0C3FA98
00C24689   |E8 253CFEFF     CALL 00C082B3                            ; 右键跟随
00C2468E   |53              PUSH EBX
00C2468F   |B9 98FAC300     MOV ECX,0C3FA98
00C24694   |8945 08         MOV DWORD PTR SS:[EBP+8],EAX
00C24697   |E8 353CFEFF     CALL 00C082D1
00C2469C   |837D 14 01      CMP DWORD PTR SS:[EBP+14],1
00C246A0   |75 27           JNZ SHORT 00C246C9
00C246A2   |8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
00C246A5   |8BC8            MOV ECX,EAX
00C246A7   |81E1 FFFF0000   AND ECX,0FFFF
00C246AD   |C1E8 10         SHR EAX,10
00C246B0   |51              PUSH ECX
00C246B1   |50              PUSH EAX
00C246B2   |8D85 00FFFFFF   LEA EAX,DWORD PTR SS:[EBP-100]
00C246B8   |68 C496C300     PUSH 0C396C4                             ; ASCII "%04X-%04X"
00C246BD   |50              PUSH EAX
00C246BE   |FF15 1063C300   CALL DWORD PTR DS:[C36310]               ; msvcrt.sprintf

ASCII "%04X-%04X" 这个是谁?小谁家那小谁嘛,呵呵。向上看.我们再 00C24689 处的 CALL 右键跟随(也就是进入这个 CALL)来到下面代码处

00C082B3    56              PUSH ESI                                 ; 来到此处
00C082B4    8BF1            MOV ESI,ECX
00C082B6    FF7424 08       PUSH DWORD PTR SS:[ESP+8]
00C082BA    8B8E 5C060000   MOV ECX,DWORD PTR DS:[ESI+65C]
00C082C0    6A 00           PUSH 0
00C082C2    E8 24D70000     CALL 00C159EB                            ; 右键跟随
00C082C7    3386 5C200000   XOR EAX,DWORD PTR DS:[ESI+205C]          ; 问题 1 下面解答
00C082CD    5E              POP ESI
00C082CE    C2 0400         RETN 4

这里有 2 种方式(我测试了2个带KEY的ARM壳,所以我只碰到了2种方式。一会说明)

我们继续在 00C082C2 处的 CALL 右键跟随来到下面代码处

00C159EB    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]
00C159EF    C1E0 06         SHL EAX,6
00C159F2    034424 08       ADD EAX,DWORD PTR SS:[ESP+8]
00C159F6    8B4481 18       MOV EAX,DWORD PTR DS:[ECX+EAX*4+18]
00C159FA    35 8AC0E665     XOR EAX,65E6C08A
00C159FF    C2 0800         RETN 8                                   ; 在此设置个断点

现在在 00C159FF 上设置一个硬件执行断点,然后 Ctrl+F2 重载程序并 SHIFT+F9 执行.断下后注意看 EAX 的值,我这里是 00733907,这个是什么?不就是刚才的 0073-3907 机器指纹吗?现在你应该知道怎么做了吧 ? 找个空白地方写个补丁代码就可以了。我这里用 OD 的动态分配内存插件分配个空间写个补丁.我得到的地址是 30000000 . 补丁代码入下,你也可以直接找个地方写代码而不用插件分配内存。

原代码:
00C159FA    35 8AC0E665     XOR EAX,65E6C08A

补丁代码:

00C159FA  - E9 01A63E2F     JMP 30000000

注意当前的 EIP 是 00C159FF .我们把 EIP 重新定位到 00C159FA 处后 F8 一次就来到我们要写修改指纹的空间了。写下如下代码

30000000    35 8AC0E665     XOR EAX,65E6C08A                         ; 恢复原来的代码
30000005    3D 07397300     CMP EAX,733907                           ; 判断当前是否是机器指纹 0073-3907
3000000A    75 05           JNZ SHORT 30000011                       ; 不是跳走
3000000C    B8 41DD485F     MOV EAX,5F48DD41                         ; 替换成可用 KEY 的指纹 5F48-DD41
30000011    C2 0800         RETN 8                                   ; 原来的代码

改好后 SHIFT+F9 然后输入 KEY.就能看到正确提示了:Key is valid, and has been stored.确定后就可以按照无 KEY 的 ARM 脱壳了。

关于刚才的问题 1 现在解答一下,那个地方其实也是个 ARM KEY 断点的好地方,不过 ARM 的 KEY 分几种,简单说下,本例子是个长的 KEY.还有种比较短的 KEY ,当你遇到短 KEY 的时候根据下面的方法下断打补丁.

长 KEY 的时候在这里开始补丁.

XOR EAX,65E6C08A
RETN 8 

短 KEY 的时候在上面的 RENT 8 返回后会来到下面这个地方。

00C082C7    3386 5C200000   XOR EAX,DWORD PTR DS:[ESI+205C]          ; 问题 1 下面解答
00C082CD    5E              POP ESI
00C082CE    C2 0400         RETN 4

F8 单步走过 00C082C7 后再看 EAX 的值就是你的本机指纹了,补丁方法跟上面相同,不多说了。
--------------------------------------------------------------------------------
【脱壳总结】

本问没什么技术含量,如有错误之处请各位赐教。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
上传的附件
文件类型: rarfiles.rar (2006-03-26 13:52, 0, 621 次下载)
【加固技术】ARM平台代码保护之虚拟化 代码的虚拟化即不直接通过CPU而是通过虚拟机来执行虚拟指令。代码虚拟化能有效防止逆向分析,可大大地增加了代码分析的难度和所需要的时间,若配合混淆等手段,对于动静态分析有着较强的防御能力。 阅读详情

相关推荐

Unity3D项目程序加密-VirboxProtector加壳工具

各位Unity3D的开发者,你还为你的代码被反编译而头疼, 混淆和加密已经失效,为内存dump代码而烦恼?是否辛苦制作的游戏被盗版被抄袭而烦恼? 是否害怕算法被别人参考要把算法写成C++而费劲周折? 快来使用深思数盾外壳保护(Sense Shield Virbox Protector ) 专门处理Unity3D的代码加密和授权保护。   背景:      大家都知道Unit

编程小王子的博客 6578

逆向-破零ARM 64位版本

逆向-破零ARM 64位版本

xiaozhi 875

如何处理动态语言(Python / JS)的“隐形”调用链?

本文揭示动态语言(Python/JS)中静态AST解析导致调用链“断链”的核心问题,提出通过运行时追踪补全图谱的解决方案。基于Code-Graph-RAG的cgr trace机制,分别利用pytest插件与V8 Profiler捕获真实调用路径,将动态边合并至静态图谱,并在权重体系中提升动态边优先级。实践表明,该方法可显著提升图谱覆盖率,实现“结构+行为”双视角理解代码,为MCP与Rerank系统提供可靠支持。

xianyinsuifeng的博客 421

signature=12652a2238fd7c87d48721e567c082a0,【音响聚焦】顶级Hi-End音响发烧器材介绍(功放篇)...

润丰名线坊今天,要给大家介绍的是顶级Hi-End音响发烧器材中很重要的一个部分,那就是——功放篇。在一套良好的Hi-End音响系统中,功放的作用功不可没。而世界顶级的Hi-End发烧功放器材,顶级Hi-End功放包括:前级放大器和后级放大器。下面将为大家一一介绍1、FM Acoustics 40 周年限量版 118市场参考价:290万2、高班GOALBON-KT88 GB200单声道胆后级市场参考...

weixin_33702545的博客 1626

Mac本地部署OpenClaw:从零搭建企业级知识库AI助手

大语言模型(LLM)作为当前人工智能的核心技术,通过其强大的自然语言理解和生成能力,正在深刻改变信息交互方式。其原理是基于海量数据训练的深度神经网络,能够根据上下文预测并生成连贯文本。这一技术的核心价值在于,它能够作为智能中枢,理解和执行复杂指令,从而将通用AI能力转化为解决特定业务问题的生产力。在工程实践中,通过AI Agent框架(如OpenClaw)将LLM与外部工具和知识系统连接,是实现其价值的关键。这涉及到**本地部署**与**私有化**部署,以确保数据安全与成本可控。具体应用场景包括企业知识库问

weixin_33402252的博客 380

伯德图逆向工程:用MATLAB从扫频数据中提取系统特性的5个关键步骤

本文详细介绍了使用MATLAB从扫频数据中提取系统特性的5个关键步骤,包括数据预处理、频响特性提取、相位解缠绕、系统特性反演和结果验证。通过伯德图逆向工程技术,工程师可以有效分析黑箱系统的频率响应特性,解决噪声干扰和相位跳变等实际问题,提升控制系统调试效率。

weixin_29081163的博客 200

ARM40-A5应用程序——key

ARM40-A5应用程序——key 2019.3.8 版权声明:本文为博主原创文章,允许转载。   Linux输入设备总类繁杂,常见的包括有按键、键盘、触摸屏、鼠标、摇杆等等,他们本身就是字符设备,而Linux内核将这些设备的共同性抽象出来,简化驱动开发建立了一个input子系统。   本文结合ARM40-A5介绍其中的gpio key,即GPIO按键。 一、gpio key电路   下图是ARM...

vonchn的博客 1241

AD21导出gerber文件

文件–>制造输出–>Gerber Files 文件–>制造输出–>Gerber Files 通用、光圈和高级跟第一步一样 3.文件–>制造输出–>NC Drill Files 这个默认就可以了 主要参考视频来自bilibili添加链接描述 此篇博客主要是写给自己好记的,无其他商业用途 ...

新手小杨 1万+

Crash-utility command help 汇总(1)

NAME extend - extend the crash command set SYNOPSIS extend [shared-object …] | [-u [shared-object …]] DESCRIPTION This command dynamically loads or unloads crash extension shared object libraries: sha...

u013286033的博客 5569

【生成数据集EXCEL文件】使用生成对抗网络GAN生成数据集:输出生成数据集EXCEL

生成器的任务是接收随机噪声向量作为输入,并尽可能生成与真实数据相似的样本,而判别器则是一个二分类器,旨在区分输入的样本是来自生成器生成的,还是来自真实数据。在训练过程中,生成器和判别器通过对抗学习的方式相互博弈,生成器的目标是生成足以欺骗判别器的样本,而判别器的目标则是尽可能准确地判断样本的真实性。GAN网络在多个领域展现了强大的能力,能够生成与训练数据分布相似的新数据,包括但不限于图像生成、图像风格转换、超分辨率、数据增强、视频生成、自然语言处理、医学图像处理以及游戏与虚拟现实等。

hustef的博客 1522

VAY 是 SAP 自动科目确定(OBYC-GBB)中的科目修改码,专用于带科目分配对象的销售订单发货场景,核心是触发 “Dr 成本要素科目(如销售费用 / 特定成本对象) Cr 库存商品” 的分录,

摘要:VAY是SAP中用于带科目分配对象(如成本中心、WBS)的销售订单发货的科目修改码,与标准VAX场景不同,它生成"借成本要素科目/贷库存商品"的分录。配置路径为OBYC-GBB-VAY,需确保借方科目为成本要素。典型业务场景包括免费样品、项目专用发货等。常见问题包括VAY未触发或科目记账错误,需检查销售订单科目分配、移动类型设置及OBYC配置。特殊场景建议单独配置科目以便费用分析。

金牌架构师 1257

【转】脱壳工具

脱壳工具http://www.pediy.com/tools/unpacker.htm 文件类型侦测工具 peid 0.94

学习........ 4393

Docker安装并运行AnythingLLM的详细教程

通过本文的介绍,你已经掌握了如何在 CentOS 系统上使用 Docker 安装并运行 AnythingLLM。AnythingLLM 提供了强大的功能,支持本地知识库搭建和多模态输入,非常适合个人和企业使用。希望本文能帮助你快速上手并搭建自己的 AI 知识库。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 5862

APK加壳【1】初步方案实现详解

本文引自于我的个人博客 APK加壳【1】初步方案实现详解 来源与原理 本文是尝试对优快云大牛 Jack_Jia 的博客 Android APK加壳技术方案【2】 进行实现的过程记录,该文介绍了一种对源程序APK加壳的思路并提供了对应的源码。 所谓加壳,就是通过给目标APK加一层保护程序,把需要保护的内容加密、隐藏起来,来防止反编译...

weixin_34204722的博客 262

YOLO 系列专栏(二十九)YOLO26 × StarNet 轻量化涨点方案(CVPR 2024)轻量化、主干改进篇 | 星星卷积虽小,却蕴藏着巨大的高效潜力

StarNet 出自 CVPR 2024 轻量化主干网络工作,核心创新是,依靠逐元素乘法实现高阶特征融合,在几乎不增加参数量与 FLOPs 的前提下,大幅提升特征表达能力,天然适合等多任务统一建模。本文将 StarNet 完整替换 YOLO26 原有主干,保留 YOLO26 无 NMS 检测头与轻量化结构,实现,并提供。

qq_36130719的博客 410

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux arm 加壳,[求助]一个变态的花指令的arm

[求助]一个变态的花指令的arm2006-2-3 20:215237[求助]一个变态的花指令的arm2006-2-3 20:215237一个变态的花指令的arm问题:这是arm的什么保护形式?iat如何得到?找oep非常容易。找到oep为00401EBC,如下:0012EB7401 00 00 00 A8 08 00 00...?..0012EB7C64 0F 00 00 01 00 ...

weixin_33701379的博客 597

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Android Fingerprint完全解析(二) :Fingerprint启动流程

Android 6.0 Fingerprint 启动流程

简单不先于复杂,而是在复杂之后 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

模型之外的那套装置:用 AI harness 完成一个三端同步应用

AI harness 指模型之外、让模型能持续产出可交付软件的全部工程装置。本文把它称作"支架"。它由五层构成:输入层规定模型读什么,反馈层规定模型怎么知道自己错了,观测层把界面与设备状态变成可读事实,记忆层让跨会话不失真,边界层规定哪些动作不许模型自行作出。支架的价值在六天里可以直接计量。

Leo的Matrix 183

如果用pytest命令启动测试脚本有哪些方法和参数呢?请详细解析

pytest的命令行启动非常灵活,它围绕“”、“”和“”三个核心维度,提供了一套强大的参数体系。

simpleness_的博客 176

软件测试用例模板怎么写:从用例设计到执行记录的全套指南

测试用例是测试工作的核心产出,它决定测试覆盖了多少、漏掉了什么。但大多数人的测试用例写得像流水账——只有正常路径,没有异常场景;只有操作步骤,没有预期结果;只有功能测试,没有非功能测试。本文拆解测试用例的标准结构,说明每个字段的含义和写法,给出覆盖功能测试、性能测试、安全测试的完整用例范例,并列出测试用例设计的五个高频遗漏点。

wuwangzhiduoshao的博客 154

附录一源码阅读路线与断点索引

本索引固定于Boot 3.5.7与Framework 6.2.12。先选择要解释的现象,再打开对应源码。表中观察对象是逻辑名称,不保证在所有重载中都是同名局部变量。抽象接口和注解用于阅读契约,不提供可执行方法体断点。

weixin_45476869的博客 164

大型高复杂度互联网项目管理经验心得

复杂项目,管理的核心不是管人,而是管理依赖和变更简单项目重点是排任务、盯进度;多端多关联系统的大型项目,大部分延期、故障根源都来自依赖失控、变更失控。项目经理首要工作是把看不见的依赖显性化,把随意变更变成受控变更,而不是单纯催开发进度。分批上线不是降低标准,而是拆分风险,小步可控很多人觉得分批上线麻烦,希望攒到一起发布。但集中上线会把所有风险集中在同一个窗口,一旦出问题,排查范围巨大、影响面广。分批发布本质是风险隔离,每一批只承载有限的变更,出问题更容易定位、回滚、止损。

zyx980193917的博客 193

[LLM Wiki理论与实践-09]将OpenWiki融入Coding Agent为你节省Token

针对OpenWiki的整合则将Coding Agent的执行模式升级为**先读知识库、再精准修改代码**。OpenWiki预置概念文档、测试说明、页面清单与更新时间,让Agent快速理解业务意图、定位相关代码与测试、判断信息新旧,减少Token与时间开销,降低理解偏差和跨文件遗漏,使改动更一致、可复现,文档与代码同步维护。

JaydenAI的博客 440

MyBatis 入门核心教程:原生接口与 Mapper 代理双模式实战

MyBatis 是 Java 生态中应用最广泛的半自动化持久层框架,它在封装 JDBC 冗余模板代码的同时,将 SQL 的编写权完全交给开发者,兼具开发效率与性能优化空间,是国内企业级项目的主流持久层方案。MyBatis 提供了两种核心开发模式:原生接口模式适合理解框架底层执行原理,Mapper 代理模式是企业开发的标准规范。本文从基础概念出发,完整覆盖环境搭建、两种模式的代码实现、底层原理、事务机制与高频问题排查,所有代码均可直接运行,适合系统入门与实战参考。原生接口模式。

2401_87069538的博客 980
上一篇: 磁盘文件的正常读写与异步读写
下一篇: 签入式捆绑
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值