arm ida 伪代码 安卓 符号表_使用IDA动态调试及ARM指令学习笔记

本文介绍如何用IDA进行动态调试及部分ARM指令的学习。

环境:已root的安卓手机一部,IDA pro 6.8,win7系统。

下载样本app,并已确认可调试(debuggable = true),下文不表:

http://pan.baidu.com/s/1jG22HMY

一 手机连接电脑,打开USB调试模式,并在电脑端打开IDA的这个目录:

a0603452b63c94b5f953356aaba82e3b.png

二 通过adb push android_server /data/local/tmp/ 命令将文件推送至手机:

a3e432567ab63ca577e55c60ec7b8360.png

三 开启服务,注意这个窗口不能关闭:

39e930b8d4fd08b7b95d600497f60fd4.png

四 端口转发:

bfa6d4c1df6996a0bab98f9a3a80b14f.png

五 打开IDA pro,我这里选择的是 32位的版本。

b1842c2af45368779234ba22d7e9d345.png

六  开启远程调试,注意先打开手机上的样本app,调试需要该进程

61bf46291977dd3c906ac38a092273d3.png

七 如图设置好 Hostname和 port:

3e2f4cf614cc09cc4de673bb665123ba.png

PS:端口是可以改的,有些app会检测端口进行反调试,通过修改端口可以绕过端口检测。

八 点击 OK按钮,并查找样本包名:

40c1c97572f41b6d562954e861285a3d.png

九 加载完成后的界面:

069162fe0df978af8b244f296bb460d9.png

十 在右边的 Modules 面板搜索 so文件名:

d3d9981ffee3a8c4e17531379cc778a5.png

十一 双击需要进行调试的JNI函数:

3abd8026c64c3732c25caffc6b3033f7.png

十二 设置断点,如图操作,其快捷键是 F2:

a5f98887e31f36ce8e99f000a7e8a321.png

十三 打开手机上的样例 app,按下F9,我们发现IDA停在了断点处:

d535df6e1b4f719db2942d3ea270565a.png

这样,我们就能愉快的进行动态调试了。

下面我们来分析这里面的部分汇编代码:

PUSH            {R3,LR} ;将寄存器R3和LR的值分别压入栈中,

R0-R3:通用寄存器,用于函数参数及返回值的传递

LR: 连接返回寄存器,保留函数返回后,下一条应该执行的指令。

POP             {R3,PC} ;将栈顶的值分别传递给寄存器R3和PC

bc5c18fae473505d7f27db3f3d48a697.png

PC:   程序寄存器,保存下一条CPU即将执行指令的地址,这里原本LR里面的值传递给了PC寄存器,这样就返回到了当初函数调用的地方。

9827ce0701040de4299fece0b71febfd.png

SP:栈顶指针寄存器,用于存放栈顶地址

9e38cd4bc7644ceb2a4ec17dd95674d3.png


按F8进行单步调试,继续分析下一条指令。

a6b01d62ee4ebc36178aa53030ef2dab.png


我们可以看看按下F8后,SP的值。

0720bf32318b408664afe872cc885208.png


CMP             R2, #2 ;比较 R2寄存器里面的值与2的大小。比较结果通过标志寄存器来保存。目前R2的值是5,因此两个值是不等的。

3e83bbad134d1d81df7a321d7af34465.png


执行比较指令后,发现Z的值变为了0,也就是说比较的结果不为0.

2f0121207727d78c8a602729b1ba5f0e.png


继续执行下一条指令:
BEQ             loc_D7FD0C60 ;Z标志值为1则跳转,即上一调比较指令的结果为0;否则继续向下执行。
继续往下走,走到这里:

fe83ff1db8bff4173dfef45049a52b38.png


BNE             loc_D7FD0C5A ;Z标志值为0则跳转,即上一调比较指令的结果不为0;否则继续向下执行,与BEQ是相反的。
通过上条指令的跳转后,来到了这里:

7f02a999fdf5e970d0a8728ec7e2004a.png


LDR             R1, =(aNormalUser - 0xD7FD0C60) ;把栈上内容载入一寄存器中,执行后,我们看到R1的值是:

a5161a19da05002eb90b4a1713ac9fc9.png


ADD             R1, PC                  ; "Normal User"
我们看到IDA后面自己的注释是 "Normal User",也就是说这两条指令的目的是把 字符串 "Normal User" 所在的地址传递给R1,我们执行后看看R1的值:

7cd6444fa4f0c2b840993ae0ca0341fe.png


我们在十六进制面板看看 R1值所对应的是什么:
鼠标在 十六进制面板 点击一下,然后按下G键,输入R1的值:

18de13b424bf6fda60729b4e234b82e5.png

点击OK后,跳转到了这里:

3f5c8a1959a7a9541ce525b974ecf85d.png


这里确实是存放 "Normal User"这个字符串的地址。
回到汇编窗口,继续执行下面这条指令:

