Сейчас на форуме: asfa, Rio, _MBK_, Adler (+8 невидимых)

 eXeL@B —› Вопросы новичков —› MSVCR80
Посл.ответ Сообщение

Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 июня 2013 01:34 · Поправил: shayen788
· Личное сообщение · #1

здравствуйте. я вобщем новичок и все такое. тренировался на старой игрухе HPS Middle East ‘67, отучая от диска. где был вызов окна нашел почти сразу (и занопил je чтобы игнорировать вызов), но игра видимо не грузилась. благодаря тому что у меня был образ диска я нашел что "срыв" был на call по адресу 00422C97. я его тоже занопил, и после этого игра стала нормально идти без диска (хотя вроде вступительного ролика нет), но в связи с чем возникли вопросы:

1. насколько я понимаю call вызывает MSVCR80.dll. вот этого места я не понял. с какой целью? что этот длл делает, и то что я не дал совершить с ним какие то действия может ли как то сказаться на работоспособности программы?
2. я нашел этот call сравнивая (через F8) с смонтированным диском и без него. когда я сначала смотрел без диска было как то непонятно что происходит. есть какие то способы понять что игра вылетает именно по данному адресу, ведь возможность посмотреть по диску есть далеко не всегда?

вот участок кода
00422C48 |. 85F6 |TEST ESI,ESI
00422C4A 74 11 JE SHORT mideast6.00422C5D -------------------------- я нопил это
00422C4C |. 8B5424 10 |MOV EDX,DWORD PTR SS:[ESP+10]
00422C50 |. 52 |PUSH EDX
00422C51 |. E8 DAFCFFFF |CALL mideast6.00422930
00422C56 |. 83C4 04 |ADD ESP,4
00422C59 |. 84C0 |TEST AL,AL
00422C5B |. 75 39 |JNZ SHORT mideast6.00422C96
00422C5D |> 68 80000000 |PUSH 80
00422C62 |. E8 EE820800 |CALL mideast6.004AAF55
00422C67 |. 57 |PUSH EDI
00422C68 |. 68 E4FD4B00 |PUSH mideast6.004BFDE4 ; ASCII "Middle East '67"
00422C6D |. 8BF0 |MOV ESI,EAX
00422C6F |. 68 70164C00 |PUSH mideast6.004C1670 ; ASCII "Please place %s CD-ROM in drive %c"
00422C74 |. 56 |PUSH ESI
00422C75 |. FFD5 |CALL EBP ; MSVCR80.sprintf
00422C77 |. 83C4 14 |ADD ESP,14
00422C7A |. 6A 01 |PUSH 1
00422C7C |. 68 58124C00 |PUSH mideast6.004C1258 ; ASCII "Startup Error"
00422C81 |. 56 |PUSH ESI
00422C82 |. 6A 00 |PUSH 0
00422C84 |. FFD3 |CALL EBX ; USER32.MessageBoxA
00422C86 |. 83F8 02 |CMP EAX,2
00422C89 |. 56 |PUSH ESI ; /block = NULL
00422C8A 74 29 JE SHORT mideast6.00422CB5
00422C8C |. E8 57880800 |CALL <JMP.&MFC80.#266> ; \free
00422C91 |. 83C4 04 |ADD ESP,4
00422C94 |.^ EB 9D \JMP SHORT mideast6.00422C33
00422C96 |> 56 PUSH ESI ; /stream = NULL
00422C97 FF15 C8A74B00 CALL DWORD PTR DS:[<&MSVCR80.fclose>] ; MSVCR80.fclose --- и это
0422C9D 83C4 04 ADD ESP,4
00422CA0 |. 5E POP ESI ; mideast6.004EDB38




Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 05 июня 2013 02:31
· Личное сообщение · #2

