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

对照前面的交叉引用图,查看下面列表中的函数,看看是否符合子类的构造函数特征,就能快速判断基类的子类了

posted @ 2022-04-08 23:26  乘舟凉  阅读(105)  评论(0编辑  收藏  举报