安卓逆向_16 --- ARM 静态分析( 使用 IDA Pro 分析 ARM 汇编【java_ 和 JNI_OnLoad】 )

 

菜鸟总结 so 分析,arm 汇编,IDA 静态分析:https://www.52pojie.cn/thread-695063-1-1.html

JNI 静态注册 so 和 IDA 导入的 JNI.h 文件.zip:https://download.csdn.net/download/freeking101/12571373

 

ARM 静态分析:

代码 和 数据 的 切换:C  =>  代码D  =>  数据   A  =>  ascii字符串 U  =>  解析成未定义的内容p  =>  识别成一个函数
X          =>  查看交叉应用
F5         =>  查看伪代码
Alt+T      =>  搜索文本
Alt+B      =>  搜索十六进制

 

  • https://www.bilibili.com/video/BV1vE411c7Zj?p=49        15' 30''【识别成函数 ,按p】    15' 50''【识别成字符串,按 a】

 

  • https://www.bilibili.com/video/BV1UE411A7rW?p=50

JNI_OnLoad 函数 的 ARM 汇编代码的简单分析

  • R0 --- R3:这 4 个寄存器,用来传递函数调用的 第1 到 第4 个参数超出的参数 通过 堆栈 来传递。
  • R0 :R0寄存器 同时用来存放 "函数的返回值",类似 x86 汇编中 ax 寄存器,存放 call 之后的返回值。
  • 被调用的函数在返回前无需恢复这些寄存器的内容

关于 ADD PC 寄存器

 

 

  • https://www.bilibili.com/video/BV1UE411A7rW?p=51

getText 函数分析:

IDA Pro 反编译后,参数类型反编译错误,修改参数类型 和 重命名参数。。。。。

修改变量类型( 快捷键 :按 Y  ):

重命名变量名修改变量类型 差不多,这个是右键之后选择 Rename 选项( 快捷键:按 N ),这里 a1 重命名为 env,如图:

同理,参数 int a2 修改为 jobject obj 

hide casts ,是代码看起来更清晰

导入 jni.h 头文件。    12'

添加 jni 的结构体。 12' 50''

选择和 jni 相关的结构体进行添加

还原 ARM汇编代码中的方法名:

 

  • https://www.bilibili.com/video/BV1UE411A7rW?p=52

静态函数 getText2 函数的ARM代码分析

ARM 代码

关于 add pc 寄存器:    8' 30''

 

 

  • https://www.bilibili.com/video/BV1UE411A7rW?p=53

JNI_OnLoad 正向开发:

JNI_OnLoad 的 ARM 代码分析:

C++ 函数定位    13'

C++函数参数对应分析

 

Cadd 函数、Csub函数 对应 ARM 代码:(思考:怎么通过修改 arm 代码,把 加法 变成 减法???)

 

 

菜鸟总结 so 分析,arm 汇编,IDA 静态分析

 

So 静态 (arm 汇编,IDA 静态分析等)

  • R7:栈帧指针(Frame Pointer)。指向前一个保存的栈帧(stack frame)和链接寄存器(link register, lr)在栈上的地址
  • R13:又叫SP(stack pointer),是栈顶指针
  • R14:又叫LR(link register),存放函数的返回地址。
  • R15:又叫PC(program counter),指向当前指令地址
  • bl:这条指令对函数进行调用。请记住被调用函数需要的参数已经存储到相关的寄存器中了(r0和r1)。这条指令的执行一般被当做一个分支(branch)。可以理解为执行带链接的分支,也就是说,在跳转到分支之前,会将lr(link register)的值设置为当前函数中将要执行的下一条指令,当从分支(被调函数)中返回时,通过lr中的值可以知道当前函数执行到哪里了。
  • blx 中的 x 标示交换 “exchange”,意思是如果有必要,处理器将对指令集模式进行切换。
  • 返回值 (存储在 r0 中)
  • mov r0, r1             =>    r0 = r1
  • mov r0, #10          =>    r0 = 10
  • ldr r0, [sp]             =>    r0 = *sp
  • str r0, [sp]             =>    *sp = r0
  • str                         把寄存器内容存到栈上去
  • ldr                         把栈上内容载入一寄存器中
  • add r0, r1, r2         =>    r0 = r1 + r2
  • add r0, r1              =>    r0 = r0 + r1
  • push {r0, r1, r2}     =>    将 r0, r1 和 r2push 到栈中.
  • pop {r0, r1, r2}       =>    将3个值从栈中pop出来,并存放到r0, r1 和 r2中.
  • b_label                  =>    pc = _label
  • bl _label                 =>    lr = pc + 4; pc = _label
  • self 和 _cmd 占用了 r0 和 r1 寄存器。它存储着当前执行方法的 selector
  • 每次调用 Objective-C 方法时,都由 objc_msgSend 方法处理消息的派送。该方法根据传递的消息类型在类的方法列表中查找被调用方法的实现。objc_msgSend方法:id objc_msgSend(id self, SEL _cmd, ...)
  • MOV R1, #0 的 机器码计算:这里将 5 位 opcode 分成了两部分 ----- 前 3 位 001 是固定的,后 2 位用于标识 4 中不同的操作: mov, cmp, add, sub。所以 mov 指令的 opcode 二进制表示为 00100;这里 Rd 为 R1,所以 8~10 位为 001;同理, 0~7 为就 0000 0000。所以 MOVS R1, #0 的 2 进制表示为: 0010 0001 0000 0000 = 0x 21 00。
    http://blog.csdn.net/zolovegd/article/details/1826192
    http://blog.csdn.net/gooogleman/article/details/3758555(opcode学习帖子)

 