сделайте чтобы я это развидел!
msvcrtXXX.dll это рантайм майкросттовтовского компилятора. базовые функции - сравнение сточек, деление на 100500, отсылание на йух и т.д. - никакокой ЦД защиты там быть не может.
call это вызов функции. любой. и функции обычно принимаю параметры через стэк. занопив только вызов ты скорее всего забыл занопить передачу пареметров. они теперь неприкаяными болтаются в стэке и рушат прогу




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 05 июня 2013 05:41 · Поправил: ClockMan
· Личное сообщение · #3

DrGolova
просто ему повезло, занопив
00422C4A 74 11 JE SHORT mideast6.00422C5D,
здесь чистое везение происходит

00422C59 |. 84C0 |TEST AL,AL
00422C5B |. 75 39 |JNZ SHORT mideast6.00422C96 перепрыгиваем мессагу

и второе везение где идёт завершение программы

00422C96 |> 56 PUSH ESI ; /stream = NULL
00422C97 FF15 C8A74B00 CALL DWORD PTR DS:[<&MSVCR80.fclose>] ; MSVCR80.fclose --- и это

чудо майкрософтского компилятора.

0422C9D 83C4 04 ADD ESP,4

только это спасает программу от её падения.

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 июня 2013 16:58
· Личное сообщение · #4

а можно сказать языком чтобы я это понял? ветка же "вопросы новичков" все таки.

занопить je было естественно тк там был прыжок через запрос диска, что еще можно было предпринять?

занопить call ну да мне повезло, только я не понял почему прога с ним вылетала, а без него работает. о чем и спрашиваю.
ну хорошо, а как можно было по другому поступить? не нопя в первую очередь je?




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 05 июня 2013 17:09
· Личное сообщение · #5

shayen788
Если ты новичёк то это незначит что надо пренебрегать основам реверсинга.
shayen788 пишет:
а как можно было по другому поступить?

GetDriveTypeA

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 419.0 (мудрец), 647thx
Активность: 0.460.51
Статус: Участник
"Тибериумный реверсинг"

Создано: 05 июня 2013 17:38
· Личное сообщение · #6

ClockMan пишет:
чудо майкрософтского компилятора.
0422C9D 83C4 04 ADD ESP,4

чудо это cdecl
shayen788 пишет:
что еще можно было предпринять?

собственно запатчить функцию CALL mideast6.00422930 так, чтобы она всегда возвращала в регистре AL все что угодно(1,2,55,0x1F), но только не 0. Если в программе данная функция вызывается более одного раза - смысл есть. Тут есть, правда, один нюанс - попасть в данную фукнцию мы можем, если
Code:
  1. 00422C48 |. 85F6 |TEST ESI,ESI
  2. 00422C4A 74 11 JE SHORT mideast6.00422C5D \данный переход, который ты нопил

не будет выполняться. Очевидно в ESI должен быть хендл от CreateFileA, где первый аргумент - буква диска.



Ранг: 0.4 (гость)
Активность: 0=0
Статус: Участник

Создано: 05 июня 2013 18:59 · Поправил: shayen788
· Личное сообщение · #7

ClockMan пишет:
Если ты новичёк то это незначит что надо пренебрегать основам реверсинга.

я и не пренебрегаю. я спрашиваю,. пытаюсь подробно описать ход своих мыслей, чем я руководствовался, надеясь что мне укажут тоже подробно в чем я ошибался.
ClockMan пишет:
GetDriveTypeA

я не хотел использовать этот способ, тк в современных играх он не встречается. я хотел осваивать такие способы которые были бы функциональны на чем то более современном.

ELF_7719116 пишет:
Если в программе данная функция вызывается более одного раза - смысл есть. Тут есть, правда, один нюанс - попасть в данную фукнцию мы можем, если ...

а если не один раз(хотя зачем он будет вызыватся, ведь он же вроде запрос чтения)? чем такой способ лучше? правкой только CALL mideast6.00422930 ведь не обойдется?

ELF_7719116 пишет:
собственно запатчить функцию CALL mideast6.00422930 так, чтобы она всегда возвращала в регистре AL все что угодно(1,2,55,0x1F), но только не 0.

и, вобщемто, я в учебном курсе еще до это места не дошел


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


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