359b8c71c080694ef57bee2a4c25c352.png


B               loc_D7FD0C64 ;无条件跳转到 loc_D7FD0C64 处.
执行后来到了这里:

9e1862d3a59c5fb067a4e473db76193c.png


LDR             R2, [R0] ;将R0的值为地址,赋值给R2

44fc7f193b5821c3867ebc1bbcba5a56.png


此时R0的值 F39312A0,我们看看对应的值是什么:

0df5d9de2133060cae57f99d4b2f4564.png

运行后,看看R2的值:

18b21c4183032659fc7aa30ae687d50e.png

可以看到,确实就是 R1地址的值:F362E54C。
下一条指令:MOVS            R3, #0x29C
即将 0x29C保存到R3寄存器:

7b0afd717db6ceef8228e170b4a35689.png


下一条指令:LDR             R3, [R2,R3]
将 R2寄存器的值与R3寄存器的值相加,得到一个地址,然后再取改地址上的值给R3;R2 = 0xF362E54C,R3 = 0x0000029C,相加得到这个地址值:
0xF362E7E8,看看是什么:

d74b8427d55b61f31dcb70761754dbcb.png


按下F8,看看R3的值:

52c909d3e3d753f1bc5fb86028e12a93.png

下一条指令:BLX             R3;
BLX 指令从ARM 指令集跳转到指令中所指定的目标地址,并将处理器的工作状态有ARM 状态切换到Thumb 状态,该指令同时将PC 的当前内容保存到寄存器R14 中。因此,当子程序使用Thumb 指令集,而调用者使用ARM 指令集时,可以通过BLX 指令实现子程序的调用和处理器工作状态的切换。
同时,子程序的返回可以通过将寄存器R14 值复制到PC 中来完成。
执行后,看到很多寄存器的值都变化了:

3c8b93c512289e63ab1f5d172e972f05.png

下一条指令:
POP             {R3,PC} ;将栈顶的值分别传递给R3和PC。

79eb8473015d55558e428ef82ab7a214.png


执行后,看看R3和PC的值:

77dad0066d42226f1c42a14df6aea3b2.png


好了,今天就介绍都这里吧,以后遇到看不懂的指令可以直接百度,如果要加深印象,可以动态调试看寄存器的变化或者内存的变化。

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

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

相关文章

糖豆人显示此服务器正在进行游戏,糖豆人服务器频繁崩溃,west滚石教技巧,蓝哥踢球做内鬼...

原标题:糖豆人服务器频繁崩溃,west滚石教技巧,蓝哥踢球做内鬼自从糖豆人游戏开放以来,大批玩家涌入,造成糖豆人服务器拥堵,一度出现崩溃。隔三差五就会来一次。玩家正玩得兴起,突然的崩溃让玩家…

js中立即执行函数会预编译吗_面试官:聊聊对Vue.js框架的理解

作者:yacan8https://github.com/yacan8/blog/issues/26本文为一次前端技术分享的演讲稿,所以尽力不贴 Vue.js 的源码,因为贴代码在实际分享中,比较枯燥,效果不佳,而更多的是以图片和文字的形式进行表达。分…

如何卸载服务器的系统,卸载服务器的操作系统

卸载服务器的操作系统 内容精选换一换弹性云服务器卸载磁盘。弹性云服务器状态为stopped时支持系统盘(也就是/dev/sda挂载点)和用户盘的卸载,没有操作系统限制,也不需要在弹性云服务器内部安装vmtools。弹性云服务器状态为active态时有如下约束限制&…

修改了模板文件tpl如何立即生效_Views视图与模板

一、概述用户请求到视图流程:当有人访问我们django项目的时候 例如127.0.0.1:8000/polls/23,django首先到加载mysite.urls模块在mysite.urls中发现有urlpatterns变量,于是在其内按顺序进行匹配。当它匹配上了polls,就到匹配到的po…

vue本地没事放到服务器上无限循环,解决vue中的无限循环问题

项目中遇到了这样一个问题:每一种产品有对应的服务费,每一个商家有多种商品要单独计算每一家的服务费,最后汇总总的服务费用。我直接写了一个方法来计算出每个商家和总的服务费用并return出来。如果不看控制台的话运行是没问题的。但是控制台…

壁式框架内力计算_4种类型剪力墙的计算要点

剪力墙又称抗风墙、抗震墙或结构墙。房屋或构筑物中主要承受风荷载或地震作用引起的水平荷载和竖向荷载(重力)的墙体,防止结构剪切(受剪)破坏。又称抗震墙,一般用钢筋混凝土做成。它分平面剪力墙和筒体剪力墙。平面剪力墙用于钢筋混凝土框架结构、升板结…

片源系统服务器,OUO NAS10主控界面评测

OUO NAS10主控界面评测■OUO NAS10主控界面评测OUO NAS10采用了高集成度的芯片,功耗比较低,整机满载情况下也不会超过9W。不过他的主控界面看起来还是比较简单易懂的,由于本身自带了linux的操作系统,还是比较容易上手的。附送光盘…

