Сейчас на форуме: vasilevradislav, tyns777, zombi-vadim (+3 невидимых) |
eXeL@B —› Программирование —› бряк глючит |
Посл.ответ | Сообщение |
|
Создано: 18 июня 2008 00:59 · Поправил: Mavlyudov · Личное сообщение · #1 Есть вопрос. почему-то, когда я в своей программе делаю вызов messagebox по нажатию на какою-нибудь клавишу, а потом в олли пытаюсь отловить, то не выходит. А когда пишу в проге var i:integer; .... i:=messagebox(....) то бряк срабатывает...СТРАННО!!!! Сделал еще вызов ExitProcess по нажатию клавиши "3", но брякнуть на него не получается... При этом, в отладчике видно следующее 0041A0A5 . FF35 F0404200 PUSH DWORD PTR DS:[4240F0] 0041A0AB . 68 F8A04100 PUSH 0041A0F8 0041A0B0 . E9 1F0A0000 JMP <JMP.&kernel32.ExitProcess> ..................... 0041A0F8 > C9 LEAVE ...................... 004240F0 0000 ADD BYTE PTR DS:[EAX],AL Да. тут мне подсазали, что в олли версии плагина к командной строке разные. Брякнул я bpx ExitProcess и остановился в модуле kernel32 на строчке 7C81CA82 > 8BFF MOV EDI,EDI ; 00429580 Тут я совсем запутался....... В чем тут проблема? |
|
Создано: 18 июня 2008 01:05 · Личное сообщение · #2 |
|
Создано: 18 июня 2008 01:09 · Личное сообщение · #3 |
|
Создано: 18 июня 2008 01:17 · Личное сообщение · #4 |
|
Создано: 18 июня 2008 14:03 · Личное сообщение · #5 Mavlyudov пишет: я не на делфи писал, а на фри паскале Особенности компилятора, а bp MessageboxA срабатывал потому что ты брякался на саму функцию. В меню Debug после того как брякнулся нажимай execute till return потом ф8 и ты на следующей после call строчке ----- Md5 fcbb6c9c9a5029b24d70f2d67c7cca74 |
|
Создано: 18 июня 2008 14:07 · Личное сообщение · #6 Stack пишет: Особенности компилятора, а bp MessageboxA срабатывал потому что ты брякался на саму функцию. В меню Debug после того как брякнулся нажимай execute till return потом ф8 и ты на следующей после call строчке Не понял нифига. Я в курсе что я попаду на следующую строку после call. А цель какая? Попасть на строчку выше неё что ли? |
|
Создано: 19 июня 2008 23:59 · Поправил: Mavlyudov · Личное сообщение · #7 tihiy_grom Да просто немного непонятно. Сделал обработку трех кнопок и для всех трех сделал вызов messagebox. Одна из них нормально дизассемблится(call MessageboxA), а две другие как jmp messageboxA... Делал обработку клавиш для того, чтобы найти кусок кода в отладчике и попробовать ввести обработчик для еще одной клавиши. Ищу мето, куда вставить свой код для обработки еще одной клавиши... Хочу сделать это без исходника, т.е дать прыг на свой код в свободное место в проге. Есть идея найти сначала обработчик сообщения WM_COMMAND, а точнее wm_keydown. Так вот, я отловил и поставил бряк...запустил, нажал клавишу, которую хочу обрабатывать(допустим это кнопка "5"). Встал на таком месте 004185E2 |> \FF75 10 PUSH [ARG.3] ; / Case 100 (WM_KEYDOWN) of switch 0041842C 004185E5 |. E8 8AFDFFFF CALL 00418374 Теперь нужно найти прыг, который осуществляет переход в случае, если обработка полученного сообщения(нажатой клавиши) не предусмотрена. Т.е., если клавиша не удовлетворяет условиям - управление предается виндовскому обработчику. А значит, как я понял, нужно искать переход на кусок кода, где происходит обработка TranslateMessage. Далее заменить этот переход на прыг в свой код и сделать возврат после кода. Но что-то я не могу найти, куда воткнуть прыг на свой код.... Нужны советы. Заранее благодарен. |
|
Создано: 20 июня 2008 00:07 · Личное сообщение · #8 |
|
Создано: 20 июня 2008 01:12 · Поправил: Mavlyudov · Личное сообщение · #9 |
|
Создано: 25 июня 2008 23:47 · Поправил: Mavlyudov · Личное сообщение · #10 Вот, что удалось сделать: было: 00418A25 CMP AL,31 ; Switch (cases 31..34) 00418A27 JB 00418AA8 00418A2D SUB AL,31 00418A2F JE SHORT 00418A8D 00418A31 DEC AL 00418A33 JE SHORT 00418A6D 00418A35 DEC AL 00418A37 JE SHORT 00418A5D 00418A39 DEC AL 00418A3B JNZ SHORT 00418AA8 00418A3D PUSH 1 ; Case 34 ('4') of switch 00418A25 00418A3F LEA EAX,[DWORD DS:4218BA] 00418A45 PUSH EAX 00418A46 LEA EAX,[DWORD DS:4218BA] 00418A4C PUSH EAX 00418A4D PUSH [DWORD DS:4220F0] 00418A53 PUSH 00418AA8 ............... 00418AA8 LEAVE ; Default case of switch 00418A25 00418AA9 . C2 0400 RETN 4 ======================================== С внесенными изменениями: 00418A25 CMP AL,31 ; Switch (cases 0..69) 00418A27 JB 00418AA8 00418A2D SUB AL,31 00418A2F JE SHORT 00418A8D 00418A31 DEC AL 00418A33 JE SHORT 00418A6D 00418A35 DEC AL 00418A37 JE SHORT 00418A5D 00418A39 DEC AL 00418A3B JNZ sss_000_.0041F0A0 00418A41 MOV EDX,50004218 ; Case 34 of switch 00418A25 00418A46 LEA EAX,[DWORD DS:4218BA] 00418A4C PUSH EAX 00418A4D PUSH [DWORD DS:4220F0] 00418A53 PUSH 00418AA8 .......... 00418AA8 LEAVE ---свой код---- 0041F0A0 PUSHAD 0041F0A1 CMP AL,35 ; Код клавиши '5' это 35h 0041F0A3 JE SHORT 0041F0AB 0041F0A5 JMP 00418A45 0041F0AA NOP 0041F0AB PUSH EAX 0041F0AC CALL kernel32.ExitProcess 0041F0B1 JMP 00418AA8 0041F0B6 POPAD //Жирным выделен кусок кода, изменения в котором произошли вследствие того, //что short jump был изменен на long. Но почему-то, клавиша не отрабатываетя в программе и по ее нажатию ничего не происходит. case стал теперь от 0 до 9 и мне непонятно почему. Если теперь щелкнуть в меню (правой кн. мыши) Go to с адреса 00418A25 CMP AL,31 ; Switch (cases 0..69) на любой из Case i (i=0..69), то попадаю на строчку 00418AA8 LEAVE ; Cases 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,10,11,12,13,14,15,16,17,18,19,1A,1B,1C ,1D,1E,1F,20,21,22,23,24,25,26,27,28,29,2A,2B,2C,2D,2E,2F,30 of switch 00418A25 |
|
Создано: 26 июня 2008 02:09 · Личное сообщение · #11 |
eXeL@B —› Программирование —› бряк глючит |