Исследование iRadioLite 1.0.0.18 (build 18)
Сабж ничем не пакован, поэтому сразу же загружаем его в ольку и думаем с чего начать...
Поскольку программа имеет триал-ограничении 30 дней и при загрузке пишет строки о нашей незарегистрированности, то начнем исследовании с поиска часто встречающихся в триалах строк ("Search for -> All referenced text strings") "register" и поставим на их обращения бряки (F2). Вот что дожно выйти после проведенных манипуляций в окне бряков:
Немного обкатав программу, замечаем, что последние 2 бряка срабатывают при самой загрузке выполняемого файла и открытии окна сведений "О программе".
Содержание окна дизассемблированного кода на момент срабатывания 2 бряков таково:
Сразу замечаем, что наги выдаются в результате сравнений результатов отработанной функции по адресу .00406759 :
Подфункция .004062B4 и отвечает за генерация валидного регномера и сравнение его с нами введенным\сохраненным в реестре. Чтобы функция всегда возвращала "верное" значение, нужно перед RETом просто очистить содержание регистра EAX (XOR EAX, EAX и 3 нопа) и в вызоваемой подфункции перепрыгнуть допонительную проверку и предотвратить очистку лицензии с реестра:
00406794 74 04 JE SHORT 1.0040679A
на
00406794 90 90 NOP NOP
программа теперь полностью функционально, если только не 1 подводный камень - модуль проверки CRC, не дающий пропатченной проге загружаться. Его адресс можно просмотреть в окне стека вызовов (ALt+K) на момент ошибки, либо по поиску подстроки "CRC Error"
Условный переход в нашем случае необходимо заменить на безусловный.
И последним штрихом исследования будет красочная замена пустого вывода строки "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!
Сабж ничем не пакован, поэтому сразу же загружаем его в ольку и думаем с чего начать...
Поскольку программа имеет триал-ограничении 30 дней и при загрузке пишет строки о нашей незарегистрированности, то начнем исследовании с поиска часто встречающихся в триалах строк ("Search for -> All referenced text strings") "register" и поставим на их обращения бряки (F2). Вот что дожно выйти после проведенных манипуляций в окне бряков:
Код:
Address Module Active Disassembly
004067D31 Always PUSH 1.00456A88
0043DA581 Always PUSH 1.0045AD60
0043EA771 Always PUSH 1.0045AF38
Немного обкатав программу, замечаем, что последние 2 бряка срабатывают при самой загрузке выполняемого файла и открытии окна сведений "О программе".
Содержание окна дизассемблированного кода на момент срабатывания 2 бряков таково:
Код:
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"
Код:
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 :
Код:
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 нопа) и в вызоваемой подфункции перепрыгнуть допонительную проверку и предотвратить очистку лицензии с реестра:
Код:
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"
Код:
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!