IDA交叉引用快速识别基类的直接子类
判断构造函数
.text:0000000140001030 mov [rsp+arg_8], rdx
.text:0000000140001035 mov [rsp+arg_0], ecx
.text:0000000140001039 sub rsp, 48h
.text:000000014000103D lea rcx, [rsp+48h+var_10]
.text:0000000140001042 call sub_1400010E0
.text:0000000140001047 lea rcx, [rsp+48h+var_18]
.text:000000014000104C call sub_1400010B0
.text:0000000140001051 lea rcx, [rsp+48h+var_20]
.text:0000000140001056 call sub_140001110
.text:000000014000105B lea rcx, [rsp+48h+var_10]
.text:0000000140001060 call sub_140001000
.text:0000000140001065 lea rcx, [rsp+48h+var_18]
.text:000000014000106A call sub_140001000
.text:000000014000106F lea rcx, [rsp+48h+var_20]
.text:0000000140001074 call sub_140001000
.text:0000000140001079 mov [rsp+48h+var_28], 0
.text:0000000140001081 lea rcx, [rsp+48h+var_20]
.text:0000000140001086 call sub_1400011C0
.text:000000014000108B lea rcx, [rsp+48h+var_18]
.text:0000000140001090 call sub_140001160
.text:0000000140001095 lea rcx, [rsp+48h+var_10]
.text:000000014000109A call sub_140001190
.text:000000014000109F mov eax, [rsp+48h+var_28]
.text:00000001400010A3 add rsp, 48h
.text:00000001400010A7 retn
sub_1400010E0内部实现
.text:00000001400010E0 mov [rsp+arg_0], rcx
.text:00000001400010E5 sub rsp, 28h
.text:00000001400010E9 mov rcx, [rsp+28h+arg_0]
.text:00000001400010EE call sub_140001140
.text:00000001400010F3 mov rax, [rsp+28h+arg_0]
.text:00000001400010F8 lea rcx, ??_7Chinese@@6B@ ; const Chinese::`vftable'
.text:00000001400010FF mov [rax], rcx
.text:0000000140001102 mov rax, [rsp+28h+arg_0]
.text:0000000140001107 add rsp, 28h
.text:000000014000110B retn
sub_1400010E0是构造函数的必要条件
- sub_1400010E0的第一个参数是一个地址
- sub_1400010E0使用了这个地址,并把这个地址返回
- sub_1400010E0是这个var_10变量的第一次调用
sub_1400010E0是构造函数的充分条件
- sub_1400010E0 把 Chinese::`vftable'(虚表地址)赋值给首地址内存
充分必要条件满足,所以sub_1400010E0 是一个构造函数
sub_140001140内部实现
mov [rsp+arg_0], rcx
.text:0000000140001145 mov rax, [rsp+arg_0]
.text:000000014000114A lea rcx, ??_7Person@@6B@ ; const Person::`vftable'
.text:0000000140001151 mov [rax], rcx
.text:0000000140001154 mov rax, [rsp+arg_0]
.text:0000000140001159 retn
同样sub_140001140也是一个构造函数,但是它的this指针地址和sub_1400010E0一致,并且Person::`vftable'也赋值到了首地址内存,所以判断Person是Chinese的基类
那么如何判断Person的所有直接子类呢?可以使用IDA的交叉引用
判断直接子类
在基类Person的构造函数上右键,选择Xrefs graph to
从下面图中可以看到有三个方法都引用了Person的构造函数
在基类Person的构造函数上右键,选择 Jump to xref to operand 或者按x
对照前面的交叉引用图,查看下面列表中的函数,看看是否符合子类的构造函数特征,就能快速判断基类的子类了