IDA位段

设置位段

我们创建这个位段,以下是代码:

1
2
3
4
5
6
7
8
9
10
struct{
uint8_t isCatch : 1; // 1 if this represents a catch funclet, 0 otherwise
uint8_t isSeparated : 1; // 1 if this function has separated code segments, 0 otherwise
uint8_t BBT : 1; // Flags set by Basic Block Transformations
uint8_t UnwindMap : 1; // Existence of Unwind Map RVA
uint8_t TryBlockMap : 1; // Existence of Try Block Map RVA
uint8_t EHs : 1; // EHs flag set
uint8_t NoExcept : 1; // NoExcept flag set
uint8_t reserved : 1;
};

1721486694511

创建好位段以后,就是添加成员了

1721487133707

1721487213541

如果位段没有一个参数占好几个标志位,那么Mask段是可以填0的

这样就算定义好了

1721487351756

应用位段

我们初始化了一个位段:

1
struct Enum globalEnum = { 1, 0, 1, 0, 1, 0, 1, 0 }; // 初始化各个位段

1721487473767

IDA打开发现,并没有显示出位段的具体表示

1721487512773

点击选项中的Edit,选择Operand type ,再选择Enum member(在此之前记得Undefine一下数据,再设置位段)

1721487552203

选择我们刚刚定义的位段以后,应用后长这样

1721487666790

占位不止一个字节的位段表示

例如下面这个例子:

1
2
3
4
5
6
7
8
9
10
11
struct Enum2 {
uint8_t adjectives : 1;
uint8_t dispType : 1;
uint8_t dispCatchObj : 1;
uint8_t contIsRVA : 1;
uint8_t contAddr : 2; // 1. 00: contAddr_0
// 2. 01: contAddr_1
// 3. 10: contAddr_2
// 4. 11: contAddr_3
uint8_t remain : 2;
};

在这个位段中,contAddr占的比特位有两个,其中00,01,10,11分别代表不一样的参数,这个如何设置呢?

这就要提到之前我们说的MASK了

现在我们先标记出contAddr所占的比特位代表的十六进制,如下图,代表的十六进制就是0x30
1721531018966

所以contAddr这个位段的MASK就要填0x30

下面具体演示下:

1
2
3
4
5
6
7
8
9
10
11
12
13
struct Enum2 {
uint8_t adjectives : 1;
uint8_t dispType : 1;
uint8_t dispCatchObj : 1;
uint8_t contIsRVA : 1;
uint8_t contAddr : 2; // 1. 00: contAddr_0
// 2. 01: contAddr_1
// 3. 10: contAddr_2
// 4. 11: contAddr_3
uint8_t remain : 2;
};

struct Enum2 globalEnum2 = { 1,0,1,0,3,0 };

先填contAddr_0

1721531660047

然后再填contAddr_1

1721531799601

同理填上contAddr_2和contAddr_3

1721531870503

1721531853004

最终效果长这样,我们去测试一下

1721531889286

效果还是十分稳健的

1721531979076