ida使用入门指北
静态分析
快捷键
| 操作 | 作用 |
|---|---|
| 空格键 | 在反汇编窗口中,进行列表视图与图形视图之间的切换 |
| TAB | 在反汇编窗口中,进行汇编指令与伪代码之间的切换 |
| Esc 和 Ctrl+Enter | 翻页,返回前一页面 |
| G | 定位地址 |
| X | 交叉引用 |
| N | 重命名变量、函数名 |
| Y | 修改函数原型或者变量类型 |
| ";" 和 ":" | 注释 |
| * | 把变量重定义为数组,包括在结构体视窗里也能对变量这么用 |
| Shift + F12 | 打开字符串窗口,可用于字符串搜索 |
| D | 双击进变量之后,可以对变量的数据类型进行切换,db -> dw -> dd 可以设置 |
| R | 字符转换,如 '95' -> '_' |
| H | 将字符 在十进制和十六进制之间进行转换 |
| P | 创建函数 |
| Shift + s | 快速创建结构体/相当于进入到 structures 窗口 |
| ... | 全局搜索,视图保存,数组创建... |
修复代码
修改函数返回值
数组修复
- 数组指针修复
- 数组数据修复
idb 快照、设置关键标记;ida 定义结构体、结构体指针数组,修复结构体(后面有详细的结构体还原讲解
结构体还原
分析
使用 ida 进行逆向分析的时候,一些逆向工程量较大的题目,我们是可以通过修复结构体来辅助我们的逆向工作的,什么意思?就是有些结构体 ida 会识别不出来,就会以 *(ptr+8), *(ptr+16) 等形式出现,这时我们可以定义一个结构体,然后指定这个 ptr 指针的某个位置比如 +8 的位置说是结构体的 int size 参数,ida 就会自动识别了
实践
写了个 demo,然后对他进行反编译看伪代码,来进行结构体的还原(demo 的源码放在后面

详细步骤如下:
先进入 Structures 视窗,按下键盘的 insert 键添加结构体

已经能看见详细的操作指引了
00000000 ; Ins/Del : create/delete structure
00000000 ; D/A/* : create structure member (data/ascii/array)
00000000 ; N : rename structure or structure member
00000000 ; U : delete structure member
单击结构体 ends 位置,按 D 增加结构体成员,单击结构体成员,按 D 能切换结构体成员类型,按 N 能对结构体成员重命名
这样我们的结构体就创建好了,回到我们的反汇编代码视窗

!或者直接右键变量,选择
Create new struct type...,使用C语法快速定义结构体,来替代上述步骤!
右键变量,选择设置变量类型

设置成刚刚创建的结构体指针类型
student *student1
然后对变量进行重命名为 student1
btw,像图片中倒数第二个 for 循环里的结构体指针数组可以怎样修复它呢?
*((unsigned int *)*(&students + i) + 13))
其实也是一样的,毕竟变量 students 就是个存指针的数组嘛,也是修改它的类型就好
student *students[]
一般来说如果他不是结构体指针数组,举个例,也可以修改成以下
void **ptr
char **ptr
......
最后修复完呈现出来的效果

demo源码
记得编译成 elf 文件,gcc test_struct.c -o test_struct
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Student
{
char name[50];
int age;
int student_id;
};
struct Student *student1;
struct Student *students[4];
int main()
{
student1 = (struct Student *)malloc(sizeof(struct Student));
strcpy(student1->name, "A");
student1->age = 1;
student1->student_id = 1111;
printf("Student Name: %s\n", student1->name);
printf("Student Age: %d\n", student1->age);
printf("Student ID: %d\n\n", student1->student_id);
students[0] = student1;
students[1] = (struct Student *)malloc(sizeof(struct Student));
strcpy(students[1]->name, "B");
students[1]->age = 2;
students[1]->student_id = 2222;
students[2] = (struct Student *)malloc(sizeof(struct Student));
strcpy(students[2]->name, "C");
students[2]->age = 3;
students[2]->student_id = 3333;
students[3] = (struct Student *)malloc(sizeof(struct Student));
strcpy(students[3]->name, "D");
students[3]->age = 4;
students[3]->student_id = 4444;
for (int i = 1; i < 4; i++)
{
printf("Student Name: %s\n", students[i]->name);
printf("Student Age: %d\n", students[i]->age);
printf("Student ID: %d\n\n", students[i]->student_id);
}
// 释放动态分配的内存
for (int i = 1; i < 4; i++)
{
free(students[i]);
}
return 0;
}
动态调试
调试exe
找到 IDA 所在文件夹目录下的 dbgsrv 文件夹进去,找到对应版本的win32_remote.exe 或者 win64_remote64.exe,根据程序位数双击运行相应的 remote.exe
IDA 里:Select a debugger --> Local Windows debugger
Debugger --> Process Options,第一项和第二项为目标调试的程序路径,第三项是它所在的目录,注意填 Hostname:127.0.0.1 和 Port:23946,是否设为默认看自己
然后进去之后下好断点,点击顶部绿色的箭头即可开始调试
调试跟踪常用快捷键如下
| 快捷键 | 功能 |
|---|---|
| F7 | 单步步进,跟进函数调用 |
| F8 | 单步步过,不跟进函数调用 |
| F4 | 运行到光标所在的行 |
| Ctrl + F7 | 运行至当前函数的返回 |
| F9 | 运行程序直至遇到断点 |
| Ctrl+F2 | 终止当前正在运行的进程 |
| F2 | 设置断点 |
调试so文件
咕咕,还没学
ida使用入门指北的更多相关文章
- Python 简单入门指北(二)
Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...
- Python 简单入门指北(一)
Python 简单入门指北(一) Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑 ...
- 关于supervisor的入门指北
关于supervisor的入门指北 在目前这个时间点(2017/07/25),supervisor还是仅支持python2,所以我们要用版本管理pyenv来隔离环境. pyenv 根据官方文档的讲解, ...
- Celery入门指北
Celery入门指北 其实本文就是我看完Celery的官方文档指南的读书笔记.然后由于我的懒,只看完了那些入门指南,原文地址:First Steps with Celery,Next Steps,Us ...
- Angular 从入坑到挖坑 - Router 路由使用入门指北
一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...
- [数据分析与可视化] Python绘制数据地图1-GeoPandas入门指北
本文主要介绍GeoPandas的基本使用方法,以绘制简单的地图.GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口.GeoPandas扩展了Pandas的数据类型, ...
- Electron入门指北
最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...
- SourceGenerator入门指北
SourceGenerator介绍 SourceGenerator于2020年4月29日在微软的.net blog首次介绍,大概说的是开发者编可以写分析器,在项目代码编译时,分析器分析项目既有的静态代 ...
- 后端API入门到放弃指北
后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一 ...
- 关于Gevent的使用指北
关于Gevent的使用指北 只是看了入门指南,和一个翻译文档.写一下个人读书心得. 其实看完之后,第一个反映就是asyncio这个系统库,感觉gevent现在所做的一些事情是与asyncio很像的,但 ...
随机推荐
- 7.3 通过API枚举进程
首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如P ...
- Azure Data Factory(十二)传参调用 Azure Function
一,引言 在实际的项目中,Azure Data Factroy 中的 Data Flow 并不能彻底帮我们完成一系列复制逻辑计算, 比如我们需要针对数据集的每一行数据进行判断计算,Data Flow ...
- 探索Web API SpeechSynthesis:给你的网页增添声音
Web API SpeechSynthesis是一项强大的浏览器功能,它允许开发者将文本转换为语音,并通过浏览器播放出来.本文将深入探讨SpeechSynthesis的控制接口,包括其功能.用法和一个 ...
- Hive-安装和部署(Hive3.1.2)
(一)安装前提 (1) 安装JDK1.8及以上版本 (2) 已经安装MySQL,推荐5.7. (3) 已经安装Hadoop. JDK.MySQL.Hadoop的安装,本文不再介绍. (二)安装Hive ...
- ABC 304
T4 在一个平面上有一块面积无限的蛋糕,给出 \(n\) 颗草莓的所在位置和 \(a\,(b)\) 条平行与 \(x\,(y)\) 轴的切刀位置. 切刀会把蛋糕沿 \(x\,(y)\) 轴切开.因此一 ...
- Power BI 15 DAY
业务(表结构)数据分析 1.业务理解 准确 全面 2.数据收集 了解需要用到的数据有哪些 5W2H 结构化数据 SQL.通过查询获取数据库资源 多源表结构数据 企业数据库数据 文本文件数据 Excel ...
- 数据抽取平台pydatax介绍
缘起一: 公司现有数据仓库,是通过kettle从mysql抽取到目标库,运行多年,主要有以下问题, 1,效率低:kettle抽取行数少 2,容错性差:一个表抽取出错就导致后续计算 ...
- Spring Boot学生信息管理系统项目实战-3.专业管理
1.获取源码 源码是捐赠方式获取,详细请QQ联系我 :) 2.实现效果 3.项目源码 只挑重点讲,详细请看源码. 专业管理实现学校专业的增删改查,与学院管理相关联. 前端代码 <!--编辑表单- ...
- ORACLE查询优化及gather_plan_statistics hint
查询优化手段和gather_plan_statistics hint: 在10g以后我们可以通过利用gather_plan_statistics提示来了解更多的SQL执行统计信息,具体使用方法如下: ...
- QT 无法识别某些字体导致程序启动失败
有用户反馈启动程序时,没有出现 UI 界面,程序跟 "闪退了一样",查看日志,没有发现闪退或者报错异常,后面远程用户电脑并尝试解决 研究分析:在用户电脑上运行 debug 包,会出 ...