Помогите с куском кода разобраться пожайлуста 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
Типа я сверяю серийник винта с тем который зашит в вирусе, мне непонятно все вот эти операции со стеком и т.д
Miloserdov В Serial считывается серийный номер жесткого диска (функция GetVolumeInformation), который затем сранивается со значением hash. Если значения не совпадают, процесс завершается. Процесс также завершается, если функция GetVolumeInformation вернула значение 0. Стек служит для оформления вызова функции GetVolumeInformation. Конструкция push Something, pop eax приводит к результату eax = Something
Miloserdov А в что конкретно непонятно? Вначале в [ebp+Serial], функцией GetVolumeInformation записывается серийник винта. И если он есть, то сверяется с константным, и если они не равны то exit.
передача параметров функции осуществляется через стек - читай ицзелиона А вот Код (Text): push [ebp+hash] pop ebx выглядит и правда странно. Но суть тоже понятна - помещение в регистр числа из ячейки памяти
MSoft > "выглядит и правда странно" Styx_ROCK > "Просто кто-то пишет по извращенски" crypto > "Некоторые компиляторы используют подобное." Вы ни когда не сталкивались с базонезависимым кодом? Вам что-нибудь говорит такая конструкция Код (Text): ... call delta delta: pop ebp sub ebp,offset delta ...
MSoft Речь не о том помогает ли базонезависимость, а о том, что ее использование свидетельствует о специфическом (а не как не "странном" или "извращенском") подходе к написанию кода. censored Результат их работы эквивалентен, но первая длиннее на байт. И что? Может быть код самомодифицируемый или разработчик заложил такую возможность на будущее.
q_q Поставим вопрос иначе Чем отличается конструкция Код (Text): push [ebp+hash] pop ebx от Код (Text): mov ebx, [ebp+hash] с точки зрения базонезависимости? Причем здесь самомодификация? Код (Text): Вам что-нибудь говорит такая конструкция: ... call delta delta: pop ebp sub ebp,offset delta ... Например, то, что она не является базонезависимой (ключевое слово - offset)?
rmn Чем отличается конструкция ... с точки зрения базонезависимости? Ты не внимателен. В #12 я уже написал, что прямого отношения к базонезависимости она не имеет. Про базонезависимость (обрати внимание, на какие реплики в #9 я отвечал) я имел в виду, что при анализе кода надо смотреть не только на эффективность отдельных инструкций, а на стиль кода вообще. Если автор использует call ebp+XXX, то вполне объяснимо использование им аналогичной конструкции для доступа к данным. Причем здесь самомодификация? Моя догадка, возможно самая не правдоподобная, почему в коде отдано предпочтение паре push/pop вместо mov. она не является базонезависимой (ключевое слово - offset)? Ты хочешь сказать, что offset мешает базонезависимости? Может быть, мы трактуем этот термин по-разному? Мой вариант: базонезависимый - код, который вычисляет/настраивает все необходимые ему адреса во время своего выполнения. С этой точки зрения, в этом фрагменте кода, offset способствует базонезависимости.
Код (Text): call @F @@: pop ebp sub ebp,offset @B это нахождение дельты.... это же во всех туторах написано.. этот код и делает возможным обращение к переменным через дельту по другим адресам, т.е. и делает его pic... можно кошечно обойтись без этого (как virogen в peshrnk), но это проще и удобнее...
q_q Не знаю, почему я попал в реплики своей фразой ? В TurboC (старом) такое встречается (например, при вычислении выражений, содержащих скобки).
crypto почему я попал в реплики своей фразой Imho #4 и #5 вполне объяснили назначение кода. Не дождавшись реакции автора темы. В #6, #7 и #8 вы начали комментировать стиль кода, используя (на мой взгляд) фразы, которые не объясняли его, а напускали туман (ты же не сказал конкретно "В TurboC (старом) такое встречается"). _SLV_ & censored Что такое pic?