все заметки

Fix patch pdb64.dll (IDA 8.3 Pro)

2025.01.11 (редактировано: 2025.01.15)
Обновление2025-01-14: Актуальность патча продеражалась 3 дня. Вылили полный пак 9.0-sp1 в паблик.

Продолжаем (завершаем) эту эпопею с большими PDB.

После выхода IDA 9.0 оказалось, что IDC с IDA 8.3 несовместимы, и править-подгонять эти файлы нет никакого желания. А изобретать очередной велосипед такое себе.
Да и BinDiff еще не совместим с новой версией.

Поэтому было принято волевое решение просто пофиксить баг.

Для тех кто не хочет разбирать то сразу к pdb64.dll.patch.txt.

А если интересно, то далее разбор патча.

Да, фикс неполный и есть некоторый косяк, очень много failed to add constant и could not convert type info, но основное импортируется без проблем.

1. Размер файла

Количество блоков умноженное на размер блока не должно превышать 32 бита = 0xFFFFFFFF (4294967295).
Эта проверка в новой версии выпилена.

0x432F3  33D2          xor   edx, edx\n0x432F5  B8FFFFFFFF    mov   eax, 0xffffffff\n0x432FA  41F7F1        div   r9d\n0x432FD  3BC8          cmp   ecx, eax\n0x432FF  0F87A6020000  ja    0x16c141ab

Для красоты можно обнулить JA (0f8700000000), но проблема в том, что для следующей правки нужны дополнительные байты. Поэтому NOP нам в помощь.

2. Разбор страниц

Меняем разрядность регистров 32-bit Extended Accumulator (EAX, ECX, EDX, etc) на 64-bit Re-Extended Accumulator (RAX, RCX, RDX, etc)

В некоторых местах есть REX префиксы, которые позволяют безболезненно менять разрядность, а в некоторых нет.

0x43305  418BD1        mov   edx, r9d ; REX\n0x43308  0FAFD1        imul  edx, ecx ; нет\n0x4330B  418D49FF      lea   ecx, [r9-0x1] ; REX\n0x4330F  03CA          add   ecx, edx ; нет\n0x43311  493B4F60      cmp   rcx, qword [r15+0x60] ; здесь уже RCX\n0x43315  0F8390020000  jae   0x16c141ab\n\n0x4331B  448BC2        mov   r8d, edx ; REX и r8 dword\n

У двух инструкций нет REX префикса, значит нужно дополнительно два байта. NOP'ы из предыдущего пункта позволяют увеличить байты и поднять инструкции.

Итого из двух пунктов:

0x432FF  90            nop\t \n0x43300  90            nop\t \n0x43301  90            nop\t \n0x43302  90            nop\t \n0x43303  498BD1        mov   rdx, r9\n0x43306  480FAFD1      imul  rdx, rcx\n0x4330A  498D49FF      lea   rcx, [r9-0x1]\n0x4330E  4803CA        add   rcx, rdx\n0x43311  493B4F60      cmp   rcx, qword [r15+0x60] ; без изменений\n0x43315  0F8390020000  jae   0x16c141ab ; без изменений\n\n0x4331B  4989D0        mov   r8, rdx\n

3. Разбор потоков

Так же из 32-bit в 64-bit.

0x43E43  0F87D8FEFFFF  ja    0x16c14921\n\n0x43E49  418BD2        mov   edx, r10d ; REX\n0x43E4C  0FAFD1        imul  edx, ecx ; нет\n0x43E4F  418D4AFF      lea   ecx, [r10-0x1] ; REX\n0x43E53  03CA          add   ecx, edx ; нет\n0x43E55  483B4E60      cmp   rcx, qword [rsi+0x60] ; REX\n0x43E59  0F83C2FEFFFF  jae   0x16c14921\n\n0x43E5F  8BCA          mov   ecx, edx ; нет\n

Все такое же как в пунктах 1 и 2. Те же NOP и REX. Только нужно три дополнительных байта.

Итого:

0x43E43  90            nop\t \n0x43E44  90            nop\t \n0x43E45  90            nop\t \n0x43E46  498BD2        mov   rdx, r10\n\n0x43E49  480FAFD1      imul  rdx, rcx\n0x43E4D  498D4AFF      lea   rcx, [r10-0x1]\n0x43E51  4803CA        add   rcx, rdx\n0x43E54  483B4E60      cmp   rcx, qword [rsi+0x60]\n0x43E58  0F83C3FEFFFF  jae   0x16c14921\n\n0x43E5E  488BCA        mov   rcx, rdx\n

4. Результат

fc.exe /b pdb64.dll pdb64-patch.dll > pdb64.dll.patch

Всего 46 байт которые не спасут мир, но точной сэкономят уйму времени, сил и нервов.

Это было занимательно и увлекательно.

ТЧК

еще по темам: ida, patch