Показано с 1 по 10 из 49
Комбинированный просмотр
-
13.04.2022, 08:04 #1
- Регистрация
- 18.04.2018
- Адрес
- HP-Compaq DX2300 microtower PC
- Сообщений
- 253
- Сказал(а) спасибо
- 69
- Поблагодарили 1815 раз(а) в 395 сообщениях
уни-патч для линукса и для макоси
UNI-patch для 64-bit линукса есть давно, называется 1C8_UP.exe (размер 30720 байт).
Но в случае с 64-bit бэкбейс.so после патча либа становится нерабочей.
Далее я объясню как внедрять UNI-patch в либу бэкбейс для 64-bit линукса и для макоси (она вроде только 64-bit) так, чтобы результат был рабочим, ну или, по крайней мере, чтобы патченная либа была основой для будущих репаков - сейчас в коде линуксовой либы не наблюдается поиск наличия патчей, как это сейчас делается в изделии для винды, но в будущем это вскоре появится и в линуксовых и в макосных изделиях.
Кроме уни-патча ещё очень необходим "правильный" делик-патч (deLIC-patch), но в этой теме я для краткости изложения про него не буду писать, а то букафф будет оч.много.
Что нам понадобится? виндовый 1с8_UP.exe (размер 30720 байт) и железнодорожная кувалда весом около 3кг.
1) Виндовый 1C8_UP.exe можно применить к линуксовой либе бэкбейс и узнать адрес HASP-API-EP - начиная с этого адреса 1C8_UP запишет 64-битный уни-патч размером 0x2A00, последний полезно сохранить в отдельном файле, назовем его up64.bin (в нем, скорее всего, будет дамп ключика для 0x64=100 клиентских лицензий), из него можно легко получить заготовки уни-патчей up05.bin, up10.bin, up20.bin, up50.bin для 5,10,20,50 к.л..
найдем начало блока "уни-патч-х64":
Код:$ hexdump -C 1c8_UP.exe | grep "51 53 52" 00002200 51 53 52 57 56 e8 88 13 00 00 00 00 00 00 00 00 |QSRWV...........|
Код:$ dd if=1c8_UP.exe of=up64.bin bs=1 skip=$((0x2200)) count=$((0x2A00)) conv=notrunc 10752+0 records in 10752+0 records out 10752 bytes (11 kB) copied, 0,0493868 s, 218 kB/s
Код:$ cp up64.bin up05.bin $ cp up64.bin up10.bin $ cp up64.bin up20.bin $ cp up64.bin up50.bin $ printf '\x05' | dd of=up05.bin bs=1 seek=$((0x11F8)) count=1 conv=notrunc $ printf '\x05' | dd of=up05.bin bs=1 seek=$((0x137E)) count=1 conv=notrunc $ printf '\x0A' | dd of=up10.bin bs=1 seek=$((0x11F8)) count=1 conv=notrunc $ printf '\x0A' | dd of=up10.bin bs=1 seek=$((0x137E)) count=1 conv=notrunc $ printf '\x14' | dd of=up20.bin bs=1 seek=$((0x11F8)) count=1 conv=notrunc $ printf '\x14' | dd of=up20.bin bs=1 seek=$((0x137E)) count=1 conv=notrunc $ printf '\x32' | dd of=up50.bin bs=1 seek=$((0x11F8)) count=1 conv=notrunc $ printf '\x32' | dd of=up50.bin bs=1 seek=$((0x137E)) count=1 conv=notrunc
2) найдем в файле backbas.so (или backbas.dylib) HASP_API64_EP поиском цепочки [41 81 78 08 6C 68 73 68]:
в MC (Midnight Commander) жмем кнопки на файле backbas.so (или backbas.dylib):
Shift+F3, F4, F7, искать "41 81 78 08 6C 68 73 68" (Hexadecimal)
смещение смотреть в правом верхнем углу (0x005B7DB5)
в backbas.so такая цепочка уникальна, в backbas.dylib их две, берите первую.
калькулятором вычисляем (в режиме Hexadecimal):
для Linux x64 вычитать 0х75: HASP_API64_EP = 5B7DB5 - 75 = 5B7D40 (значения для 20-1363.lnx64)
для MacOSX вычитать 0х4A: HASP_API64_EP = 58A23A - 4A = 58A1F0 (значения для 21-1140.macos)
3) запишем блок "уни-патч-х64" в файл либы бэкбейс:
место записи "уни-патч-х64" вычисляется на калькуляторе так: HASP_API64_EP - 0x2A00
т.е. надо записать уни-патч-х64 (его размер 0x2A00), сдвинув его к началу файла, так, чтобы не перезаписалась функция, которая начинается с точки HASP_API64_EP (её начало мы ниже подрихтуем)
для Linux x64 (пример для 20-1363.lnx64):
HASP_API64_EP - 2A00 = 5B7D40 - 2A00 = 5B5340
Код:$ dd if=up64.bin of=backbas.so bs=1 seek=$((0x5B5340)) count=$((0x2A00)) conv=notrunc 10752+0 records in 10752+0 records out 10752 bytes (11 kB) copied, 0,0334565 s, 321 kB/s
для MacOSX (пример для 21-1140.macos):
HASP_API64_EP - 2A00 = 58A1F0 - 2A00 = 5877F0
Код:$ dd if=up64.bin of=backbas.dylib.2 bs=1 seek=$((0x5877F0)) count=$((0x2A00)) conv=notrunc 10752+0 records in 10752+0 records out 10752 bytes (11 kB) copied, 0,0329808 s, 326 kB/s
4) СПОСОБЫ ПЕРЕДАЧИ АРГУМЕНТОВ ПРИ ВЫЗОВЕ ФУНКЦИЙ:
В Windows x64 метод передачи всех параметров немного похож на fastcall.
Первые 4 аргумента записываются в регистры RCX,RDX,R8,R9, а остальные — в стек.
Метод передачи аргументов в Linux x64 и в MacOSX почти такой же, как и в Windows, но используются 6 регистров (RDI,RSI,RDX,RCX,R8,R9) вместо 4.
Код уни-патча компилировался в Windows x64, а работать будет в Linux x64 и в MacOSX - 9 параметров для функции HASP_API64_EP оформляются в structure и передаются указателем на неё. Линуксовый и макосный код передает указатель в регистре RDI, а виндовый код уни-патча ожидает его в регистре RCX.
Вот так изменим начало фунции HASP_API64_EP (в Linux x64 и в MacOSX):
Код:57 push rdi 59 pop rcx т.е. значение регистра rdi записывается в регистр rcx E9 F9 D5 FF FF jmp в начало блока уни-патч-х64 т.е. jmp -10759
Код:$ printf '\x57\x59\xE9\xF9\xD5\xFF\xFF' | dd of=backbas.so bs=1 seek=$((0x5B7D40)) count=7 conv=notrunc 7+0 records in 7+0 records out 7 bytes (7 B) copied, 0,000178756 s, 39,2 kB/s
для MacOSX (пример для 21-1140.macos) запись по адресу HASP_API64_EP:
Код:$ printf '\x57\x59\xE9\xF9\xD5\xFF\xFF' | dd of=backbas.dylib bs=1 seek=$((0x58A1F0)) count=7 conv=notrunc 7+0 records in 7+0 records out 7 bytes (7 B) copied, 0,000166049 s, 42,2 kB/s
5) Код уни-патча скомпилирован так, что он не теряет работоспособность при изменении адреса его загрузки в память. Именно поэтому его можно перемещать в секции .text
А ещё код уни-патча использует свои локальные переменные и будет писать данные прямо в памяти своего кода.
Если не изменить аттрибуты памяти, в которой расположен код уни-патча, с R-X (можно читать и исполнять) на RWX (можно читать, писать и исполнять), то при первом же выполнении кода уни-патча произойдет крах - ОС прихлопнет процесс при попытке произвести запись в память, в которой это не допускается.
Осталось совсем чуть-чуть - надо изменить в заголовке либы backbas аттрибуты секции .text с R-X на RWX.
Чтобы понять "что, где и как будем менять в заголовке файла либы?" применим 010editor т.к. он научен понимать либы линукса и макоси. Можно обойтись без 010editor, главное - решить задачу "изменить аттрибуты секции .text с R-X на RWX".
для Linux x64 (пример для 20-1363.lnx64) запись по адресу 0x7С:
Код:$ printf '\x07' | dd of=backbas.so bs=1 seek=$((0x7С)) count=1 conv=notrunc 1+0 records in 1+0 records out 1 byte (1 B) copied, 0,00011292 s, 8,9 kB/s
для MacOSX (пример для 21-1140.macos) запись по адресу 0x5C:
Код:$ printf '\x07' | dd of=backbas.dylib bs=1 seek=$((0x5C)) count=1 conv=notrunc 1+0 records in 1+0 records out 1 byte (1 B) copied, 0,000161868 s, 6,2 kB/s
"кинжал хорош для того, у кого он есть, и плохо тому у кого он не окажется в нужное время"
-
11 пользователя(ей) сказали cпасибо:
asotel (11.06.2022), DontTrustMexD (24.04.2022), Ersain (21.01.2024), KennySP00 (18.05.2022), morbidsr (16.04.2022), Nekii (18.04.2022), noname1904 (09.09.2023), redhat2020 (04.05.2022), root7 (20.01.2024), Sova24 (05.02.2023), vovashulga (04.05.2022)
Похожие темы
-
как скачать файл с линукса на виртуальную машину
от dafniya в разделе LINUXОтветов: 1Последнее сообщение: 07.02.2012, 23:43 -
Патч для Warcraft III 1.26 rus
от GHoSt444 в разделе Игры (games)Ответов: 0Последнее сообщение: 30.06.2011, 18:18 -
Патч к AMS Enterprise 2.9
от kryak_er в разделе ПолезностиОтветов: 2Последнее сообщение: 09.06.2009, 23:06 -
Установка Линукса.
от Большой Брат в разделе LINUXОтветов: 18Последнее сообщение: 09.11.2007, 05:26
Социальные закладки