Исследование iRadioLite 1.0.0.18 (build 18) Сабж ничем не пакован, поэтому сразу же загружаем его в ольку и думаем с чего начать... Поскольку программа имеет триал-ограничении 30 дней и при загрузке пишет строки о нашей незарегистрированности, то начнем исследовании с поиска часто встречающихся в триалах строк ("Search for -> All referenced text strings") "register" и поставим на их обращения бряки (F2). Вот что дожно выйти после проведенных манипуляций в окне бряков: Code: Address Module Active Disassembly 004067D31 Always PUSH 1.00456A88 0043DA581 Always PUSH 1.0045AD60 0043EA771 Always PUSH 1.0045AF38 Немного обкатав программу, замечаем, что последние 2 бряка срабатывают при самой загрузке выполняемого файла и открытии окна сведений "О программе". Содержание окна дизассемблированного кода на момент срабатывания 2 бряков таково: Code: 0043EA48 \. C2 0400 RETN 4 0043EA4B /. 55 PUSH EBP 0043EA4C |. 8BEC MOV EBP,ESP 0043EA4E |. 6A FF PUSH -1 0043EA50 |. 68 CD454400 PUSH 1.004445CD ; SE handler installation 0043EA55 |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 0043EA5B |. 50 PUSH EAX 0043EA5C |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP 0043EA63 |. 83EC 08 SUB ESP,8 0043EA66 |. 894D EC MOV DWORD PTR SS:[EBP-14],ECX 0043EA69 |. B9 44C94500 MOV ECX,1.0045C944 0043EA6E |. E8 E67CFCFF CALL 1.00406759 //!!! 0043EA73 |. 85C0 TEST EAX,EAX 0043EA75 |. 74 0F JE SHORT 1.0043EA86 0043EA77 |. 68 38AF4500 PUSH 1.0045AF38 ; ASCII "Unregistered" Code: 0043DA20 /. 55 PUSH EBP 0043DA21 |. 8BEC MOV EBP,ESP 0043DA23 |. 6A FF PUSH -1 0043DA25 |. 68 E4434400 PUSH 1.004443E4 ; SE handler installation 0043DA2A |. 64:A1 00000000 MOV EAX,DWORD PTR FS:[0] 0043DA30 |. 50 PUSH EAX 0043DA31 |. 64:8925 000000>MOV DWORD PTR FS:[0],ESP 0043DA38 |. 83EC 2C SUB ESP,2C 0043DA3B |. 894D E0 MOV DWORD PTR SS:[EBP-20],ECX 0043DA3E |. 8B4D E0 MOV ECX,DWORD PTR SS:[EBP-20] 0043DA41 |. E8 F21E0000 CALL <JMP.&MFC42.#4710> 0043DA46 |. B9 44C94500 MOV ECX,1.0045C944 0043DA4B |. E8 098DFCFF CALL 1.00406759 //!!! 0043DA50 |. 85C0 TEST EAX,EAX 0043DA52 |. 0F84 AC000000 JE 1.0043DB04 0043DA58 |. 68 60AD4500 PUSH 1.0045AD60 ; ASCII "**** UNREGISTERED VERSION ****" Сразу замечаем, что наги выдаются в результате сравнений результатов отработанной функции по адресу .00406759 : Code: 00406759 /$ 55 PUSH EBP 0040675A |. 8BEC MOV EBP,ESP 0040675C |. 51 PUSH ECX 0040675D |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX 00406760 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 00406763 |. 05 24030000 ADD EAX,324 00406768 |. 50 PUSH EAX 00406769 |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] 0040676C |. E8 43FBFFFF CALL 1.004062B4 00406771 F7D8 NEG EAX //!!! 00406773 1BC0 SBB EAX,EAX 00406775 40 INC EAX 00406776 |. 8BE5 MOV ESP,EBP 00406778 |. 5D POP EBP 00406779 \. C3 RETN Подфункция .004062B4 и отвечает за генерация валидного регномера и сравнение его с нами введенным\сохраненным в реестре. Чтобы функция всегда возвращала "верное" значение, нужно перед RETом просто очистить содержание регистра EAX (XOR EAX, EAX и 3 нопа) и в вызоваемой подфункции перепрыгнуть допонительную проверку и предотвратить очистку лицензии с реестра: Code: 0040677A /$ 55 PUSH EBP 0040677B |. 8BEC MOV EBP,ESP 0040677D |. 51 PUSH ECX 0040677E |. 894D FC MOV DWORD PTR SS:[EBP-4],ECX 00406781 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 00406784 |. 05 24030000 ADD EAX,324 00406789 |. 50 PUSH EAX 0040678A |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] 0040678D |. E8 22FBFFFF CALL 1.004062B4 00406792 |. 85C0 TEST EAX,EAX 00406794 74 04 JE SHORT 1.0040679A 00406796 |. 33C0 XOR EAX,EAX 00406798 |. EB 0D JMP SHORT 1.004067A7 0040679A |> 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] 0040679D |. E8 90F5FFFF CALL 1.00405D32 //обнуление регистрации 004067A2 |. 25 FF000000 AND EAX,0FF 004067A7 |> 8BE5 MOV ESP,EBP 004067A9 |. 5D POP EBP 004067AA \. C3 RETN 00406794 74 04 JE SHORT 1.0040679A на 00406794 90 90 NOP NOP программа теперь полностью функционально, если только не 1 подводный камень - модуль проверки CRC, не дающий пропатченной проге загружаться. Его адресс можно просмотреть в окне стека вызовов (ALt+K) на момент ошибки, либо по поиску подстроки "CRC Error" Code: 0043D719 0F85 83000000 JNZ 1.0043D7A2 ; CRC ERROR 0043D71F B9 01000000 MOV ECX,1 0043D724 |. 85C9 TEST ECX,ECX 0043D726 |. 74 0C JE SHORT 1.0043D734 0043D728 |. C785 D4FEFFFF >MOV DWORD PTR SS:[EBP-12C],0 0043D732 |. EB 13 JMP SHORT 1.0043D747 0043D734 |> 68 2CAD4500 PUSH 1.0045AD2C ; /Arg1 = 0045AD2C ASCII " ERROR: <CRadioGrabApp::isCrcValid> CRC error " 0043D739 |. E8 E2F2FEFF CALL 1.0042CA20 ; \1.0042CA20 Условный переход в нашем случае необходимо заменить на безусловный. И последним штрихом исследования будет красочная замена пустого вывода строки "Licensed to: " при загрузке на свой ник. 0043661A 68 28A24500 PUSH 1.0045A228 ; ASCII "Licensed to " Для этого вместо PUSH 0045A228 введем указатель на любую пустую ячейку памяти, которую после заполним своим ником. Я сделал так: PUSH 0045B908, а по адресу .0045B908 ввел (Binary->Edit) побайтово строку "Licensed to: ProTeuS" [BeginCRK]------------------------------------- Difference(s) between original.exe & cracked.exe original.exe 00006771: F7 33 00006772: D8 C0 00006773: 1B 90 00006774: C0 90 00006775: 40 90 00006794: 74 90 00006795: 04 90 0003661B: 28 08 0003661C: A2 B9 0003D719: 0F E9 0003D71A: 85 84 0003D71B: 83 00 0005B908: 00 4C 0005B909: 00 69 0005B90A: 00 63 0005B90B: 00 65 0005B90C: 00 6E 0005B90D: 00 73 0005B90E: 00 65 0005B90F: 00 64 0005B910: 00 20 0005B911: 00 74 0005B912: 00 6F 0005B913: 00 20 0005B914: 00 50 0005B915: 00 72 0005B916: 00 6F 0005B917: 00 54 0005B918: 00 65 0005B919: 00 75 0005B91A: 00 53 [EndCRK]------------------------------------- gl hf!
ыыы меня улыбнуло )) пошёл искать iRadioLite , и античат на первом месте ))) http://www.yandex.ru/yandsearch?rpt=rad&text=iRadioLite