Продолжаем (завершаем) эту эпопею с большими PDB.
После выхода IDA 9.0 оказалось, что IDC с IDA 8.3 несовместимы, и править-подгонять эти файлы нет никакого желания. А изобретать очередной велосипед такое себе.
Да и BinDiff еще не совместим с новой версией.
Поэтому было принято волевое решение просто пофиксить баг.
Для тех кто не хочет разбирать то сразу к pdb64.dll.patch.txt.
А если интересно, то далее разбор патча.
Да, фикс неполный и есть некоторый косяк, очень много failed to add constant
и could not convert type info
, но основное импортируется без проблем.
Количество блоков умноженное на размер блока не должно превышать 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 нам в помощь.
Меняем разрядность регистров 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
Так же из 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
fc.exe /b pdb64.dll pdb64-patch.dll > pdb64.dll.patch
Всего 46 байт которые не спасут мир, но точной сэкономят уйму времени, сил и нервов.
Это было занимательно и увлекательно.
ТЧК