先查看机器之间是否可以ping通
0x00:环境
待调试ELF文件
IDA 7.0
主机:Windows
虚拟机:Linux
达成效果:在Window上利用IDA远程动态调试linux里的ELF文件
0x01:Unbuntu里运行IDA的服务器组件
IDA附带以下组件:
linux_server:在Linux计算机上执行的、用于调试32位Linux应用程序的服务器组件。
linux_server64:在64位Linux计算机上执行的、用于调试64位Linux应用程序的服务器组件。
这里也要注意一下如果你选择的是linux_server,则应该对应开启32位的IDA
同理开启64位IDA
1)将Windows下的IDA里的dbgsrv文件夹下对应的组件复制到Linux中去,并运行这个组件。
注意:被调试文件如果是32位的,复制linux_server,被调试文件如果是64位的,复制linux_server64。
2)复制过去之后,打开终端,运行该组件:
- 若待调试是64位文件
1
2
chmod
+
x linux_server64
.
/
linux_server64
- 若待调试是32位文件
1
2
chmod
+
x linux_server
.
/
linux_server
0x02:Windows下配置IDA debug
菜单栏处:Debugger -> Run -> Remote Linux debugger
- Application:你要调试的应用程序的二进制文件的完整路径,包括程序。对于远程调试会话,该路径为调试服务器上的路径。如果选择不使用完整路径,远程服务器将搜索它的当前工作目录。
- Directory:对于远程调试,此字段表示远程目录。
- Parameters:用于指定在进程启动时传递给它的任何命令行参数。对于远程调试会话,进程输出将在用于启动调试服务器的控制台中显示。
- Hostname:远程调试服务器主机或IP地址。
- Port:远程调试服务器监听的TCP端口号。
- Password:远程调试服务器所需的密码。
1)Application
在Ubuntu中查看存放待调试ELF文件的路径
注意:Application是要调试的应用程序的二进制文件的完整路径,所以填的的时候要加上这个待调试ELF的文件名。
所以填入Application里的应该是:(hideandseek是我的待调试文件)
/home/user/workspace/IDA_ELF/hideandseek
2)Directory
输入存放待调试ELF文件的路径,不需要加上ELF文件了
/home/user/workspace/IDA_ELF
3)Parameters
不填
4)Hostname
Linux下打开终端,输ifconfig,查看IP
将这个IP填入Hostname中
192.168.254.131
端口是默认就是23946的,从第二张图就可以看出来
5)Password
填写Linux密码
6)综上
填好后按OK,IDA就会载入远程程序,就可以进行调试了。
0x03:
参考:IDA Pro权威指南
------------------------https://bbs.pediy.com/thread-247830-1.htm
设置好后,点击【OK】就启动了调试,看下调试界面:
布局和Ollydbg基本上是一样的,我们很容易找到熟悉的四个窗口。
调试指令
介绍一下常用的调试指令:
调试指令 说明
单步步入(F7) 执行下一条指令,若遇到函数,将进入函数代码内部,停在函数的第一条指令.
单步步过(F8) 执行下一条指令,若遇到函数,仅执行函数自身,不进入函数内部.
终止(CTRL-F2) 终止一个正在运行的调试进程.
继续(F9) 继续执行一个暂停的进程。执行将继续直到遇到一个断点、用户暂停或终止执行或该进程自行终止.
暂停( ) 暂停一个正在调试的进程.
运行至返回(CTRL-F7) 一直在函数代码内部运行,直到遇到RETN(或断点)时才停止.
断点
和Ollydbg一样,可以在选中的指令内存位置通过F2快捷键,设置软件断点。设置成功后,会以红色凸显(蓝色凸显的是将要执行的下一条指令)。可以通过【Debugger】-【Breakpoints】-【Breakpoint list】查看程序中当前已经设置的所有断点:
我们可以编辑我们设置的断点,在【Breakpoint list】中选中要编辑的断点,右键菜单选择【Edit…】即可打开编辑窗口:
在这个窗口中我们看以看到,通过【Condition】栏可以为断点设置条件,这样断点就转化成“条件断点”。在【Settings】中勾选【Hardware】后软件断点转化成“硬件断点”,这是【Hardware breakpoint mode】选项将会被激活,来设置硬件断点必须指定行为。
原文:https://blog.csdn.net/txx_683/article/details/53454139
IDA 动态调试 ELF 文件
01 IDA 远程调试配置
- Windows 下的 IDA
- 在 IDA 的安装目录/dbgsrc/找到 linux_server 和 linux_serverx64 拷贝到 linux 虚拟机中
- 在 linux 中运行 linux_server 并在 linux 中运行要调试的 demo
- Debugger -- Attach -- Remote Linux debbuger
- Linux 下的 IDA
配置方法和 Windows 相同
#!/bin/bash
cd /home/ubuntu/IDA/dbgsrv/ && ./linux_server & cd /home/ubuntu/re_tools/IDA/ && ./idaq
运行 ./demo
[Debugger] -> [Attach] -> [Remote Linux debugger]
02 IDA 动态调试
- 调试指令
单步步入(F7) | 遇到函数,将进入函数代码内部 |
单步步过(F8) | 执行下一条指令 |
运行到光标处(F4) | |
断点(F2) | 可以通过 [Debugger]-[Breakpoints]-[Breakpoint list] 查看断点,右键 [Edit] 可以设置断点 |
继续运行(F9) | |
终止(CTRL-F2) | 终止一个正在运行的调试进程 |
运行至返回(CTRL-F7) | 一直在函数代码内部运行,直到遇到RETN(或断点)时才停止. |
- 添加寄存器监视
[Debugger] -> [Debugger windows] -> [Watch view]
可以添加的类型有
(Object*)v0
(String)v0
(char*)v0
(int)v0
03 参考链接
http://blog.csdn.net/txx_683/article/details/53454139
http://www.freebuf.com/articles/system/67927.html
可能遇到的问题:
连接不上有一种原因是Linux防火墙开启:
centos从7开始默认用的是firewalld,这个是基于iptables的,虽然有iptables的核心,但是iptables的服务是没安装的。所以你只要停止firewalld服务即可:
sudo systemctl stop firewalld.service && sudo systemctl disable firewalld.service
如果你要改用iptables的话,需要安装iptables服务:
sudo yum install iptables-services
sudo systemctl enable iptables && sudo systemctl enable ip6tables
sudo systemctl start iptables && sudo systemctl start ip6tables
【问题】
Incompatible debugging server:
address size is 4 bytes, expected 4
【解决】
你的android_server 是32位的
而你启动的 ida 是64位的
换成32位的ida 就OK
=====================================
【问题】
adb shell ls /data/data/ 命令权限被拒绝
opendir failed, Permission denied
【解决】
adb不是最高权限启动的
先adb kill-server,然后 adb start-server
或者执行 adb root , adb remount
再测试,问题解决
=====================================
【问题】
The connection has been gracefully closed by peer.
Check that IDA is the only debugger for the target.
【解决】
除了IDA 还开启了其他的调试工具或开发工具比如 Android Studio 或 Eclipse,关闭其他即可。
=====================================
【问题】
adb shell am start -D -n (包名)/ (包名+类名)
......
adb forward tcp:17178 jdwp:16406
jdb -connect com.sun.jdi.SocketAttach:port=17178,hostname=localhost
当使用 jdb 调试时出现以下错误:
……
致命错误:
无法附加到目标 VM。
【解决】
有可能是因为 apk 忘记了修改 AndroidManifest.xml 里的 manifest -> application ->> android:debuggable="true" 导致的。
=====================================
【问题】
IDA 调试so 时遇到了
got SIGCHLD signal (Child status has changed) (exc.code 11, tid 3756)
等消息提示
【解决】
直接 pass to apptication... 就可以了 = =
=====================================
Warning
---------------------------
Timed out while waiting for a JWDP reply
---------------------------
OK
---------------------------
---------------------------
Warning
---------------------------
The debugger could not attach to the selected process.
This can perhaps indicate the process was just terminated, or that you don't have the necessary privileges.
---------------------------
OK
---------------------------
出现这种提示,说明你导入的Dex文件可能太大了,IDA解析不过来,用BackSmali把Dex导出,把无关的代码删除,再用 smali 重新打包成小的Dex文件,再进行调试就可以了
也有可能 是接线出现了问题,手机拔了重插。
=====================================
The function has undefined instruction/data at the specified address.
Your request has been put in the autoanalysis queue.
创建函数失败,用选择代码的方法,再按P,具体参看下面地址
http://bbs.pediy.com/archive/index.php?t-158896.html
=====================================
【问题】
The debugger could not attach to the selected process.
This can perhaps indicate the process was just terminated, or that you don't have the necessary privileges.
【解决】
1.不要用模拟器,用真机
2.换系统 ro.debugger = 1
3.换手机
原文:https://blog.csdn.net/deathmemory/article/details/51480799