静态分析

快捷键

操作 作用
空格键 在反汇编窗口中,进行列表视图与图形视图之间的切换
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.1 和 Port: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. 香橙派上的eMMC分区

    准备工作 OrangePi Plus 2E(自带16G的eMMC存储,出厂默认eMMC中附带了Android系统,用于测试板子功能) Ubuntu16.04的TF卡 第一张方式: 该方式可以按需删除指 ...

  2. 如果在循环中不改变vector的大小,C++编译器是否会将.size()优化为常数?

      在C++中,可以使用以下代码计算vector<int>中所有元素的和: vector<int> v = {1, 3, 7, 9}; sums = 0; for (int i ...

  3. Kafka-生产者性能调优

    (一)参数调优 参数调优相关代码 在实际的kafka开发中,我们会发现,无论是生产者还是消费者,都需要构建一个Properties对象,里面设置了很多参数.在这段代码中有很多常用的参数配置,在线上使用 ...

  4. python 不显示科学计数法

    pandas方法 import pandas as pd pd.set_option('display.float_format',lambda x : '%.3f' % x) 禁用科学计数法,小数保 ...

  5. react 新旧生命周期有什么区别?新增了哪些钩子?废弃了哪些钩子?为什么废弃?

    壹 ❀ 引 在日常面试中,若对于了解react的同学而言,多多少少会被问到生命周期相关的问题,比如大致阐述生命周期的运作流程,以及每个钩子函数大致的作用,而我在两位出去面试的同事那里了解到,他们都遇到 ...

  6. Spring Boot图书管理系统项目实战-3.用户登录

    导航: pre:  2.项目搭建 next:4.基础信息管理 只挑重点的讲,具体的请看项目源码. 1.项目源码 需要源码的朋友,请捐赠任意金额后留下邮箱发送:) 2.登录页设计 <!DOCTYP ...

  7. oracle中约束(constraints)是如何影响查询计划的

    原文: http://www.oracle.com/technetwork/issue-archive/2009/09-may/o39asktom-096149.html oracle中约束(cons ...

  8. IDA 反汇编 explorer

    之前写过一篇关于 IDA 在无 dmp 文件下如何定位到崩溃点的文章,由于其中涉及到公司项目,就仅限自己看了 正好今天看到一篇关于火绒软件误杀 explorer 的文章,并且有相关的复现过程 文章已经 ...

  9. 使用 MSYS2 编译 exe 可执行程序

    MSYS2 是一个在 Windows上 运行的软件环境,它提供了一种在 Windows 上使用 GNU 工具链的方式,包括 GCC 编译器和 GNU Make 构建系统. 在 MSYS2 中,你可以使 ...

  10. C++ 多线程的错误和如何避免(11)

    不要在对时间敏感的上下文中使用 .get() 先看下面的代码, #include "stdafx.h" #include <future> #include <i ...