Вопрос Почему IDA Pro игнорирует локальные переменные в PDB, сгенерированном моим компилятором?

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
24 Сен 2024
Сообщения
58
Реакции
16
Привет всем!

Столкнулся с проблемой при реверсе бинарника, скомпилированного моим кастомным компилятором (на базе .NET NativeAOT/ILCompiler). IDA Pro полностью игнорирует информацию о локальных переменных и параметрах для одной из функций, хотя в PDB, кажется, есть все необходимые данные.
При этом PDB, сгенерированный MSVC для простого C++-кода, IDA парсит без проблем и автоподставляет все имена и типы.

Вот дамп символов для проблемной функции из моего PDB (cvdump):
Код:
Expand Collapse Copy
(158A94) S_GPROC32: [0002:0012B700], Cb: 00000025, Type:             0x4E6E, repro_Xray_Program__PrintClass
         Parent: 00000000, End: 00158B14, Next: 00000000
         Debug start: 00000000, Debug end: 00000025

(158ADC)  S_LOCAL: Param: 00004E6C, person
(158AF0)  S_DEFRANGE_REGISTER: rcx
    Range: [0002:0012B700] - [0002:0012B70F], 0 Gaps
(158B00)  S_DEFRANGE_REGISTER_REL: [rbp +  0010 ]
    Range: [0002:0012B70F] - [0002:0012B71E], 0 Gaps

(158B14) S_END

А вот как выглядит рабочий вариант от MSVC:

Код:
Expand Collapse Copy
(0009D0) S_GPROC32: [0001:00000230], Cb: 0000000F, Type:             0x2B3C, PrintClass
         Parent: 00000000, End: 00000A6C, Next: 00000000
         Debug start: 00000000, Debug end: 0000000A
         Flags: Do Not Inline, Optimized Debug Info

(000A04)  S_LOCAL: Param: 00002A75, person
(000A18)  S_DEFRANGE_REGISTER: rcx
    Range: [0001:00000230] - [0001:0000023A], 0 Gaps
(000A28)  S_CALLEES: Count: 1
                       0x132C (0)
(000A34)  S_FRAMEPROC:
          Frame size = 0x00000000 bytes
          Pad size = 0x00000000 bytes
          Offset of pad in frame = 0x00000000
          Size of callee save registers = 0x00000000
          Address of exception handler = 0000:00000000
          Function info: invalid_pgo_counts opt_for_speed Local=rsp Param=rsp (0x00114000)
(000A54)  S_REGREL32: rsp+00000008, Type:             0x2A75, person

(000A6C) S_END

Кто-нибудь сталкивался с этим при генерации PDB и знает, что именно IDA может не нравиться? В чем ключевое отличие, которое я упускаю?

Генерируемый C++ код:

Код:
Expand Collapse Copy
; void __fastcall PrintClass(Person *person)
?PrintClass@@YAXPEAVPerson@@@Z proc near
person = rcx
mov     edx, [person+4]
lea     person, _Format ; "%d"
jmp     printf
?PrintClass@@YAXPEAVPerson@@@Z endp

Мой код:

Код:
Expand Collapse Copy
; __int64 __fastcall repro_Xray_Program__PrintClass(__int64)
repro_Xray_Program__PrintClass proc near

var_8= byte ptr -8

push    rbp
push    rdi
sub     rsp, 28h
lea     rbp, [rsp+38h+var_8]
mov     [rbp+10h], rcx
nop
mov     rax, [rbp+10h]
mov     ecx, [rax+14h]
call    System_Console_System_Console__WriteLine_7
nop
nop
add     rsp, 28h
pop     rdi
pop     rbp
retn
repro_Xray_Program__PrintClass endp
 
Последнее редактирование:
Привет всем!

Столкнулся с проблемой при реверсе бинарника, скомпилированного моим кастомным компилятором (на базе .NET NativeAOT/ILCompiler). IDA Pro полностью игнорирует информацию о локальных переменных и параметрах для одной из функций, хотя в PDB, кажется, есть все необходимые данные.
При этом PDB, сгенерированный MSVC для простого C++-кода, IDA парсит без проблем и автоподставляет все имена и типы.

Вот дамп символов для проблемной функции из моего PDB (cvdump):
Код:
Expand Collapse Copy
(158A94) S_GPROC32: [0002:0012B700], Cb: 00000025, Type:             0x4E6E, repro_Xray_Program__PrintClass
         Parent: 00000000, End: 00158B14, Next: 00000000
         Debug start: 00000000, Debug end: 00000025

(158ADC)  S_LOCAL: Param: 00004E6C, person
(158AF0)  S_DEFRANGE_REGISTER: rcx
    Range: [0002:0012B700] - [0002:0012B70F], 0 Gaps
(158B00)  S_DEFRANGE_REGISTER_REL: [rbp +  0010 ]
    Range: [0002:0012B70F] - [0002:0012B71E], 0 Gaps

(158B14) S_END

А вот как выглядит рабочий вариант от MSVC:

Код:
Expand Collapse Copy
(0009D0) S_GPROC32: [0001:00000230], Cb: 0000000F, Type:             0x2B3C, PrintClass
         Parent: 00000000, End: 00000A6C, Next: 00000000
         Debug start: 00000000, Debug end: 0000000A
         Flags: Do Not Inline, Optimized Debug Info

(000A04)  S_LOCAL: Param: 00002A75, person
(000A18)  S_DEFRANGE_REGISTER: rcx
    Range: [0001:00000230] - [0001:0000023A], 0 Gaps
(000A28)  S_CALLEES: Count: 1
                       0x132C (0)
(000A34)  S_FRAMEPROC:
          Frame size = 0x00000000 bytes
          Pad size = 0x00000000 bytes
          Offset of pad in frame = 0x00000000
          Size of callee save registers = 0x00000000
          Address of exception handler = 0000:00000000
          Function info: invalid_pgo_counts opt_for_speed Local=rsp Param=rsp (0x00114000)
(000A54)  S_REGREL32: rsp+00000008, Type:             0x2A75, person

(000A6C) S_END

Кто-нибудь сталкивался с этим при генерации PDB и знает, что именно IDA может не нравиться? В чем ключевое отличие, которое я упускаю?

Генерируемый C++ код:

Код:
Expand Collapse Copy
; void __fastcall PrintClass(Person *person)
?PrintClass@@YAXPEAVPerson@@@Z proc near
person = rcx
mov     edx, [person+4]
lea     person, _Format ; "%d"
jmp     printf
?PrintClass@@YAXPEAVPerson@@@Z endp

Мой код:

Код:
Expand Collapse Copy
; __int64 __fastcall repro_Xray_Program__PrintClass(__int64)
repro_Xray_Program__PrintClass proc near

var_8= byte ptr -8

push    rbp
push    rdi
sub     rsp, 28h
lea     rbp, [rsp+38h+var_8]
mov     [rbp+10h], rcx
nop
mov     rax, [rbp+10h]
mov     ecx, [rax+14h]
call    System_Console_System_Console__WriteLine_7
nop
nop
add     rsp, 28h
pop     rdi
pop     rbp
retn
repro_Xray_Program__PrintClass endp
1. отсутствие S_FRAMEPROC и S_REGREL32(ида их очень любит и без них игнорирует параметры)
2. нужно доработать генерацию PDB в твоем компиляторе чтобы добавлять эти секции

PS. эти секции описывают структуру стека и явно привязывают параметры к конкретным смещениям благодаря чему ида их корректно подхватывает
 
Назад
Сверху Снизу