Есть такая программа - "Тренажер". Нужна она тем, кто готовится сдавать экзамен по ПТБ (правила техники безопасности)в Мосэнерго, т.е. электрикам, их начальникам и т.д.. Эта прога привязана к CD, причем обязательно к последнему по счету, если сидюков несколько. Там она ищет базу данных (шифрованную). Необходимо сделать так, чтобы программа искала БД в своем каталоге или в корне диска С. Такой вариант, как эмулятор CD, не подходит. Потому, что эту прогу нужно поставить на работе, на дохленький комп (486DX2, 66 MHz), который и так еле-еле шевелится, там, блин, еще только эмулятора не хватает. Собственно, нужно мне, чтобы кто-нибудь из спецов подсказал - каким идти путем и какой нужен софт. Ну, в общем, нужна Ваша консультация. Первый этап я уже прошел: мне удалось распаковать этот экзешник (он был упакован ASProtect 1.23) с помощью stripper 2.07. Подскажите, что делать дальше - какой алгоритм работы. Очень надеюсь, что мне помогут - действительно очень нужно. Заранее спасибо.
Возможно IDA или OllyDbg + поиск ф-ций GetDriveType, SetCurrentDirectory ..., если есть - анализ кода возле них или аттач этих кусочков в форум
Еще могут использоваться GetDiskFreeSpace (сколько свободного места на CD - догадаться нетрудно) и GetVolumeInformation.
Объем самой проги 698 КБ. Всего образа диска 6,15 Мб. С помощью IDA нашел вызов ф-й GetDriveTypeA, GetDiskFreeSpaceA, GetLogicalDrives. Может там еще какая-нибудь проверка на CD-ROM (типа попытки создать файл), но я ее уже врядли найду. Код (Text): .text:00406E84 ; --------------- S U B R O U T I N E --------------------------------------- .text:00406E84 .text:00406E84 ; Attributes: thunk .text:00406E84 .text:00406E84 ; BOOL __stdcall GetDiskFreeSpaceA(LPCSTR lpRootPathName,LPDWORD lpSectorsPerCluster,LPDWORD lpBytesPerSector,LPDWORD lpNumberOfFreeClusters,LPDWORD lpTotalNumberOfClusters) .text:00406E84 GetDiskFreeSpaceA proc near ; CODE XREF: sub_409018+21p .text:00406E84 jmp ds:__imp_GetDiskFreeSpaceA .text:00406E84 GetDiskFreeSpaceA endp .text:00406E84 .text:00406E84 ; ---------------------------------------------------------------------- ----- .text:00406E8A align 4 .text:00406E8C .text:00406E8C ; --------------- S U B R O U T I N E --------------------------------------- .text:00406E8C .text:00406E8C ; Attributes: noreturn thunk .text:00406E8C .text:00406E8C ; UINT __stdcall GetDriveTypeA(LPCSTR lpRootPathName) .text:00406E8C GetDriveTypeA proc near ; CODE XREF: .text:004994E2p .text:00406E8C jmp ds:__imp_GetDriveTypeA .text:00406E8C GetDriveTypeA endp .text:00406E8C .text:00406E8C ; --------------------------------------------------------------------------- Код (Text): .text:00406EAC ; --------------- S U B R O U T I N E --------------------------------------- .text:00406EAC .text:00406EAC ; Attributes: thunk .text:00406EAC .text:00406EAC ; DWORD GetLogicalDrives(void) .text:00406EAC GetLogicalDrives proc near ; CODE XREF: .text:0049949Ep .text:00406EAC jmp ds:__imp_GetLogicalDrives ; Get bitmask representing .text:00406EAC GetLogicalDrives endp ; the currently available disk drives .text:00406EAC .text:00406EAC ; ---------------------------------------------------------------------------
Можна бы даже стянуть посмотреть Или клацай на 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
Andrew_Hoox Из текста не совсем понятно, она нужна в смысле это разработка МосЭнерго и они в обязательном порядке её всем втюхивают, типа не купил прогу - шансов сдать ноль, или просто нужна прога для тренинга? Если первое, то отвязка от CD не поможет, если второе написать свою не сложно, список вопросов по группам утверждается руководителем местного госэнергонадзора. И по идее должен быть доступен всем желающим, у нас так. И почему Мосэнерго? если предприятие командирует работников кудато, то на месте коммандировки проводится только инструктаж, а за соответствие присвоенных групп отвечает организация командировавшая персонал. Разве не так?
у нас тоже такая лажа для экзаменов (я в укр энергетике работаю), только у нас база вроде акцесса, а к ней - экзешник, защита - нечто вроде хасп. но наши программеры ее не дают (что надежней хаспа можно для простоты выписать условные переходы после call GetDiskFreeSpaceA и call GetDriveTypeA и попробовать их поменять на противоположные в RVA (только лучше поочередно) и позапускать.
pas wrote: Да, это разработка Мосэнерго, покупать ее необязательно, т.к. все эти данные есть в книгах (ПТБ, ПЭЭП, ПУЭ и т.д.). Наша фирма купила эту прогу потому, что в Мосэнерго на ней сдают экзамен. То есть сдать экзамен больше шансов, если не книжки учить наизусть, а погонять ту программу, на которой потом сдавать будешь. Написать свою можно, но это будет полная самодеятельность, которая у меня в фирме (да и в Мосэнерго) преследуется по закону. К тому же вопросы для экзаменов никем не утверждаются, просто к этой проге выпускают обновленную БД, а она, как писал выше, шифрованная. Вот и выходит, что программу нужно сломать, т.к. новый комп под нее никто не выделит, на старый нормально не поставишь, а электротехнический персонал ропщет - им то надо срочно.
bogrus Спасибо большое bogrus'у!!! Я разобрался в алгоритме проверки следуя Вашим рекомендациям. Сначала вызывается GetLogicalDrives и с помощью GetDriveTypeA проверяется каждый указанный в битовой маске диск на соответсвие является ли диск CD-ROM'ом, т.е. "cmp eax,5". После того, как я изменил битмаску на 00000101 (0х05) (т.е. в системе есть только два логических диска А и С), и в момент проверки диска С GetDriveType'ом установил eax в значение 5, то все замечательно заработало. Это значит, что никаких проверок больше нет. Только теперь я не представляю, как можно пропатчить екзешник. Может посоветуете что-нибудь.
Ну если сработало, то возможно и нет. Хотя странно, ты говорил "привязана к CD, причем обязательно к последнему по счету, если сидюков несколько", может она ещё метку тома сверяла ... Прицепи (в аттач) кусочек листинга до и после "cmp eax,5", хотя если после этого стоит JE (0x74), то можешь прям в олли попробовать заменить на JMP (0xEB), если ок то тот-же байт потом просто заменить в самом exe (любым Hex-редактором) Хотя подожди ... тогда может получится, что это стработает на A:\, лучше листинг посмотреть (если из IDA, то предварительно в options\general\number of opcode bytes поставить 10)
bogrus wrote: Все правильно, после проверки GetDriveType'ом всех логич. дисков в системе, прога останавливается на последнем, и если он CD-ROM, то загружает с него базу из каталога Simulator\Tables\. Я пробовал на своем компе поставить два CD-эмулятора (диски F и G), так вот, метка тома роли не играет (я ее менял - все работало), а с диска F прога не работает, только с G, т.е. с последнего. По поводу листинга: Код (Text): .text:0049949E .text:0049949E loc_49949E: ; CODE XREF: .text:0049931Fj .text:0049949E E8 09 DA F6 FF call GetLogicalDrives .text:004994A3 8B F0 mov esi, eax .text:004994A5 33 DB xor ebx, ebx .text:004994A7 .text:004994A7 loc_4994A7: ; CODE XREF: .text:00499505j .text:004994A7 8B CB mov ecx, ebx .text:004994A9 B8 01 00 00 00 mov eax, 1 .text:004994AE D3 E0 shl eax, cl .text:004994B0 23 C6 and eax, esi .text:004994B2 F7 D8 neg eax .text:004994B4 1B C0 sbb eax, eax .text:004994B6 F7 D8 neg eax .text:004994B8 3C 01 cmp al, 1 .text:004994BA 75 45 jnz short loc_499501 .text:004994BC 8D 45 F4 lea eax, [ebp-0Ch] .text:004994BF 8B D3 mov edx, ebx .text:004994C1 80 C2 41 add dl, 41h .text:004994C4 E8 17 A8 F6 FF call sub_403CE0 .text:004994C9 8B 55 F4 mov edx, [ebp-0Ch] .text:004994CC 8D 45 F8 lea eax, [ebp-8] .text:004994CF B9 4C 97 49 00 mov ecx, offset dword_49974C .text:004994D4 E8 2B A9 F6 FF call sub_403E04 .text:004994D9 8B 45 F8 mov eax, [ebp-8] .text:004994DC E8 9B AA F6 FF call sub_403F7C .text:004994E1 50 push eax .text:004994E2 E8 A5 D9 F6 FF call GetDriveTypeA .text:004994E7 83 F8 05 cmp eax, 5 .text:004994EA 75 15 jnz short loc_499501 .text:004994EC 8B 45 FC mov eax, [ebp-4] .text:004994EF 05 28 02 00 00 add eax, 228h .text:004994F4 B9 58 97 49 00 mov ecx, offset aSimulatorTable ; "Simulator\\Tables\\" .text:004994F9 8B 55 F8 mov edx, [ebp-8] .text:004994FC E8 03 A9 F6 FF call sub_403E04 .text:00499501 .text:00499501 loc_499501: ; CODE XREF: .text:004994BAj Сравнение происходит по адресу 0х004994E7 (чтобы не пришлось искать).
Если на машине будет А:\ и С:\ ( который с базой), то делаешь такую махинацию: Код (Text): ================================ найти || заменить на ================================ 8BCB<font color="red]B801000000</font><!--color--> -> 8BCB<font color="red]6A01584E90</font><!--color--> 83F805<font color="red]75</font><!--color-->15 -> 83F805<font color="red]74</font><!--color-->15 ================================ Т.е. "mov eax,1" заменяем на "push 1, pop eax, dec esi, nop", а потом jnz на jz enjoy
ВСЕ МОИ МУЧЕНИЯ ЗАКОНЧИЛИСЬ! Всем огромное СПАСИБО!!! Вы мне действительно сильно помогли. Особое большое спасибо bogrus'у! Я пропатчил екзешник очень просто: нашел обычным hex-редактором (Hex Workshop) строку Код (Text): .text:004994E7 83 F8 05 cmp eax, 5 Точнее сказать сам код 83 F8 05 (с помощью простого поиска). В этом файле оказалось несколько сочетаний такого кода. Я менял 05 на 03 в каждом таком сочетании, и пробовал, как работает прога (этот метод называется - метод тыка ). В итоге у меня получилось запустить прогу с последнего по счету жесткого диска. Меня этот результат вполне устраивает, т.к. на том компе, на котором будет стоять эта прога, только один жесткий диск - диск С. Еще раз - всем огромное спасибо!