| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 代码还原的技术: Unidbg调试浮点数运算(一) -> 正文阅读 |
|
[嵌入式]代码还原的技术: Unidbg调试浮点数运算(一) |
一、目标在做代码还原的时候,经常能看到一些奇怪的寄存器和奇怪的指令:
很像某些流量明星,看上去很眼熟,仔细看看又不认识。 它们就是传说中的浮点数运算,今天我们来点亮一个很有用的技能树: Unidbg调试浮点数运算 二、步骤先写个floatdemo有这么一个祖传的算法函数。
算出圆的周长和面积,然后再把它们相加。 高级语言就是好,一目了然。 IDA一把可以看出两个区别, 一个是寄存器不一样,普通运算使用的寄存器是R0-Rx,浮点数运算使用的是D0-Dx (其实还有 S0-Sx),另一个是指令不一样,普通运算是MOV、MUL,而浮点数运算使用的是VMOV,VMUL,感觉就是普通运算的VIP版。 第一个知识点就出来了,V开头的指令就是浮点数运算指令,Dx Sx Qx 就是浮点数寄存器。 Unidbg亮相按照 Unidbg模拟执行某段子so实操教程(一) 先把框架搭起来 这个框架把我们刚才编译的 floatdemo.apk 跑起来,然后增加一个 stringFromJNI 函数的调用。
由于 stringFromJNI 不是静态(static)的类函数,所以我们需要先创建个一个 MainActivity 对象,才可以调用它的方法。 先跑一下看看结果
我们传了个参数6,半径是6的圆, 周长是 37.699, 面积是113.097 ,它们之和是 150.796。 结果没毛病,那我们开始调试了。 Unidbg调试从刚才运行的结果里我们知道 stringFromJNI 函数的地址在 0xc6c9, 那么我们现在需要在这个地址下个断点,让调试器停在这个地址。 Unidbg的调试功能依然很强大,它支持三种调试模式 CONSOLE、GDB和IDA,目前我用的顺手的是 CONSOLE 模式,今天先介绍这个。 开启调试炒鸡简单,加上这两行代码就行
运行一下,就顺利的进入到调试器命令行了,直接回车,会显示目前支持的调试命令。 我们是新手嘛,先掌握一个n和s两个命令就行了,n是单步步过,就是执行一条指令,步过函数调用;s是单步步入,就是执行一条指令,进入函数调用。 n命令跑几下来到我们要分析的浮点数运算的位置,发现尴尬了…… Unidbg调试器只显示了Rx寄存器,没有显示Dx系列的寄存器,这下怎么分析,不能盲摸呀? 打开Unidbg浮点数寄存器显示Unidbg是支持浮点数运算模拟的,那么一定是有地方去读取浮点数寄存器的,只是没有显示出来而已。 我们先分析下Unidbg调试时寄存器显示部分的代码。 先搜索 r0= 在哪里处理的? showRegs 就是显示寄存器, 当参数为null的时候,通过 ARM.getAllRegisters 来显示所有的寄存器。但是为啥没有显示浮点寄存器呢?奇怪。 我们再往下翻,发现在ARM64的模拟下显示了Q0-Q31寄存器,通过查阅资料,我们知道了原来它们都是一伙的。 那ARM32先放一下,我们把模拟环境切换到ARM64
再跑一下,调试器没有激活? 这是为什么? 原来我们把模拟器从Arm32切换到了Arm64,那么载入的so就是64位的了,所以 stringFromJNI 函数的地址也变了,需要把断点下在新的地址 0x12738 上面。 这下不一样了,浮点寄存器都显示出来了。 优化一下浮点寄存器的显示李老板: 奋飞呀,这个0x400921f9f01b866e是啥意思呀,你是不是搞错了,浮点数寄存器显示的咋不是 3.14159 ,而是这个乱七八糟的数据? 奋飞: 老板,程序员的母语就是16进制,没有一眼把 0x400921f9f01b866e 认出是 3.14159的,晚饭是不配加鸡腿的,也不配变秃的。 有理想的同学请自行搜索 IEEE754 二进制浮点数算术标准 其他的同学请和我一起优化下浮点寄存器的显示。 由于飞哥目前为止还没有变秃,确实也看不出来这玩意就是 3.14159, 只好另辟蹊径,给大家传授一个神奇的函数:
科学研究表明:在没有变秃的前提下,我们依然有机会变强。 其实C/C++ 有个神奇的玩意叫指针,这种显示一把梭就行
好了,后面的几步运算就是乘乘加加了,同学你自己n几下就ok了。 (此处应有掌声) 三、总结为什么要去调试,直接F5大法不香吗? 现在Ollvm肆虐,掌握一些手撕汇编的良方可保你无忧。 为什么要用Unidbg去调试,IDA不香吗? 悟空,等你遇上内存防修改,无法下软件断点和一些BT的反调试的时候,你自会回来和为师唱这首歌的: Only You … 预告一下,下一篇是开启Arm32下的浮点数寄存器显示和TraceCode 知道为何自古红颜多薄命吗?因为没人在意丑的人活多久。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 20:54:33- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |