Стек

Тема в разделе "WASM.BEGINNERS", создана пользователем Miloserdov, 28 май 2007.

  1. Miloserdov

    Miloserdov New Member

    Публикаций:
    0
    Регистрация:
    23 май 2007
    Сообщения:
    7
    Помогите с куском кода разобраться пожайлуста

    push 00h
    push 00h
    push 00h
    push 00h
    lea eax,[ebp+Serial]
    push eax
    push 00h
    push 00h
    push 00h
    call [ebp+_GetVolumeInformation]

    .if eax==0
    push 00h
    call [ebp+_ExitProcess]
    .endif

    push [ebp+Serial]
    pop eax

    push [ebp+hash]
    pop ebx

    .if eax!=ebx
    push 00h
    call [ebp+_ExitProcess]

    .endif
     
  2. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Miloserdov

    А в чём вопрос, если не секрет?
     
  3. Miloserdov

    Miloserdov New Member

    Публикаций:
    0
    Регистрация:
    23 май 2007
    Сообщения:
    7
    Типа я сверяю серийник винта с тем который зашит в вирусе, мне непонятно все вот эти операции со стеком и т.д
     
  4. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Miloserdov
    В Serial считывается серийный номер жесткого диска (функция GetVolumeInformation), который затем сранивается со значением hash. Если значения не совпадают, процесс завершается. Процесс также завершается, если функция GetVolumeInformation вернула значение 0.
    Стек служит для оформления вызова функции GetVolumeInformation.
    Конструкция push Something, pop eax приводит к результату eax = Something
     
  5. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Miloserdov
    А в что конкретно непонятно?
    Вначале в [ebp+Serial], функцией GetVolumeInformation записывается серийник винта.
    И если он есть, то сверяется с константным, и если они не равны то exit.
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    передача параметров функции осуществляется через стек - читай ицзелиона
    А вот
    Код (Text):
    1. push [ebp+hash]
    2. pop ebx
    выглядит и правда странно. Но суть тоже понятна - помещение в регистр числа из ячейки памяти
     
  7. Styx_ROCK

    Styx_ROCK New Member

    Публикаций:
    0
    Регистрация:
    24 ноя 2005
    Сообщения:
    17
    Адрес:
    Barbados
    MSoft
    Просто кто-то пишет по извращенски, такое чувство, что это слегка переписаный рип фнкиции.
     
  8. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Styx_ROCK
    Некоторые компиляторы используют подобное.
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    MSoft > "выглядит и правда странно"
    Styx_ROCK > "Просто кто-то пишет по извращенски"
    crypto > "Некоторые компиляторы используют подобное."
    Вы ни когда не сталкивались с базонезависимым кодом?
    Вам что-нибудь говорит такая конструкция
    Код (Text):
    1. ...
    2.         call    delta
    3. delta:
    4.         pop     ebp
    5.         sub     ebp,offset delta
    6. ...
     
  10. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    q_q
    причем здесь pic?
    Код (Text):
    1. push [ebp+hash]
    2. pop ebx
    <=>
    Код (Text):
    1. mov ebx, [ebp+hash]
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    q_q
    и правда, как передача числа в регистр через стек помогает базонезависимости???
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    MSoft
    Речь не о том помогает ли базонезависимость, а о том, что ее использование свидетельствует о специфическом (а не как не "странном" или "извращенском") подходе к написанию кода.

    censored
    Результат их работы эквивалентен, но первая длиннее на байт. И что? Может быть код самомодифицируемый или разработчик заложил такую возможность на будущее.
     
  13. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    q_q
    Поставим вопрос иначе :)
    Чем отличается конструкция
    Код (Text):
    1. push [ebp+hash]
    2. pop ebx
    от
    Код (Text):
    1. mov ebx, [ebp+hash]
    с точки зрения базонезависимости?

    Причем здесь самомодификация?

    Код (Text):
    1. Вам что-нибудь говорит такая конструкция:
    2. ...
    3.         call    delta
    4. delta:
    5.         pop     ebp
    6.         sub     ebp,offset delta
    7. ...
    Например, то, что она не является базонезависимой (ключевое слово - offset)? :)
     
  14. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    rmn
    Чем отличается конструкция ... с точки зрения базонезависимости?
    Ты не внимателен. В #12 я уже написал, что прямого отношения к базонезависимости она не имеет.
    Про базонезависимость (обрати внимание, на какие реплики в #9 я отвечал) я имел в виду, что при анализе кода надо смотреть не только на эффективность отдельных инструкций, а на стиль кода вообще. Если автор использует call ebp+XXX, то вполне объяснимо использование им аналогичной конструкции для доступа к данным.

    Причем здесь самомодификация?
    Моя догадка, возможно самая не правдоподобная, почему в коде отдано предпочтение паре push/pop вместо mov.

    она не является базонезависимой (ключевое слово - offset)?
    Ты хочешь сказать, что offset мешает базонезависимости? Может быть, мы трактуем этот термин по-разному? Мой вариант: базонезависимый - код, который вычисляет/настраивает все необходимые ему адреса во время своего выполнения. С этой точки зрения, в этом фрагменте кода, offset способствует базонезависимости.
     
  15. _SLV_

    _SLV_ New Member

    Публикаций:
    0
    Регистрация:
    22 фев 2007
    Сообщения:
    19
    Код (Text):
    1. call @F
    2. @@: pop ebp
    3.  sub ebp,offset @B
    это нахождение дельты.... это же во всех туторах написано.. этот код и делает возможным обращение к переменным через дельту по другим адресам, т.е. и делает его pic... можно кошечно обойтись без этого (как virogen в peshrnk), но это проще и удобнее...
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    q_q
    Не знаю, почему я попал в реплики своей фразой
    ?
    В TurboC (старом) такое встречается (например, при вычислении выражений, содержащих скобки).
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    crypto
    почему я попал в реплики своей фразой
    Imho #4 и #5 вполне объяснили назначение кода. Не дождавшись реакции автора темы. В #6, #7 и #8 вы начали комментировать стиль кода, используя (на мой взгляд) фразы, которые не объясняли его, а напускали туман (ты же не сказал конкретно "В TurboC (старом) такое встречается").

    _SLV_ & censored
    Что такое pic?
     
  18. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    q_q
    bic - бэйз индепендет коде
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    nitrotoluol
    p ili b?
     
  20. _SLV_

    _SLV_ New Member

    Публикаций:
    0
    Регистрация:
    22 фев 2007
    Сообщения:
    19
    базонезависимый код, p - position, b - base => както не особо есть разница, так чт pic/bic =]