静态分析

快捷键

操作 作用
空格键 在反汇编窗口中,进行列表视图图形视图之间的切换
TAB 在反汇编窗口中,进行汇编指令伪代码之间的切换
Esc 和 Ctrl+Enter 翻页,返回前一页面
G 定位地址
X 交叉引用
N 重命名变量、函数名
Y 修改函数原型或者变量类型
";" 和 ":" 注释
* 把变量重定义为数组,包括在结构体视窗里也能对变量这么用
Shift + F12 打开字符串窗口,可用于字符串搜索
D 双击进变量之后,可以对变量的数据类型进行切换,db -> dw -> dd 可以设置
R 字符转换,如 '95' -> '_'
H 将字符 在十进制和十六进制之间进行转换
P 创建函数
Shift + s 快速创建结构体/相当于进入到 structures 窗口
... 全局搜索,视图保存,数组创建...

修复代码

结构体还原

分析

使用 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.1Port:23946,是否设为默认看自己

然后进去之后下好断点,点击顶部绿色的箭头即可开始调试

调试跟踪常用快捷键如下

快捷键 功能
F7 单步步进,跟进函数调用
F8 单步步过,不跟进函数调用
F4 运行到光标所在的行
Ctrl + F7 运行至当前函数的返回
F9 运行程序直至遇到断点
Ctrl+F2 终止当前正在运行的进程
F2 设置断点

调试so文件

咕咕,还没学

ida使用入门指北的更多相关文章

  1. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  2. Python 简单入门指北(一)

    Python 简单入门指北(一) Python 是一门非常容易上手的语言,通过查阅资料和教程,也许一晚上就能写出一个简单的爬虫.但 Python 也是一门很难精通的语言,因为简洁的语法背后隐藏了许多黑 ...

  3. 关于supervisor的入门指北

    关于supervisor的入门指北 在目前这个时间点(2017/07/25),supervisor还是仅支持python2,所以我们要用版本管理pyenv来隔离环境. pyenv 根据官方文档的讲解, ...

  4. Celery入门指北

    Celery入门指北 其实本文就是我看完Celery的官方文档指南的读书笔记.然后由于我的懒,只看完了那些入门指南,原文地址:First Steps with Celery,Next Steps,Us ...

  5. Angular 从入坑到挖坑 - Router 路由使用入门指北

    一.Overview Angular 入坑记录的笔记第五篇,因为一直在加班的缘故拖了有一个多月,主要是介绍在 Angular 中如何配置路由,完成重定向以及参数传递.至于路由守卫.路由懒加载等&quo ...

  6. [数据分析与可视化] Python绘制数据地图1-GeoPandas入门指北

    本文主要介绍GeoPandas的基本使用方法,以绘制简单的地图.GeoPandas是一个Python开源项目,旨在提供丰富而简单的地理空间数据处理接口.GeoPandas扩展了Pandas的数据类型, ...

  7. Electron入门指北

    最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...

  8. SourceGenerator入门指北

    SourceGenerator介绍 SourceGenerator于2020年4月29日在微软的.net blog首次介绍,大概说的是开发者编可以写分析器,在项目代码编译时,分析器分析项目既有的静态代 ...

  9. 后端API入门到放弃指北

    后端API入门学习指北 了解一下一下概念. RESTful API标准] 所有的API都遵循[RESTful API标准]. 建议大家都简单了解一下HTTP协议和RESTful API相关资料. 阮一 ...

  10. 关于Gevent的使用指北

    关于Gevent的使用指北 只是看了入门指南,和一个翻译文档.写一下个人读书心得. 其实看完之后,第一个反映就是asyncio这个系统库,感觉gevent现在所做的一些事情是与asyncio很像的,但 ...

随机推荐

  1. 7.3 通过API枚举进程

    首先实现枚举当前系统中所有进程信息,枚举该进程的核心点在于使用CreateToolhelp32Snapshot()函数,该函数用于创建系统进程和线程快照,它可以捕获当前系统中进程和线程相关的信息(如P ...

  2. Azure Data Factory(十二)传参调用 Azure Function

    一,引言 在实际的项目中,Azure Data Factroy 中的 Data Flow 并不能彻底帮我们完成一系列复制逻辑计算, 比如我们需要针对数据集的每一行数据进行判断计算,Data Flow ...

  3. 探索Web API SpeechSynthesis:给你的网页增添声音

    Web API SpeechSynthesis是一项强大的浏览器功能,它允许开发者将文本转换为语音,并通过浏览器播放出来.本文将深入探讨SpeechSynthesis的控制接口,包括其功能.用法和一个 ...

  4. Hive-安装和部署(Hive3.1.2)

    (一)安装前提 (1) 安装JDK1.8及以上版本 (2) 已经安装MySQL,推荐5.7. (3) 已经安装Hadoop. JDK.MySQL.Hadoop的安装,本文不再介绍. (二)安装Hive ...

  5. ABC 304

    T4 在一个平面上有一块面积无限的蛋糕,给出 \(n\) 颗草莓的所在位置和 \(a\,(b)\) 条平行与 \(x\,(y)\) 轴的切刀位置. 切刀会把蛋糕沿 \(x\,(y)\) 轴切开.因此一 ...

  6. Power BI 15 DAY

    业务(表结构)数据分析 1.业务理解 准确 全面 2.数据收集 了解需要用到的数据有哪些 5W2H 结构化数据 SQL.通过查询获取数据库资源 多源表结构数据 企业数据库数据 文本文件数据 Excel ...

  7. 数据抽取平台pydatax介绍

       缘起一:         公司现有数据仓库,是通过kettle从mysql抽取到目标库,运行多年,主要有以下问题, 1,效率低:kettle抽取行数少 2,容错性差:一个表抽取出错就导致后续计算 ...

  8. Spring Boot学生信息管理系统项目实战-3.专业管理

    1.获取源码 源码是捐赠方式获取,详细请QQ联系我 :) 2.实现效果 3.项目源码 只挑重点讲,详细请看源码. 专业管理实现学校专业的增删改查,与学院管理相关联. 前端代码 <!--编辑表单- ...

  9. ORACLE查询优化及gather_plan_statistics hint

    查询优化手段和gather_plan_statistics hint: 在10g以后我们可以通过利用gather_plan_statistics提示来了解更多的SQL执行统计信息,具体使用方法如下: ...

  10. QT 无法识别某些字体导致程序启动失败

    有用户反馈启动程序时,没有出现 UI 界面,程序跟 "闪退了一样",查看日志,没有发现闪退或者报错异常,后面远程用户电脑并尝试解决 研究分析:在用户电脑上运行 debug 包,会出 ...