Посл.ответ |
Сообщение |
Ранг: 95.5 (постоянный), 36thx Активность: 0.08↘0.04 Статус: Участник
|
Создано: 27 декабря 2006 07:50 · Личное сообщение · #1
Что можно исправить в проседуре Form1.Close чтобы эта процедура не работала
я скомпилировал в D7 прогу которая при нажатии на кнопку закрывается, пробовал
править Call который закрывает форму и вылетает ошибка.
может просто обойти вызов Close?
Меня вообще интересует как можно обойти эту процедуру или
прыгнуть без возврата в какую-нибудь другую процедуру?
Какие-нибудь варианты есть?
Подскажите пожалуйста.
С Уважением Rio. 349c_27.12.2006_CRACKLAB.rU.tgz - Close.rar
| Сообщение посчитали полезным: |
|
Ранг: 301.4 (мудрец), 194thx Активность: 0.17↘0.01 Статус: Участник
|
Создано: 27 декабря 2006 07:55 · Личное сообщение · #2
Архив то кривой
| Сообщение посчитали полезным: |
Ранг: 95.5 (постоянный), 36thx Активность: 0.08↘0.04 Статус: Участник
|
Создано: 27 декабря 2006 08:50 · Личное сообщение · #3
Пробовал прикрепить, не идёт.
Вот ссылка tambovstroy.narod.ru/Close.7z
| Сообщение посчитали полезным: |
Ранг: 53.0 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 27 декабря 2006 09:34 · Личное сообщение · #4
PROCEDURE TForm1.FormCloseQuery(Sender: TObject; VAR CanClose: Boolean);
BEGIN
ShowMessage('Хрен закроешь');
CanClose := False;
END;
| Сообщение посчитали полезным: |
Ранг: 95.5 (постоянный), 36thx Активность: 0.08↘0.04 Статус: Участник
|
Создано: 27 декабря 2006 09:41 · Личное сообщение · #5
Спасибо, но я не совсем это имел ввиду, а
в дизассемблированном виде что нужно исправить?
00446386 . 54 43 6C 6F 73>ASCII "TCloseQueryEvent"
00446396 00 DB 00
00446397 02 DB 02
00446398 08 DB 08
00446399 . 06 DB 06
0044639A . 53 65 6E 64 65>ASCII "Sender"
004463A0 . 07 DB 07
004463A1 . 54 4F 62 6A 65>ASCII "TObject"
004463A8 01 DB 01
004463A9 . 08 DB 08
004463AA . 43 61 6E 43 6C>ASCII "CanClose"
004463B2 . 07 DB 07 //Здесь?
004463B3 . 42 6F 6F 6C 65>ASCII "Boolean"
004463BA 00 DB 00
004463BB . F4104000 DD 2.004010F4
004463BF . 00104000 DD 2.00401000
| Сообщение посчитали полезным: |
Ранг: 53.0 (постоянный) Активность: 0.05↘0 Статус: Участник
|
Создано: 27 декабря 2006 09:48 · Личное сообщение · #6
Тады ой...
не пробовал.
| Сообщение посчитали полезным: |
Ранг: 0.3 (гость) Активность: 0=0 Статус: Участник
|
Создано: 27 декабря 2006 11:21 · Поправил: Max_ASM · Личное сообщение · #7
Берём SourceRescuerи восстанавливаем проект в делфях, далее смотрим адрес процедуры, выполняющейся при нажатии на кнопку 1:
procedure TForm1.Button1Click(Sender: TObject);
begin
// Address $452160
end;
Берём OllyDbg, загружаем туда наш файл, ищем адрес 452160, смотрим:
0045215E 8BC0 MOV EAX,EAX
00452160 . 53 PUSH EBX
00452161 . 8BD8 MOV EBX,EAX
00452163 . B8 88214500 MOV EAX,1.00452188 ; ASCII "Close1"
00452168 . E8 F751FDFF CALL 1.00427364 ; Сообщение о закрытии
0045216D . 8BC3 MOV EAX,EBX
0045216F E8 30B2FFFF CALL 1.0044D3A4 ; Непосредственно закрытие, дальнейший код не выполняется
00452174 . B8 98214500 MOV EAX,1.00452198 ; ASCII "NoClose1!"
00452179 . E8 E651FDFF CALL 1.00427364
0045217E . 5B POP EBX ; kernel32.7C816D4F
0045217F . C3 RETN
Теперь в тупую меняем CALL 1.0044D3A4 на Nop'ы, с помощью Olly это легко:
00452161 . 8BD8 MOV EBX,EAX
00452163 . B8 88214500 MOV EAX,1.00452188 ; ASCII "Close1"
00452168 . E8 F751FDFF CALL 1.00427364
0045216D . 8BC3 MOV EAX,EBX
0045216F 90 NOP
00452170 90 NOP
00452171 90 NOP
00452172 90 NOP
00452173 90 NOP
00452174 . B8 98214500 MOV EAX,1.00452198 ; ASCII "NoClose1!"
00452179 . E8 E651FDFF CALL 1.00427364
0045217E . 5B POP EBX ; kernel32.7C816D4F
0045217F . C3 RETN
И теперь оно не закроется )))
Если чё не так, извиняйте, сам только учуся ))))
| Сообщение посчитали полезным: |
Ранг: 24.5 (новичок) Активность: 0.06↘0 Статус: Участник
|
Создано: 27 декабря 2006 11:24 · Поправил: Gluk · Личное сообщение · #8
Надеюсь я правельно тебя понял.. Тебе надо чтоб прога не закрылась..А выдала 2 окошко типа NoClose1?
Ну тогда для примера если поймаеш нажатие 1 кнопки то выйдеш сюда..
00452160 . 53 PUSH EBX
00452161 . 8BD8 MOV EBX,EAX
00452163 . B8 88214500 MOV EAX,00452188 ; ASCII "Close1"
00452168 . E8 F751FDFF CALL 00427364
0045216D . 8BC3 MOV EAX,EBX
0045216F E8 30B2FFFF CALL 0044D3A4
00452174 . B8 98214500 MOV EAX,00452198 ; ASCII "NoClose1!"
00452179 . E8 E651FDFF CALL 00427364
0045217E . 5B POP EBX ; 1.004329F6
0045217F . C3 RETN
Можно просто занопить 0045216F E8 30B2FFFF CALL 0044D3A4 или залезть в эту процедуру... и поправить немножко...
Также можно и с другими кнопками...
Я лично просто понопил процедуры...
8003_27.12.2006_CRACKLAB.rU.tgz - 1.rar
| Сообщение посчитали полезным: |
Ранг: 0.3 (гость) Активность: 0=0 Статус: Участник
|
Создано: 27 декабря 2006 11:53 · Поправил: Max_ASM · Личное сообщение · #9
А поменяв тут(сама процедура закрытия):
0044D3A4 /$ 53 PUSH EBX
0044D3A5 |. 56 PUSH ESI
0044D3A6 |. 51 PUSH ECX ; 1.0044C67C
0044D3A7 |. 8BD8 MOV EBX,EAX
0044D3A9 |. F683 F4020000>TEST BYTE PTR DS:[EBX+2F4],8
0044D3B0 74 0F JE SHORT 1.0044D3C1 <<<<<<------------!!!!!!!!!!!!!
0044D3B2 |. C783 4C020000>MOV DWORD PTR DS:[EBX+24C],2
0044D3BC |. E9 80000000 JMP 1.0044D441
0044D3C1 |> 8BC3 MOV EAX,EBX
0044D3C3 |. 8B10 MOV EDX,DWORD PTR DS:[EAX] ; 1.00451F90
0044D3C5 |. FF92 E4000000 CALL DWORD PTR DS:[EDX+E4]
на JNE SHORT 1.0044D3C1, ты ваще прогу не закроешь )))))))))))
Спасибо Gluk'у за подсказку ))))
| Сообщение посчитали полезным: |
Ранг: 95.5 (постоянный), 36thx Активность: 0.08↘0.04 Статус: Участник
|
Создано: 27 декабря 2006 13:09 · Личное сообщение · #10
Огромное спасибо ребята за помощь!
Сегодня отпишу что получилось, асм я только разбираю
с паскаля на асм не сразу получается (слёту не освоишься)
сейчас нашёл timer.enabled включить-отключить.
ещё раз большое спасибо.
С Уважением Rio.
| Сообщение посчитали полезным: |
Ранг: 138.7 (ветеран), 135thx Активность: 0.11↘0 Статус: Участник
|
Создано: 28 декабря 2006 02:21 · Поправил: crc1 · Личное сообщение · #11
Стандартно в Делфях при закрытии проги юзается API PostQuitMessage. Диспетчер обрабатывает это сообщение и закрывает прогу.
Т.е. при нажатии кнопки Close выполнится такая последовательность
00450B28 /$E8 1BBDFBFF CALL 0040C848
00450B2D |.84C0 TEST AL, AL
00450B2F |.74 07 JE SHORT 00450B38 ; отправка сообщения на закрытие
00450B31 |.6A 00 PUSH 0 ; /ExitCode = 0
00450B33 |.E8 B05AFBFF CALL <JMP.&user32.PostQuitMessage> ; PostQuitMessage
00450823 |.E8 B05DFBFF CALL <JMP.&user32.PeekMessageA> ; PeekMessageA
00450828 |.85C0 TEST EAX, EAX
0045082A |.74 75 JE SHORT 004508A1
0045082C |.B3 01 MOV BL, 1
0045082E |.837F 04 12 CMP DWORD PTR DS:[EDI+4], 12 ; прверка
00450832 |.74 66 JE SHORT 0045089A ; прыгнули
...
0045089A |>C686 9C000000 0> MOV BYTE PTR DS:[ESI+9C], 1 ; записали одын
004508A1 |>8BC3 MOV EAX, EBX
00450AF6 >8B45 FC MOV EAX, DWORD PTR SS:[EBP-4]
00450AF9 .80B8 9C000000 00 CMP BYTE PTR DS:[EAX+9C], 0 ; сравнили с нулем
00450B00 .74 BF JE SHORT 00450AC1 ; не прыгнули и поехали на выход, если поправить на JMP прогу можно убить только принудительно
Кстати, API PostQuitMessage часто используется в защитах программ. К примеру, закончился триал, или прога чекнула неправильную crc32 или отладчик и закрылась. Так что бряк на эту ф-ию иногда помогает во взломе
| Сообщение посчитали полезным: |
Ранг: 95.5 (постоянный), 36thx Активность: 0.08↘0.04 Статус: Участник
|
Создано: 28 декабря 2006 04:27 · Поправил: Rio · Личное сообщение · #12
Огромное спасибо Всем за грамотные консультации,
to: Crc1 //Кстати, API PostQuitMessage часто используется в защитах программ//
Поэтому я и ковыряю вглубь функций процедур, таймеры итд.
Ещё раз спасибо.
С Уважением Rio.
| Сообщение посчитали полезным: |