Я поставл бряк на FindWindowA, после первого вызова идет test eax, eax и его я заменил на jmp на код после проверок. Потом нашел в HEX редакторе эти байты в DCU и пропатчил их там. Все просто как три рубля. А что сначала сам сделал, так это очень хорошо, так как у тебя больше не возникнет вопросов "как крякнуть компоненту".
Ms Rem спасибо что обьяснил! но мне всё равно не понятно: 1. Как ты узнал что бряк на FindWindowA нужно ставить? 2. Как ты всё это сделал? Ты установил компонент. Создал пустую форму. Вставил этот компонент на форму. а что дальше... или как? 3. test eax, eax ты как заменил. Можно это просто Hiew сделать?
я заменял 85c075136a00 и 85c074106a00 на 85c074136a00 и 85c075106a00 но у меня теперь при работе из делфи эта табличка выскакивает!
Ms Rem Там идёт так: 1. User32.FindWindowA call jmp je push push 2. User32.FindWindowA call test eax, eax je push push 3. User32.FindWindowA call test eax, eax jne push push push push 4. User32.MessageBoxA я в 2 и 3 менял: je поменял на jne,а jne на je а ты где менял?
h2o учите матчасть (assembler) взлом программы заключается не в том чтобы что- то на что - то поменять а в том чтобы понять как это работает и изменить это поведение осмысленно , а не как обезьяна если сам понять не можешь , запости листинг из дизассемблера и тебе пояснят что и где происходит
дак в W32DASM этого не сделать! от туда код не скопировать З.Ы. Говорили мне преподы в колледже "учи асм, и да будет тебе щастье потом", дак не верил, упирался, теперь понимаю что зря. вот и прошу чтобы мне пояснили на примере этого компонента, т.к. компонентов от этого производителя много и хокаются они все одинаково... остальные хоть сам взломаю!
h2o сделай в wdasm сохранение файла () оттуда и вырежи тот участок в крайнем случае screenshot сделай а вообще пользуйся ida, хотя wdasm и быстрее для простых вещей типа этой даю наводку :подумай над логикой процесса findwindow ищет окно дельфи и если его нет то выдаёт User32.MessageBoxA так как ты поменял перехоты на противоположные то теперь если это окно есть , то вызывается User32.MessageBoxA а тебе надо чтобы он вообще не вызывался скорее всего один из jamp'ов надо заменить на безусловный или просто вставить бузусловный переход обходящий всю проверку как верно указывал Ms Rem
Код (Text): * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004AAA96(U) | :004AAA90 C3 ret :004AAA91 E9FE93F5FF jmp 00403E94 //чё это? :004AAA96 EBF8 jmp 004AAA90 //чё это? :004AAA98 5D pop ebp :004AAA99 C3 ret :004AAA9A 8BC0 mov eax, eax //я думаю тут всё началось! :004AAA9C 832D883C4B0001 sub dword ptr [004B3C88], 00000001 :004AAAA3 7343 jnb 004AAAE8 //1 :004AAAA5 6A00 push 00000000 * Possible StringData Ref from Code Obj ->"TApplication" | :004AAAA7 68ECAA4A00 push 004AAAEC * Reference To: user32.FindWindowA, Ord:0000h | :004AAAAC E847C4F5FF Call 00406EF8 :004AAAB1 85C0 test eax, eax :004AAAB3 7420 je 004AAAD5 //2 :004AAAB5 6A00 push 00000000 * Possible StringData Ref from Code Obj ->"TPropertyInspector" | :004AAAB7 68FCAA4A00 push 004AAAFC * Reference To: user32.FindWindowA, Ord:0000h | :004AAABC E837C4F5FF Call 00406EF8 * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004AAA4B(C) | :004AAAC1 85C0 test eax, eax * Referenced by a (U)nconditional or (C)onditional Jump at Address: |:004AAA53(C) | :004AAAC3 7410 je 004AAAD5 //3 :004AAAC5 6A00 push 00000000 * Possible StringData Ref from Code Obj ->"TAppBuilder" | :004AAAC7 6810AB4A00 push 004AAB10 * Reference To: user32.FindWindowA, Ord:0000h | :004AAACC E827C4F5FF Call 00406EF8 :004AAAD1 85C0 test eax, eax :004AAAD3 7513 jne 004AAAE8 //4 * Referenced by a (U)nconditional or (C)onditional Jump at Addresses: |:004AAAB3(C), :004AAAC3(C) | :004AAAD5 6A00 push 00000000 * Possible StringData Ref from Code Obj ->"Info" | :004AAAD7 681CAB4A00 push 004AAB1C * Possible StringData Ref from Code Obj ->"Application uses trial version " ->"of TMS software components" | :004AAADC 6824AB4A00 push 004AAB24 :004AAAE1 6A00 push 00000000 * Reference To: user32.MessageBoxA, Ord:0000h
это мой ЕХЕ с этим компонентом! я менял 3 и 4!, причём по одиночке не работает! только если вместе. а точнее 3 нужно изменить с je на jne, а 3-вообще на любой (кроме jne). я менял 1,2,3,4, пробовал разные варианты... но работает только если 3 изменить jne, а остальные, хоть какие ставь(jne, je, jmp, nop). дак вот где тут правильно поправить нужно... после какого test eax, eax
Кстати, Degisy Controls лечатся тоже очень просто: правим 1 байт в файле DsCtrls.dcu и все (там перед текстом наг-скрина надо найти п-сть 75h 13h) и поменять ее на C3h C3h
h2o не пробовал включать в проект форму с названием класса TAppBuilder? unit AntiTrial; interface implementation uses windows; const WndClassName = 'TAppBuilder'; var HWindow: HWnd; WndClass: TWndClass; initialization fillchar(wndclass, sizeof(twndclass), #0); with WndClass do begin style := 0; lpFnWndProc := @DefWindowProc; cbClsExtra := 0; cbWndExtra := 0; hIcon := LoadIcon(0, idi_Application); hCursor := LoadCursor(0, idc_Arrow); hbrBackground := GetStockObject(white_Brush); lpszMenuName := ''; lpszClassName := WndClassName; end; wndclass.hInstance := Hinstance; if RegisterClass(WndClass) = 0 then Halt(255); HWindow := CreateWindowEx(0, WndClassName, 'Delphi 5 - AntiTrial', ws_OverlappedWindow, 0, 0, 0, 0, 0, 0, Hinstance, nil); finalization DestroyWindow(HWindow); UnRegisterClass(WndClassName, hinstance); end.
h2o Код (Text): :004AAA9A 8BC0 mov eax, eax //я думаю тут всё началось! :004AAA9C 832D883C4B0001 sub dword ptr [004B3C88], 00000001 :004AAAA3 7343 jnb 004AAAE8 //1 скорее всего тут надо поставить :004AAAA3 eb43 jmps 004AAAE8 // тогда будет обойдена вся проверка да и всё byte hack
staier ниже кода я написал: я менял 3 и 4!, причём по одиночке не работает! только если вместе. а точнее 3 нужно изменить с je на jne, а 3-вообще на любой (кроме jne). я менял 1,2,3,4, пробовал разные варианты... но работает только если 3 изменить jne, а остальные, хоть какие ставь(jne, je, jmp, nop). вот именно что по сути - 004AAAD3 7513 jne 004AAAE8 //4 и нужно менять... но работает токо если //3 и //4 поменять! А Ms Rem написал что он вообще процедуру обошёл, сделав выход в самом начале Напомню, он писал: после первого вызова идет test eax, eax и его я заменил на jmp на код после проверок. Дак а как это и где именно... 004AAA9A 8BC0 mov eax, eax //записали результат потом 004AAAAC E847C4F5FF Call 00406EF8 //вызвали что-то :004AAAB1 85C0 test eax, eax //проверили :004AAAB3 7420 je 004AAAD5 //2 //прыгнули тогда //2 надо! или я не так понял? А если //2 меняешь на любое (jne, je, jmp, nop), всё равно не работет.. фиг знает... Ms Rem Ну где же ты? Где там верный скачек?
Блин, такая простая программа и столько разговоров как ее ломать. Там всего то 2 байта надо пропатчить. Вот полный алгоритм взлома: 1) кинуть компонент на форму 2) скомпилить то что получилось 3) открыть прогу в отладчике OllyDbg 4) поставить бряк на FindWindowA 5) как бряк сработает, выйти из функции, и окажешся прямо на команде test eax, eax 4) найти последний jnz (перед ret) 5) вместо test eax, eax записать jmp на адрес взятый из jnz 6) радоваться жизни и учить ассемблер
h2o У тебя 2 перехода на 004AAAD5 = вызов MessageBox и 2 перехода в обход на 004AAAE8. Если вызов куска кода идет через 004AAA9A mov eax,eax то можно попробовать заменить первый переход на jmp. Если это не срабатывает, тогда железный вариант - заменить 004AAAD5 push 0 на jmp short 004AAAE8, т.е. перебить 6A00 на EB11, где 11 = 004AAAE8-004AAAD5-2
Вышла новая версия AdvToolBar 1.3.5, старое лекарство не помогает, кто-нибудь изобрел вакцину ? Желательно для организма Delphi 2005.