Давайте разберемся. Вы хоть и даос, но все равно "ради... и красивости jmp" звучит немого под детски. Инструкция Код (Text): push imm32 retn 0 занимает в памяти 6 байт. Инструкция Код (Text): mov ecx, Imm32 jmp ecx занимает 7 байт. Инструкция Код (Text): jmp imm32 занимает 5 байт, Но! значение imm32 надо еще высчитать, что займет много больше 1-го байта. И где Ваш выйгрыш?
n0name Great Насколько я понимаю, перехват осуществляется патчингом SDT, а не сплайсингом на push/ret. А push/ret - это всего лишь возврат из перехватчика. Так что в данном случае использование push/ret ИМХО вполне оправдано. И также обсуждение замены push/ret на jmp для данного случая ИМХО надуманное.
В итоге, все получилось следующим образом: Код (Text): newOpenProcess proc C mov ecx, dword ptr [esp+10h] mov ecx, dword ptr [ecx] cmp ecx,PROTECT_PID mov eax, STATUS_ACCESS_DENIED je @f push trueOP retn 0 @@: retn 4*4 newOpenProcess endp - рабочий; Код (Text): newOpenProcess proc ProcessHandle:dword, access_mask:dword, pobject_attribute:dword, pclient_id:dword mov ecx, pclient_id mov ecx,dword ptr [ecx] cmp ecx, 1836 ; ID процесса mov eax, STATUS_ACCESS_DENIED jne @f push trueOP retn 0 @@: retn 4*4 newOpenProcess endp - не рабочий, хотя, вроде должен делать тоже самое... В связи с этим, у меня вопрос. Каким образом можно отладить подобную процедуру?
Код (Text): newOpenProcess proc ProcessHandle:dword, access_mask:dword, pobject_attribute:dword, pclient_id:dword mov ecx, pclient_id - это НЕ чистый ассемблер! Компилятор здесь своевольничает: Код (Text): newOpenProcess: push ebp mov ebp, esp mov ecx, [ebp+14h] ... Соответственно стек оказывается разбалансированным за счёт лишнего ebp...
n0name Да, я знаю, опечатался, но это влияет только на то какой процесс нельзя открыть (только его или все кроме него). Во втором случае, я наблюдаю БСОД. Я отлаживаю в сисере на варе. Проблема в том, что эту функцию мы попадаем только когда вызывается ntOpenProcess. Как поставить бряк, (если такое вообще возможно), для того, чтобы посмотреть какие параметры передаются в стеке? diamond Т.е., Вы хотите сказать, что если я пишу mov ecx, pclient_id, то в есх запихивается совсем не то? Ну и что, что компилятор своевольничает? Он же меняет при этом указатели на параметры?
Aspire В ecx запихивается то, что нужно - соответствующий параметр, переданный функции. Но достигается это ценой некоторого кода, вставляемого компилятором. В нормальных случаях это не мешает. Но если идут нетипичные возвраты (не туда, откуда была вызвана функция), это нужно учитывать. При использовании "ret" - да, компилятор про неё знает. При использовании "retn" - нет. Но в обоих случаях достигается не то, что нужно: если компилятор вставит leave или mov esp,ebp/pop ebp (второе вероятнее), то ret вернётся совсем не на trueOP; если не вставит, то в стеке останется лишнее двойное слово со всеми вытекающими для параметров и адреса возврата последствиями.
Как бы надо указывать что понимается под рабочим вариантом. в сисере - хз. в WinDBG - "bp nt!NtOpenProcess". В принцпе diamond все объяснил. Попробуй нарисовать на бумажке стек, и посмотри что происходит. Если с отладчиком не получается.
Спасибо,diamond, за подробное объяснение. Второй вопрос остался без ответа, поэтому продублирую его. Я отлаживаю в сисере на варе. Проблема в том, что эту функцию мы попадаем только когда вызывается ntOpenProcess. Как поставить бряк, (если такое вообще возможно), для того, чтобы посмотреть какие параметры передаются в стеке?