| Посл.ответ | 
Сообщение | 
 Ранг: 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.
   | Сообщение посчитали полезным:  |