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的操作系统,还是比较容易上手的。附送光盘…

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

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

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

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

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时区相关问题

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

制作 mysql的rpm文件_自制mysql.rpm安装包

RPM安装比源码更快更方便,更利于统一版本,省去了繁琐的编译过程,下面以制作mysql的rpm安装包为例。编译环境1、 安装rpm-build;检查是否配置rpm环境1 # sudo yum list | greprpm2 This system is not registered with RHN.3 RHN s…

mysql multi主从复制_mysqld_multi方式配置Mysql数据库主从复制

mysqld_multi设计用于管理在同一台机器上运行的多个mysqld进程,这些进程使用不同的socket文件并监听在不同的端口上。mysqld_multi可以批量启动、关闭、或者报告这些mysqld进程的状态。在这里我们通过这种方式来在同一个机器上启动多个数据库实例,并配置…

mysql中if在oracle怎么用_mysql和oracle的mybatis操作

1.Oracle、MySQL插入时返回下一个主键的操作Xml代码 Oracle:SELECT SEQ_ROLE.NEXTVAL AS ID FROM DUALinsert into ROLE(ID, NAME, CREATE, MODIFY) values (#{id}, #{name}, sysdate, sysdate)注意:这边的keyProperty"id"中"id"指的…

mysql数据库的三级模式_2016年计算机三级MySQL数据库试题

2016年计算机三级MySQL数据库试题一、选择题1.E-R图提供了表示信息世界中实体、属性和________的方法。A.数据B.联系C.表D.模式2.数据库系统的核心是________。A.数据模型B.数据库管理系统C.数据库D.数据库管理员3.E-R图是数据库设计的工具之一,它一般适用于建立数据…

mysql没加引号导致全表扫描_mysql隐蔽的索引规则导致数据全表扫描

索引是为了加速数据的检索,但是不合理的表结构或适应不当则会起到反作用。我们在项目中就遇到过类似的问题,两个十万级别的数据表,在做连接查询的时候,查询时间达到了7000多秒还没有查出结果。首先说明,关联的字段都已…

mysql 多个密码登录_mysql 多实例登录密码测试

最近在做mysql 多实例的时候,采用不同的方式登录mysql数据库,发现mysql -uroot -p -h 127.0.0.1 -P3308 ,登录时居然不要密码就可以登录,吓得我一身汗,经过检查终于找到原因记录下来,给小白们参考。[rootmy…

redhat5.4 安装mysql_Linux redhat 5.4上安装MYDNS

Linux redhat 5.4上安装MYDNS一、1,MYDNS 的简介:MyDNS是一个UNIX平台下的免费DNS服务器端软件。它被设计成直接从数据库中读取DNS记录软件,并且修改记录后也可时时生效。在MyDNS上,你可随心所欲地增加你自己的次级域名的同时建站…