.so 文件(shared object) linux 的动态链接库,

显示调用则是在主程序里使用 dlopen、dlsym、dlerror、dlclose 等系统函数。

1.IDA计算出了成员变量的偏移地址并把 symbol 直接显示出来
IDA:__text:000026C4                 
mov  ebx, ds:(_OBJC_IVAR_$_TestButton_m_model - 26C3h)[esi]
2.函数参数在IDA中被赋予名称,ebp+8为arg_0,ebp+12为arg_1。 arg即为argument的缩写,第n个参数在+号后面的偏移量不是绝对的
。在函数开头和代码中,名称都会直接替换掉实际偏移量。基本上arg_0都是self。
3.常数值型偏移地址被赋予名称,以loc_为前缀。
IDA:jmp     short loc_2732
4.局部变量,即 ebp-xxx 会被命名为 var_xxx
搜索特征字符串。具体操作为:①快捷键Ctrl+S,打开搜索类型选择对话框-->双击Strings,跳到字符串段-->菜单项“Search-->Text”;
②快捷键Alt+T,打开文本搜索对话框,在String文本框中输入要搜索的字符串点击OK即可;

(C的函数 ,抹掉了符号表)

 

 

So 动态调试 ( .init_array 下断 )

 

System.loadLibrary()加载so文件流程

  • 先读取 so 文件的 .init_array段。
  • 再执行 JNI_OnLoad 函数,JNI_ONLoad是.so文件的初始函数
  • 然后调用具体的 native 方法

so 被加载之后最开始执行的是 .init_array 段的代码,然后才去执行 jni_onload,那么在 .init_array 处断下来便是很有必要的

 

  • 1. 启动 android_server
  • 2. 端口转发:adb forward tcp:23946 tcp:23946
  • 3. 调试启动:adb shell am start -D -n com.scottgames.fnaf4/com.putaolab.ptsdk.activity.PTMainActivity
  • 4.链接,下断点

 

Shift+F12 打开 字符串窗口,搜索字符串: dlopen,找到 dlopen 函数的偏移 0xF30

动态调试的 IDA 中, G 跳转到: 400D3000+F30=400D3F30 处,下好断点

搜索字符串: calling

按 F9 运行

然后打开 Eclipse 或者 ddms,执行 jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

程序就会断在第一个断点处, F9 几次就段在 blx R4 处

F7 跟进就来到 init 段代码处:

1.IDA用32位,
2 ./android_server  要su
3  重启平板
4. <application android:allowBackup="true" android:debuggable="false" android:icon="@drawable/app_icon"
Dump
dvmLoadNativeCode 函数是加载和初始化 so 的函数, dvmDexFileOpenPartial 函数是对缓存 Dex 文件,该函数第一个参数就是解密后 dex 文件头内存地址,而第二个参数是该 dex 大小。
跳到 dvmDexFileOpenPartial 函数或 inflate 函数去下断,
int dvmDexFileOpenPartial(const void* addr, int len, DvmDex** ppDvmDex);
第一个参数就是 dex 内存起始地址,第二个参数就是 dex 大小。所以在这个函数下断点可以直接 dump 出明文 dex

static main(void)
{
auto fp, dex_addr, end_addr;
fp = fopen("D:\\dump.dex", "wb");
end_addr = r0 + r1;
for ( dex_addr = r0; dex_addr < end_addr; dex_addr ++ )
fputc(Byte(dex_addr), fp);
}

 

遇到反调试

先查 Pid,ps -aux,然后 cat /proc/xxxxx/status 就可以看 tracerPid, 如果不为零及被调试过,当程序打开进程成功后使用 fgets 获得信息,当获得如下信息进我们将其修改为 0,原因:底层会调用 libc 库中的 fopen 函数打开 so 文件句柄,然后通过 fgets 函数读取进程状态值,就可以通过修改读取到的状态值绕过调试进程检测。

