Есть код мне надо в .0030100E передать управление на .00401038, потом вернуться на .00401018. В этом случае приложение отказывается работать после .00401018. Какой должен быть правильный маш.код в .0040103E, чтобы прога работала нормально? .00401000: 6A00 push 000 .00401002: 6800304000 push 000403000 -----v (1) .00401007: 6819304000 push 000403019 -----v (2) .0040100C: 6A00 push 000 .0040100E: E81F000000 call MessageBoxA ;USER32.dll -- .00401013: E826000000 call .00040103E -----v (4) ->.00401018: 6A00 push 000 .0040101A: 6832304000 push 000403032 -----v (5) .0040101F: 6800E80700 push 00007E800 ;" •ш " .00401024: 6A00 push 000 .00401026: E807000000 call MessageBoxA ;USER32.dll -- .0040102B: 6A00 push 000 .0040102D: E806000000 call ExitProcess ;KERNEL32.dll .00401032: FF2508204000 jmp MessageBoxA ;USER32.dll .00401038: FF2500204000 jmp ExitProcess ;KERNEL32.dll /? .0040103E: C3 retn
Подвинуть можно жену в кровати , а в ассемблере это как ? Тебя чтоб понять , надо уйму извилин напрячь , старайся лучше восемь раз , разными предложениями объяснить один вопрос , чем двумя словами все . "FF25..." тут jmp в KERNEL32.dll на код ф-ции ExitProcess , она управление не возвращает .
Это понятно, я хотел попробывать изменить характреристики секции кода на запись и поэксперементировать за этим по изменял немного 2 урок Исцелиона, что привело к коду выше. сначала я в хью сделал без инструкции в .00401013 все работало потом немного сместил, есно и поправки в коде сделал перестало работать. Думаю сместить код в .401032 по ниже чтобы до него сделать че нить с самомодификацией и понаблюдать за реакцией винды. или как лучше это все обставить?
Так ret у тебя стоит в том месте , куда call указывает , всё правильно , после него переходишь к следующей за call (т.е. 00401018) , а там должен выскочить второй месаджбокс (правда с кривыми параметрами - " •ш ") , потом прога завершаеться . Что у тебя не работает , ты хотел сделать так ? Код (Text): invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK call @F invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK invoke ExitProcess,NULL @@: ret Вот кстати как масм может тоже и без лишних джампов : Код (Text): 00401000 >/$ 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 00401002 |. 68 00304000 PUSH msgbox.00403000 ; |Title = "Iczelion's tutorial no.2" 00401007 |. 68 19304000 PUSH msgbox.00403019 ; |Text = "Win32 Assembly is Great!" 0040100C |. 6A 00 PUSH 0 ; |hOwner = NULL 0040100E |. FF15 08204000 CALL NEAR DWORD PTR DS:[<&user32.MessageBoxA>] ; \MessageBoxA 00401014 |. E8 1C000000 CALL msgbox.00401035 00401019 |. 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL 0040101B |. 68 00304000 PUSH msgbox.00403000 ; |Title = "Iczelion's tutorial no.2" 00401020 |. 68 19304000 PUSH msgbox.00403019 ; |Text = "Win32 Assembly is Great!" 00401025 |. 6A 00 PUSH 0 ; |hOwner = NULL 00401027 |. FF15 08204000 CALL NEAR DWORD PTR DS:[<&user32.MessageBoxA>] ; \MessageBoxA 0040102D |. 6A 00 PUSH 0 ; /ExitCode = 0 0040102F \. FF15 00204000 CALL NEAR DWORD PTR DS:[<&kernel32.ExitProcess>]; \ExitProcess 00401035 $ C3 RETN
Что у тебя не работает , ты хотел сделать так ? Именно но хотел ручками,через хью уже в готовом invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK ; call @F invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK invoke ExitProcess,NULL ;@@: ret
Блин скажите пожалуйста дату выхода в свет хью, я эту дату за дату программиста возьму. Ваще рульный прога.
Володя. Взял таблицу секций от calc.exe w2k sp4 и думаю где же точка входа гланул на 4й dword говорит, что 00000600 гляжу и вижу, что то где останавливается олли или сайс, т.е. на 55 8B не по- хоже. А потом смотрю все четвертые цифры 77 и тут доперло, что это похоже на импорт. Вот ведь поглючило. Че это за хрень какого хера в начале не 55 8B, а какой то "лож- ный импорт" глянул в DATA_DIRECTORY тама есть bound может, это как то влияет? Ты уж не взыщи задолбался по обрывакам информацию собирать,т.к. в Питреке джунгли да и в твоих статьях не меньше прохода. Мне еще интересно на этапе компиляция код должен начинать, чо нить вроде этого: int main() { ... то что идет ниже как я думаю должно ложиться в секцию кода и на это место должен указывать PointerRawData! Так ли это?