Помогите снять привязку проги к­ CD

Тема в разделе "WASM.RESEARCH", создана пользователем Andrew_Hoox, 20 дек 2004.

  1. Andrew_Hoox

    Andrew_Hoox New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2004
    Сообщения:
    7
    Адрес:
    Russia
    Есть такая программа - "Тренажер". Нужна она тем, кто готовится сдавать экзамен по ПТБ (правила техники безопасности)в Мосэнерго, т.е. электрикам, их начальникам и т.д.. Эта прога привязана к CD, причем обязательно к последнему по счету, если сидюков несколько. Там она ищет базу данных (шифрованную). Необходимо сделать так, чтобы программа искала БД в своем каталоге или в корне диска С. Такой вариант, как эмулятор CD, не подходит. Потому, что эту прогу нужно поставить на работе, на дохленький комп (486DX2, 66 MHz), который и так еле-еле шевелится, там, блин, еще только эмулятора не хватает.

    Собственно, нужно мне, чтобы кто-нибудь из спецов подсказал - каким идти путем и какой нужен софт. Ну, в общем, нужна Ваша консультация.

    Первый этап я уже прошел: мне удалось распаковать этот экзешник (он был упакован ASProtect 1.23) с помощью stripper 2.07. Подскажите, что делать дальше - какой алгоритм работы.

    Очень надеюсь, что мне помогут - действительно очень нужно. Заранее спасибо.
     
  2. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Возможно IDA или OllyDbg + поиск ф-ций GetDriveType, SetCurrentDirectory ..., если есть - анализ кода возле них или аттач этих кусочков в форум
     
  3. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    какой обїем проги?
     
  4. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Еще могут использоваться GetDiskFreeSpace (сколько свободного места на CD - догадаться нетрудно) и GetVolumeInformation.
     
  5. Andrew_Hoox

    Andrew_Hoox New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2004
    Сообщения:
    7
    Адрес:
    Russia


    Объем самой проги 698 КБ. Всего образа диска 6,15 Мб.





    С помощью IDA нашел вызов ф-й GetDriveTypeA, GetDiskFreeSpaceA, GetLogicalDrives. Может там еще какая-нибудь проверка на CD-ROM (типа попытки создать файл), но я ее уже врядли найду.


    Код (Text):
    1. .text:00406E84 ; --------------- S U B R O U T I N E ---------------------------------------
    2. .text:00406E84
    3. .text:00406E84 ; Attributes: thunk
    4. .text:00406E84
    5. .text:00406E84 ; BOOL __stdcall GetDiskFreeSpaceA(LPCSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters)
    6. .text:00406E84 GetDiskFreeSpaceA proc near             ; CODE XREF: sub_409018+21p
    7. .text:00406E84                 jmp     ds:__imp_GetDiskFreeSpaceA
    8. .text:00406E84 GetDiskFreeSpaceA endp
    9. .text:00406E84
    10. .text:00406E84 ; ---------------------------------------------------------------------- -----
    11. .text:00406E8A                 align 4
    12. .text:00406E8C
    13. .text:00406E8C ; --------------- S U B R O U T I N E ---------------------------------------
    14. .text:00406E8C
    15. .text:00406E8C ; Attributes: noreturn thunk
    16. .text:00406E8C
    17. .text:00406E8C ; UINT __stdcall GetDriveTypeA(LPCSTR lpRootPathName)
    18. .text:00406E8C GetDriveTypeA   proc near               ; CODE XREF: .text:004994E2p
    19. .text:00406E8C                 jmp     ds:__imp_GetDriveTypeA
    20. .text:00406E8C GetDriveTypeA   endp
    21. .text:00406E8C
    22. .text:00406E8C ; ---------------------------------------------------------------------------
    23.  

    Код (Text):
    1. .text:00406EAC ; --------------- S U B R O U T I N E ---------------------------------------
    2. .text:00406EAC
    3. .text:00406EAC ; Attributes: thunk
    4. .text:00406EAC
    5. .text:00406EAC ; DWORD GetLogicalDrives(void)
    6. .text:00406EAC GetLogicalDrives proc near              ; CODE XREF: .text:0049949Ep
    7. .text:00406EAC                 jmp     ds:__imp_GetLogicalDrives ; Get bitmask representing
    8. .text:00406EAC GetLogicalDrives endp                   ; the currently available disk drives
    9. .text:00406EAC
    10. .text:00406EAC ; ---------------------------------------------------------------------------
    11.  
     
  6. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Можна бы даже стянуть посмотреть



    Или клацай на CODE XREF: sub_409018, от этого адреса нужен листинг на пару страничек вниз, тоже самое нужно от CODE XREF: .text:004994E2, посмотреть чё там делается.



    Или подкинуть базу на С:\, прогу в OllyDbg, в CommandLine (Alt+F1) поставить бряки (bpx GetDiskFreeSpaceA, bpx GetDriveTypeA), запустить (F9), должна останавливатся на этих ф-циях (нажать F8, чтобы выполнилась ф-ция), после GetDriveTypeA для С:\ в eax записать 5 (DRIVE_CDROM), после GetDiskFreeSpaceA проставить в буфере (адрес переменных в параметрах этой ф-ции) то, что должно быть для реального CD (кол-во секторов, байт) если проглотит, значит проверок больше нет. Посмотреть на условные переходы и пропатчить их, или заюзать лоадер Rustem'а (kerberos), там как раз был пример плугина для GetDriveType
     
  7. pas

    pas New Member

    Публикаций:
    0
    Регистрация:
    18 апр 2003
    Сообщения:
    330
    Адрес:
    Russia
    Andrew_Hoox

    Из текста не совсем понятно, она нужна в смысле это разработка МосЭнерго и они в обязательном порядке её всем втюхивают, типа не купил прогу - шансов сдать ноль, или просто нужна прога для тренинга?

    Если первое, то отвязка от CD не поможет, если второе написать свою не сложно, список вопросов по группам утверждается руководителем местного госэнергонадзора. И по идее должен быть доступен всем желающим, у нас так. И почему Мосэнерго? если предприятие командирует работников кудато, то на месте коммандировки проводится только инструктаж, а за соответствие присвоенных групп отвечает организация командировавшая персонал. Разве не так?
     
  8. shoo

    shoo New Member

    Публикаций:
    0
    Регистрация:
    17 июл 2003
    Сообщения:
    1.537
    Адрес:
    Ukraine
    у нас тоже такая лажа для экзаменов (я в укр энергетике работаю), только у нас база вроде акцесса, а к ней - экзешник, защита - нечто вроде хасп. но наши программеры ее не дают (что надежней хаспа ;)



    можно для простоты выписать условные переходы после call GetDiskFreeSpaceA и call GetDriveTypeA и попробовать их поменять на противоположные в RVA (только лучше поочередно) и позапускать.
     
  9. Andrew_Hoox

    Andrew_Hoox New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2004
    Сообщения:
    7
    Адрес:
    Russia
    pas wrote:





    Да, это разработка Мосэнерго, покупать ее необязательно, т.к. все эти данные есть в книгах (ПТБ, ПЭЭП, ПУЭ и т.д.). Наша фирма купила эту прогу потому, что в Мосэнерго на ней сдают экзамен. То есть сдать экзамен больше шансов, если не книжки учить наизусть, а погонять ту программу, на которой потом сдавать будешь. Написать свою можно, но это будет полная самодеятельность, которая у меня в фирме (да и в Мосэнерго) преследуется по закону. :) К тому же вопросы для экзаменов никем не утверждаются, просто к этой проге выпускают обновленную БД, а она, как писал выше, шифрованная. Вот и выходит, что программу нужно сломать, т.к. новый комп под нее никто не выделит, на старый нормально не поставишь, а электротехнический персонал ропщет - им то надо срочно.
     
  10. Andrew_Hoox

    Andrew_Hoox New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2004
    Сообщения:
    7
    Адрес:
    Russia
    bogrus

    Спасибо большое bogrus'у!!! Я разобрался в алгоритме проверки следуя Вашим рекомендациям. Сначала вызывается GetLogicalDrives и с помощью GetDriveTypeA проверяется каждый указанный в битовой маске диск на соответсвие является ли диск CD-ROM'ом, т.е. "cmp eax,5". После того, как я изменил битмаску на 00000101 (0х05) (т.е. в системе есть только два логических диска А и С), и в момент проверки диска С GetDriveType'ом установил eax в значение 5, то все замечательно заработало. Это значит, что никаких проверок больше нет. Только теперь я не представляю, как можно пропатчить екзешник. Может посоветуете что-нибудь.
     
  11. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Ну если сработало, то возможно и нет. Хотя странно, ты говорил "привязана к CD, причем обязательно к последнему по счету, если сидюков несколько", может она ещё метку тома сверяла ...



    Прицепи (в аттач) кусочек листинга до и после "cmp eax,5", хотя если после этого стоит JE (0x74), то можешь прям в олли попробовать заменить на JMP (0xEB), если ок то тот-же байт потом просто заменить в самом exe (любым Hex-редактором)

    Хотя подожди ... тогда может получится, что это стработает на A:\, лучше листинг посмотреть (если из IDA, то предварительно в options\general\number of opcode bytes поставить 10)
     
  12. Andrew_Hoox

    Andrew_Hoox New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2004
    Сообщения:
    7
    Адрес:
    Russia
    bogrus wrote:





    Все правильно, после проверки GetDriveType'ом всех логич. дисков в системе, прога останавливается на последнем, и если он CD-ROM, то загружает с него базу из каталога Simulator\Tables\. Я пробовал на своем компе поставить два CD-эмулятора (диски F и G), так вот, метка тома роли не играет (я ее менял - все работало), а с диска F прога не работает, только с G, т.е. с последнего.



    По поводу листинга:
    Код (Text):
    1. .text:0049949E
    2. .text:0049949E                               loc_49949E:                             ; CODE XREF: .text:0049931Fj
    3. .text:0049949E E8 09 DA F6 FF                                call    GetLogicalDrives
    4. .text:004994A3 8B F0                                         mov     esi, eax
    5. .text:004994A5 33 DB                                         xor     ebx, ebx
    6. .text:004994A7
    7. .text:004994A7                               loc_4994A7:                             ; CODE XREF: .text:00499505j
    8. .text:004994A7 8B CB                                         mov     ecx, ebx
    9. .text:004994A9 B8 01 00 00 00                                mov     eax, 1
    10. .text:004994AE D3 E0                                         shl     eax, cl
    11. .text:004994B0 23 C6                                         and     eax, esi
    12. .text:004994B2 F7 D8                                         neg     eax
    13. .text:004994B4 1B C0                                         sbb     eax, eax
    14. .text:004994B6 F7 D8                                         neg     eax
    15. .text:004994B8 3C 01                                         cmp     al, 1
    16. .text:004994BA 75 45                                         jnz     short loc_499501
    17. .text:004994BC 8D 45 F4                                      lea     eax, [ebp-0Ch]
    18. .text:004994BF 8B D3                                         mov     edx, ebx
    19. .text:004994C1 80 C2 41                                      add     dl, 41h
    20. .text:004994C4 E8 17 A8 F6 FF                                call    sub_403CE0
    21. .text:004994C9 8B 55 F4                                      mov     edx, [ebp-0Ch]
    22. .text:004994CC 8D 45 F8                                      lea     eax, [ebp-8]
    23. .text:004994CF B9 4C 97 49 00                                mov     ecx, offset dword_49974C
    24. .text:004994D4 E8 2B A9 F6 FF                                call    sub_403E04
    25. .text:004994D9 8B 45 F8                                      mov     eax, [ebp-8]
    26. .text:004994DC E8 9B AA F6 FF                                call    sub_403F7C
    27. .text:004994E1 50                                            push    eax
    28. .text:004994E2 E8 A5 D9 F6 FF                                call    GetDriveTypeA
    29. .text:004994E7 83 F8 05                                      cmp     eax, 5
    30. .text:004994EA 75 15                                         jnz     short loc_499501
    31. .text:004994EC 8B 45 FC                                      mov     eax, [ebp-4]
    32. .text:004994EF 05 28 02 00 00                                add     eax, 228h
    33. .text:004994F4 B9 58 97 49 00                                mov     ecx, offset aSimulatorTable ; "Simulator\\Tables\\"
    34. .text:004994F9 8B 55 F8                                      mov     edx, [ebp-8]
    35. .text:004994FC E8 03 A9 F6 FF                                call    sub_403E04
    36. .text:00499501
    37. .text:00499501                               loc_499501:                             ; CODE XREF: .text:004994BAj
    38.  


    Сравнение происходит по адресу 0х004994E7 (чтобы не пришлось искать).
     
  13. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    Если на машине будет А:\ и С:\ ( который с базой), то делаешь такую махинацию:
    Код (Text):
    1. ================================
    2. найти          ||    заменить на
    3. ================================
    4. 8BCB<font color="red]B801000000</font><!--color--> -> 8BCB<font color="red]6A01584E90</font><!--color-->
    5. 83F805<font color="red]75</font><!--color-->15     -> 83F805<font color="red]74</font><!--color-->15
    6. ================================
    Т.е. "mov eax,1" заменяем на "push 1, pop eax, dec esi, nop", а потом jnz на jz



    enjoy :)
     
  14. Andrew_Hoox

    Andrew_Hoox New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2004
    Сообщения:
    7
    Адрес:
    Russia
    ВСЕ МОИ МУЧЕНИЯ ЗАКОНЧИЛИСЬ! Всем огромное СПАСИБО!!! Вы мне действительно сильно помогли. Особое большое спасибо bogrus'у! Я пропатчил екзешник очень просто: нашел обычным hex-редактором (Hex Workshop) строку
    Код (Text):
    1. .text:004994E7 83 F8 05                                      cmp     eax, 5
    2.  
    Точнее сказать сам код 83 F8 05 (с помощью простого поиска). В этом файле оказалось несколько сочетаний такого кода. Я менял 05 на 03 в каждом таком сочетании, и пробовал, как работает прога (этот метод называется - метод тыка:) ). В итоге у меня получилось запустить прогу с последнего по счету жесткого диска. Меня этот результат вполне устраивает, т.к. на том компе, на котором будет стоять эта прога, только один жесткий диск - диск С.

    Еще раз - всем огромное спасибо!
     
  15. bogrus

    bogrus Active Member

    Публикаций:
    0
    Регистрация:
    24 окт 2003
    Сообщения:
    1.338
    Адрес:
    ukraine
    А-а-а внатуре :))), от я гоню, так же куда проще Ж)
     
  16. Andrew_Hoox

    Andrew_Hoox New Member

    Публикаций:
    0
    Регистрация:
    20 дек 2004
    Сообщения:
    7
    Адрес:
    Russia
    Все равно Вы мне очень помогли!