Начинающий
- Статус
- Оффлайн
- Регистрация
- 24 Сен 2024
- Сообщения
- 58
- Реакции
- 16
Привет всем!
Столкнулся с проблемой при реверсе бинарника, скомпилированного моим кастомным компилятором (на базе .NET NativeAOT/ILCompiler). IDA Pro полностью игнорирует информацию о локальных переменных и параметрах для одной из функций, хотя в PDB, кажется, есть все необходимые данные.
При этом PDB, сгенерированный MSVC для простого C++-кода, IDA парсит без проблем и автоподставляет все имена и типы.
Вот дамп символов для проблемной функции из моего PDB (cvdump):
А вот как выглядит рабочий вариант от MSVC:
Кто-нибудь сталкивался с этим при генерации PDB и знает, что именно IDA может не нравиться? В чем ключевое отличие, которое я упускаю?
Генерируемый C++ код:
Мой код:
Столкнулся с проблемой при реверсе бинарника, скомпилированного моим кастомным компилятором (на базе .NET NativeAOT/ILCompiler). IDA Pro полностью игнорирует информацию о локальных переменных и параметрах для одной из функций, хотя в PDB, кажется, есть все необходимые данные.
При этом PDB, сгенерированный MSVC для простого C++-кода, IDA парсит без проблем и автоподставляет все имена и типы.
Вот дамп символов для проблемной функции из моего PDB (cvdump):
Код:
(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:
Код:
(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++ код:
Код:
; 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
Мой код:
Код:
; __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
Последнее редактирование: