Сейчас на форуме: _MBK_, ut2004, vsv1 (+7 невидимых)

 eXeL@B —› Вопросы новичков —› Правка или обход процедуры Close в Дельфи?
Посл.ответ Сообщение

Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.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.170.01
Статус: Участник

Создано: 27 декабря 2006 07:55
· Личное сообщение · #2

Архив то кривой



Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 27 декабря 2006 08:50
· Личное сообщение · #3

Пробовал прикрепить, не идёт.
Вот ссылка tambovstroy.narod.ru/Close.7z



Ранг: 53.0 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 27 декабря 2006 09:34
· Личное сообщение · #4

PROCEDURE TForm1.FormCloseQuery(Sender: TObject; VAR CanClose: Boolean);
BEGIN
ShowMessage('Хрен закроешь');
CanClose := False;
END;




Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.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.050
Статус: Участник

Создано: 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.060
Статус: Участник

Создано: 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.080.04
Статус: Участник

Создано: 27 декабря 2006 13:09
· Личное сообщение · #10

Огромное спасибо ребята за помощь!
Сегодня отпишу что получилось, асм я только разбираю
с паскаля на асм не сразу получается (слёту не освоишься)
сейчас нашёл timer.enabled включить-отключить.
ещё раз большое спасибо.
С Уважением Rio.



Ранг: 138.7 (ветеран), 135thx
Активность: 0.110
Статус: Участник

Создано: 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.080.04
Статус: Участник

Создано: 28 декабря 2006 04:27 · Поправил: Rio
· Личное сообщение · #12

Огромное спасибо Всем за грамотные консультации,
to: Crc1 //Кстати, API PostQuitMessage часто используется в защитах программ//
Поэтому я и ковыряю вглубь функций процедур, таймеры итд.
Ещё раз спасибо.
С Уважением Rio.


 eXeL@B —› Вопросы новичков —› Правка или обход процедуры Close в Дельфи?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати