静态分析

快捷键

操作 作用
空格键 在反汇编窗口中,进行列表视图图形视图之间的切换
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. FastGateway 一个可以用于代替Nginx的网关

    在我本人研究Yarp的时候经常用于公司项目的业务网关代理,这时候就个大佬问我是否可以实现动态加载HTTPS证书?那时候我说不太可能实现,然而在某一天我看到 微软使用Yarp代替了Nginx吞吐量提升了 ...

  2. 2023年多校联训NOIP层测试4+洛谷 8 月月赛 I & RiOI Round 2

    2023年多校联训NOIP层测试4 爆零了 T1 幸运数字 \(0pts\) 首先考虑一个结论: \(4\) 的倍数一定满足最后两位能被 \(4\) 整除. 从 \(1\) 进行输入,方便处理.若枚举 ...

  3. JS 一篇文章弄懂Object.defineProperty,现学现用,来试试相关笔试题吧

    壹 ❀ 引 早在大半年前,掘金某位用户分享的面试题整理中有一题,简述let与const区别,你能自己模拟实现它们吗?,题目意思大概如此,时间久远我也很难找到那篇文章,当时看到此题对于const实现我的 ...

  4. NC14402 求最大值

    题目链接 题目 题目描述 给出一个序列,你的任务是求每次操作之后序列中 (a[j]-a[i])/(j-i)[1<=i<j<=n]的最大值. 操作次数有Q次,每次操作需要将位子p处的数 ...

  5. POJ1080 滑雪

    题目链接 题目 Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Mi ...

  6. 大数运算(BigInteger)与进制转换

    1 前言 Java 提供了 BigInteger(大整数)类和 BigDecimal(大浮点数)类用于大数运算,这两个类都继承自 Number 类(抽象类).由于 BigInteger 在大数运算中更 ...

  7. 【Android】使用Binder实现进程间通讯简单案例

    1 前言 使用AIDL实现进程间通讯简单案例 和 使用AIDL实现进程间传递对象案例 中介绍了使用 AIDL 进行进程间通讯,文中提到在编写完 aidl 文件(如:IMessageManager.ai ...

  8. 探秘SuperCLUE-Safety:为中文大模型打造的多轮对抗安全新框架

    探秘SuperCLUE-Safety:为中文大模型打造的多轮对抗安全新框架 进入2023年以来,ChatGPT的成功带动了国内大模型的快速发展,从通用大模型.垂直领域大模型到Agent智能体等多领域的 ...

  9. SpringCloud Config配置中心实战

    介绍 本文以理论结合实践编写,篇幅较长,各位看官保持耐心:),部分内容引用自网络. 什么是配置中心? 当微服务过多的时候,每个微服务的配置很难集中管理.SpringCloud Config通过git代 ...

  10. 《深入理解Java虚拟机》(四) 调优工具、指令

    目录 JVM 调优的概念 jps 1.options 功能选项 2.hostid jstat 1.vmid格式 2.interval 和 count 3.option jinfo jmap jhat ...