修改成 0( Thumb 00 20 , 70 47 即 Mov R0,#0)

1.fopen—/proc/self/cmdline.debug.atrace.app_cmdlines
2.fgets—-包名
3.LoadNativeCode–加载 libexec.so
4.LoadNativeCode–加载 libexecmain.so
5.建立反调试线程(通过检查是否存在调试进程)
6.调用 fopen 一一打开/proc/pid/status
7.调用 fgets —读取调试进程 pid
在 fgets 内部会调用 memchr 函数,和 memcpy 函数, memchr 函数完成以换行为分隔符, memcpy 将此次读取位置拷贝到目的缓冲区

 

 

脱壳:https://www.52pojie.cn/forum-5-1.html

nop: 0xc046

INIT_ARRAY,JNI_OnLoad

壳入口 ---> INIT_ARRAY ---> 解密第二层壳(JNI_OnLoad) ---> 解密原始so文件 ---> 解压缩原始so的代码节。

http://www.52pojie.cn/thread-356096-1-1.html

__gnu_armfini_26 此函数是 ELF 的入口函数,此函数就完成了 jni_onload 和 verify 等的解密。

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人脑的前世今生

来源&#xff1a;科学网摘要&#xff1a;人类的神奇常常归结于一个智慧的大脑以及贯穿于其中的无比复杂的神经网络&#xff0c;并认为这源自上帝之手&#xff0c;但其实它并不是无中生有的&#xff0c;而是自然演化的产物&#xff0c;虽然是一个无与伦比的杰作&#xff0c;但人…

Web在线操作Office之Word

最近公司有个项目&#xff0c;需要直接在IE浏览器中操作Word文档&#xff0c;随后在网上搜了一些资料&#xff0c;感觉都不是很理想。不过&#xff0c;最后还是找到了一个 功能比较强的控件&#xff0c;是老外开发的控件&#xff0c;需要注册。还好&#xff0c;没有注册时&…

安卓逆向_17 --- IDA 动态调试【 环境搭建、so库调试【动态普通、动态debug模式】、JNI_OnLoad调试分析、java_ 开头函数分析】

哔哩哔哩视频&#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p54 IDA Pro调试so&#xff0c;附加完毕&#xff0c;跳到目标so基址&#xff0c;但是内容都是DCB伪指令&#xff1f;&#xff1a;https://bbs.pediy.com/thread-222646.htm Android 中 adb shell ps 查…

2018全球科技创新报告

来源&#xff1a;199IT互联网数据中心摘要&#xff1a;毕马威报告显示&#xff0c;我们如今正处在一个科技创新爆发的时代&#xff0c;对于科技企业来说&#xff0c;现在不是害怕失败或是裹足不前的时候。毕马威报告显示&#xff0c;我们如今正处在一个科技创新爆发的时代&…

安卓逆向_18 --- APK保护策略【Java代码混淆、资源混淆、签名校验】

Java 代码混淆介绍&#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p60 Android 反编译利器 jadx&#xff1a;GitHub上直接下载&#xff1a;https://github.com/skylot/jadx Jeb 软件是一款专业实用且为安全专业人士设计的 Android 应用程序的反编绎工具&#xff0…

谷歌的「未来城市」

来源&#xff1a;爱范儿摘要&#xff1a;自 2015 年以来&#xff0c;谷歌一直在进行一个神秘的项目。自 2015 年以来&#xff0c;谷歌一直在进行一个神秘的项目。它就是由谷歌主导的「高科技未来城市项目」。那这个高科技未来城市是个什么样的城市&#xff0c;让玩物君来告诉你…

安卓逆向_19( 一 ) --- APK保护策略【APP打开就崩溃 之 霸哥apk过签名校验】

From&#xff1a;霸哥磁力搜索apk 过签名校验&#xff1a;https://www.cnblogs.com/LuLuLuHao/p/12863978.html 霸哥磁力搜索app回编签名&#xff1a;https://www.ssfiction.com/archives/2293 https://www.cnblogs.com/LuLuLuHao 哔哩哔哩&#xff08; IDA 分析 so &…

OpenAI NLP最新进展:通过无监督学习提升语言理解

编译 | reason_W编辑 | 明 明出品 | AI科技大本营摘要&#xff1a;近日&#xff0c;OpenAI 在其官方博客发文介绍了他们最新的自然语言处理&#xff08;NLP&#xff09;系统。这个系统是可扩展的、与任务无关的&#xff0c;并且在一系列不同的 NLP 任务中都取得了亮眼的成绩。但…

安卓逆向_19( 二 ) --- APK保护策略【重新签名后安装打开失败 --- 书旗小说.apk、浦发银行.apk的过签名校验【so 文件修改保存】】

From&#xff08; 书旗小说过签名校验 【 使用 DDMS 分析方法调用流程 】 &#xff09;&#xff1a;https://www.cnblogs.com/LuLuLuHao/p/12874468.html 签名校验一般步骤&#xff1a; 1. 先查有没有加壳&#xff0c;如果有壳&#xff0c;先脱壳2. 如果没加壳&#xff0c;则 …

GPU、FPGA芯片成为增强机器学习能力的“左膀右臂”

选自&#xff1a;forbes 编译&#xff1a;网易智能 参与&#xff1a;nariiy在商业软件中&#xff0c;电脑芯片已被遗忘。对于商业应用程序来说&#xff0c;这是一种商品。由于机器人技术与个人硬件设备联系更为紧密&#xff0c;因而制造应用程序仍然更侧重于硬件部分。自20世纪…

增强现实技术的9个最新应用趋势

来源&#xff1a;资本实验室摘要&#xff1a;随着AR技术的成熟&#xff0c;AR与行业的融合越来越深入。从设计到营销&#xff0c;从教育到医疗&#xff0c;从出行到文化&#xff0c;AR正在重新定义各产业的思维方式和运行方式。1.教育AR应用程序正在以更具互动性的方式改变教学…

安卓系统内 的 安卓虚拟机

转载&#xff1a;虚拟大师&#xff0c;让你的系统再安装一个系统&#xff0c;实现Xposed自由&#xff0c;支持摄像头调用http://xposed.appkg.com/2971.html 虚拟大师 VMOS 虚拟大师简介 虚拟大师是 Android 系统上的 Vmvare&#xff0c;完整的且自带 Root 系统能够让你实现无限…

未来一年最有可能成为独角兽的29家美国初创公司

来源&#xff1a; 资本实验室摘要&#xff1a;近期&#xff0c;研究机构PitchBook梳理出了在未来一年最有可能成为独角兽的29家美国初创公司。资本实验室今日投资关注聚焦前沿科技创新与传统产业升级“小兄弟&#xff0c;老夫看你骨骼清奇&#xff0c;天赋异禀&#xff0c;定是…

StreamWriter类的一般使用方法

理解StreamWriter可以对照StreamReader类来进行&#xff0c;因为他们只是读写的方式不同&#xff0c;一个是读&#xff0c;一个是写&#xff0c;其他的差别不是特别大。 StreamWriter继承于抽象类TextWriter&#xff0c;是用来进行文本文件字符流写的类。 它是按照一种特定的编…

Firefox、Chrome 盘助手

From&#xff1a;https://www.runningcheese.com/baiduyun IDM 下载地址&#xff1a;http://www.ucbug.com/soft/26392.html 定制 Firefox、Chrome 下载地址&#xff1a;https://www.runningcheese.com/ 由网友 "哩呵" 制作的 网盘助手 脚本&#xff0c;需要通过拓…

复杂性理论:科学方法的第三个梯级

来源&#xff1a;人机与认知实验室摘要&#xff1a;莫兰认为系统论超越了还原论&#xff0c;复杂性理论又超越了系统论&#xff0c;它们代表着科学方法论依次达到的三个梯级。复杂性研究从20世纪末叶兴起&#xff0c;目前在国内外已成为许多学科领域内研究的前沿和热点。它涉及…

Notepad++ 简单使用

github 下载地址&#xff1a;https://github.com/notepad-plus-plus 简介 Notepad 是 Windows 下的一款免费开源代码编辑器&#xff0c;它使用较少的CPU功率&#xff0c;降低电脑系统能源消耗&#xff0c;但轻巧且执行效率高&#xff0c;使得 Notepad 可完美地取代微软视窗的记…

MIT:机器学习预测2018世界杯冠军

来源 &#xff1a;199IT互联网数据中心摘要&#xff1a;麻省理工学院报道&#xff0c;他们的研究人员开发了一种新型人工智能&#xff0c;用以预测世界杯走势。麻省理工学院报道&#xff0c;他们的研究人员开发了一种新型人工智能&#xff0c;用以预测世界杯走势。研究人员声称…

安卓逆向_20 --- 模拟器检测、反调试检测、ELF动态调试、__libc_init 下断

From&#xff08; 模拟器检测实战分析 &#xff09;&#xff1a;https://www.bilibili.com/video/BV1UE411A7rW?p65 怎样过 app 的模拟器检测&#xff1a;https://bbs.pediy.com/thread-249759.htm Android 模拟器如何不被检测思路&#xff1a;https://bbs.pediy.com/thread…

2017-2018中国机器人创新Top100榜单深度分析

来源&#xff1a;产业创新创投数据平台Innov100摘要&#xff1a;人类和机器人由相互隔离、保持距离发展到充分的人机交互&#xff0c;融合共生。一、2017-2018年中国机器人创新Top100榜单二、中国机器人创新Top100数据分析&#xff08;一&#xff09;机器人创新Top100产业生态分…