加密与解密 调试篇 静态分析技术 (二)重命名/数据转换/字符串/数组/结构体

目录

1.参考重命名

2.标签的用法

3.格式化指令操作数

4.代码和数据转换

 5.字符串

6.数组

7.结构体

1.创建结构体

结构体替换例子

可以通过一次操作完成全部工作

2.导入结构体


1.参考重命名

参考重命名是ida极好的一个功能

可以把反汇编清单的默认名称改为有意义的名称

增加可读性

单击 + N 即可打开

 这个 sub_401120没有什么意义

全部的 sub_401120都变为了 WndProc

2.标签的用法

Jump->Mark position  打开标记当前位置

 我们输入 WndProc

然后确定 然后我们离开这个函数地址的时候

Jump ->jump to mark position

就可以调回这个函数地址

 就会调回函数代码

3.格式化指令操作数

IDA可以格式化指令使用的常量

所以尽可能使用符号名称而不是数字

从而反汇编代码可以更有可读性

ida会对上下文、所使用的数据做出格式化决定

对于其他情况 ida会根据情况来格式化为一个十六进制数

 这里就出现了 二进制 十六进制 十进制的各个数值

大部分情况下

源代码中使用的已经命名的常量

例如 #define语句

IDA维护着大量的常见库(C标准库,Win32API)

右键->Use standard symbolic constant

 可以来设置常量

 这里我们能发现

 

 就是通过80000000 来识别函数的

4.代码和数据转换

很多为了对抗反汇编 

让反汇编无法正确识别数据和代码即可

数据字节可能会被错误识别为代码字节

IDA就存在交互性 可以让用户将某个十六进制数据指定为代码或者数据

通过手动来进行区分

首先 我们先确定十六进制数据是一段代码

然后只需要

选中第一个字节->Edit->Code/按C 即可

按p 可以把代码定义为子程序

按U 就可以取消定义

我们在代码行按D 就可以让数据在 db dd dw之间转换

Options->setup data types 可以显示更多的数据类型

 

 我们转换的时候会一直出现确定弹窗

我们关闭只需要在

Options->Misc->Convert already defined bytes

 按U

 就会发现一大堆未分类的子节

我们可以重新定义他们的类型

当然

在我们遇到为分类的子节

只需要

按 C 就可以反汇编

直到一个已经定义的项目/非法指令为止

 5.字符串

编写语言的不同 就会造成 支持的字符串格式的不同

例如 以 '0'结尾的C语言字符串
和以'$'结尾的DOS字符串

IDA支持所有格式的字符串

如果相信某一个十六进制是字符串

Edit->Strings->ASCII /按A

A默认是C语言字符串

Options->ASCII string style设置默认字符串

有的时候 IDA无法确定字符串

有可能是因为字符串在程序没有引用

 按a

 在Names窗口可以看见         Views->Open subviews-<Names

6.数组

IDA具有较强的数组聚合能力,可以把一串数据声明变成一行反汇编行

按数组的形式显示

从而提高可读性

 这里是一个数组 [] 就很明显

我们双击进入

能发现有点乱

Edit->Array /按*

 

 这里在 Items on a line 填写 0  就会自动调整

7.结构体

在C语言中

结构体是一个数据结构

可以把不同类型的数据结构组合到一个复合的数据类型中

结构体可以被声明为变量、指针或数组等

1.创建结构体

对于常见的文件类型 IDA会自动加载相应的类型库

例如 vc6win(Visual C++ 6.0)

在进行底层代码分析的时候

可以增加 mssdk(Windows.h)、ntddk(ntddk.h)等

这些类型库中具有相应的结构体

Shift+F11

可以打开加载类型库窗口(Loaded Type Libraries)

 如果我们要添加

右键->Load Type Library / 按 Insert

 这里就是IDA内置的结构体数据结构了

Views->Open subviews->Structures

打开结构体管理窗口

 然后按

Insert


 Add standard structure

 然后就可以添加我们的标准库

在默认的情况下 IDA会加载常用的结构

在结构体窗口按 Insert

就会显示程序内的的结构

对一个结构体双击 就会显示程序代码

 IDA会使用各种措施改善结构体代码的可读性

如果某一个程序正在使用结构体

而IDA不了解布局

那么就可以用户自定义结构体

并且放到反汇编代码清单中

结构体替换例子

#include <stdio.h> 

struct student
	{int id;
	char name[20];
	int age;
	};
struct student stu[2]={{01,"Mary",14},{02,"Angela",15}};
int main(void)
{
	struct student *p;
	for(p=stu;p<stu+2;p++)
		printf("%5d  %-20s%4d\n",p->id,p->name,p->age);
	return 0;
}

 我们双击进入 unk_407030

 使用 A/D

 可以进行定义

 然后我们打开数据结构窗口

我们 按Insert 增加 一个结构体类型"student"

 

 按D 加入数据然后修改为(按N) id 然后按A来设置结构

 最终

 然后我们可以把光标放在 00407030h处

 Edit->Structs->Struct var

 想同的

把0040704Ch的数据也变为student

 最后我们需要对重新操作的汇编进行操作

 例如这里的 esi+18h

Edit->Operand types ->Offset->Offset(Struct) /按T

 

 到这里我们就进行了替换结构体

即使我们的结构体的成员很多 也不需要每一个替换

IDA有批量处理的操作

可以通过一次操作完成全部工作

执行 Offset(Struct) /T

 

 这里就一下选中了所有 一次操作

IDA还可以在已经分析好的数据中建立结构体

Edit->Structs->Create struct from data

2.导入结构体

 从上面我们能发现 自己创建结构体 过于麻烦了

我们应该从C文件头 导入结构体才是最好的

我们能够积累自己建立的文件头 以后遇到直接快速导入即可

Load file ->Parse C header file

加载自定义的头文件

如果没有源代码 可以使用文本编辑器以C表示法定义一个结构体布局并且解析得到头文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值