解锁设备_无师自通解锁新设备抗击疫情

随着春节假期接近尾声,一线企业复工复产,春运迎来全面返程客流高峰,为应对返程客流,做好疫情防控工作,哈车管内各站全面组织积极应对,做好进出站旅客测温,加强对进出站旅客体温筛查,…

GPS无线视频服务器,宏电环卫车无线视频监控与GPS定位系统设计方案.docx

Connecting Things环卫车3G/4G视频监控及GPS定位系统解决方案市宏电技术股份Shenzhen Hongdian Technologies Corporation.2015年7月目录 TOC \o "1-3" \h \z \uHYPERLINK \l "_Toc2914" 第一章 系统概述 PAGEREF _Toc2914 4HYPERLINK \l "_Toc5154&q…

css选择器权重排序_css选择器优先级高低排列_css样式权重计算和!important属性

首先我们需要知道选择器的类型有这些:选择器栗子ID#idclass.class标签p属性[typetext]伪类:hover伪元素::first-line相邻选择器、子代选择器>而这些css的选择器是有权重(即优先级)的,在不同选择器的样式出现冲突时候,会采用权重高的选择器…

python webdriver save_Python + Selenium +Chrome 批量下载网页代码修改【新手必学】

Python Selenium Chrome 批量下载网页代码修改主要修改以下代码可以调用 本地的 user-agent.txt 和 cookie.txt来达到在登陆状态下 批量打开并下载网页,以网页 ID 来保存为网页文件名PS:很多人在学习Python的过程中,往往因为遇问题解决不了或者没好的教…

sql盲注特点_SQL注入的特点及危害详解

http://www.maiziedu.com/SQL注入的特点及危害详解在网站安全性方面,我们经常会遇到各种各样的安全性问题,SQL注入就是其中最常见的一种,那SQL注入到底有哪些特点呢?一起来看看吧。SQL注入攻击的主要特点1、变种极多有经验的攻击者…

主从式网络的优点_贸泽电子原创开发板大赛【创意奖作品】物联网开发板做成主从机形式,是创意还是多此一举?...

没有创意,竞赛还有什么意义?作为汇集了国内工程师中的一批顶尖高手的设计大赛,本届贸泽电子原创开发板大赛自然少不了“最佳创意奖”,今天,就让我们来看看工程师大开脑洞的获奖作品有何稀奇?奖创意奖《基于…

es 吗 查询必须有sort_ElasticSearch DSL之From/Size,Sort

从这篇文章开始,我们要进入DSL的学习。使用url搜索仅仅是个开始,ES还提供带有查询DSL的请求体用于更高级的搜索。在这些类型的搜索中有大量可选项,可以混合和匹配不同的选项以获得所需的结果。DSL还能根据查询子句的过滤和查询上下文&#xf…

docker mysql配置 丢失_Ubuntu16.04服务器环境配置 – Docker、MySQL、Redis

Ubuntu16.04 服务器环境配置 – Docker、MySQL、Redis安装Docker1. 卸载旧版本sudo apt-get remove docker docker-engine docker.io2. 安装 https 相关的软件包sudo apt-get update # 先更新一下软件源库信息sudo apt-get install apt-transport-https ca-certificates cur…

mysql主从配置_MySQL主从配置详解

主服务器数据库的每次操作都会记录在其二进制文件mysql-bin.xxx(该文件可以在mysql目录下的data目录中看到)中,从服务器的I/O线程使用专用账号登录到主服务器中读取该二进制文件,并将文件内容写入到自己本地的中继日志relay-log文件中,然后从…

mysql 复制方式_MySQL复制方法

MySQL的二进制日志,MySQL复制原理,MySQL主从模式搭建,MySQL双主模式搭建,MySQL级联模式搭建,MySQL半同步模式复制一、二进制日志1、概念MySQL的二进制日志(binary log)是一个二进制文件,主要用于记录修改数…

mysql 主键唯一,MySQL。关键表中的主键。唯一ID还是多个唯一键?

Primary key in relational tables. Composite primary key or unique primary key in those pure relational tables?Which design would you recommend to use in MySQL for high performance? See diagramTechnical advantages and disadvantages!Thanks everyone!解决方案…

mysql以user1登录_在mysql中创建用户后不能本地登录的解决方法

在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库。在使用用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况,但是从其他的mysql客户端却可以登录。[rootmysql01 ~]# mysql -userver -p123456ERROR 1045 (28000): Acces…

mysql内部时区_一文解决MySQL时区相关问题

前言:在使用MySQL的过程中,你可能会遇到时区相关问题,比如说时间显示错误、时区不是东八区、程序取得的时间和数据库存储的时间不一致等等问题。其实,这些问题都与数据库时区设置有关,本篇文章将从数据库参数入手&…