Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Неверная работа со стеком
Посл.ответ Сообщение

Ранг: 39.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 11 мая 2010 06:19
· Личное сообщение · #1

Всем привет!

Имеем фунцию на асме:
Code:
  1. StreamInProc proc hFile:DWORD,pBuffer:DWORD, NumBytes:DWORD, pBytesRead:DWORD
  2.          invoke ReadFile,hFile,pBuffer,NumBytes,pBytesRead,0
  3.          xor eax,1
  4.          ret
  5. StreamInProc endp

Работает как нужно.

Вот аналог на C
Code:
  1. long StreamInProc(HANDLE hFile, PVOID pBuffer, DWORD NumBytes, LPDWORD pBytesWritten)
  2. {
  3.          return 1^ReadFile (hFile, pBuffer, NumBytes, pBytesWritten, NULL);
  4. }

Работает не совсем как нужно.

При компиляции асм код заканчивается на RETN10, а код на С - RETN.
Ну очевидно после RETN10 ESP=ESP+4+10, после RETN ESP=ESP+4

Вопрос:
Как это заставить код на C использовать RETN10 (программно, без патча)?

Для примера могу предложить прикрепленный файл и wasm.ru/pub/1/files/tut33.zip. При нажатии на кнопку "21" программа вызывает функцию BitBtn2Click из hookle.dll. Ошибка при выполнении SendMessage ... STREAMIN. Пытается прочитать адрес памяти, значение которой совпадает с hFile (такой уж попался в стеке).

d1a8_10.05.2010_CRACKLAB.rU.tgz - 011.rar




Ранг: 331.1 (мудрец), 561thx
Активность: 0.190.06
Статус: Участник

Создано: 11 мая 2010 08:25 · Поправил: Vamit
· Личное сообщение · #2

Bonez92 пишет:
Вопрос: Как это заставить код на C использовать RETN10 (программно, без патча)?

Используй в опциях компилятора или явно нужную конвенцию вызова функции
Code:
  1. Keyword                          Stack cleanup             Parameter passing 
  2. __cdecl                            Caller                          Pushes parameters on the stack, in reverse order (right to left) 
  3. __stdcall                          Callee                         Pushes parameters on the stack, in reverse order (right to left) 
  4. __fastcall                         Callee                         Stored in registers, then pushed on stack 
  5. thiscall(not a keyword)    Callee                         Pushed on stack; this pointer stored in ECX

в твоем случае это - __cdecl
PS: Извиняюсь, ошибся спросонок, конечно, __stdcall

-----
Everything is relative...




Ранг: 284.8 (наставник), 6thx
Активность: 0.150
Статус: Участник

Создано: 11 мая 2010 10:16
· Личное сообщение · #3

Bonez92 пишет:
Вопрос: Как это заставить код на C использовать RETN10 (программно, без патча)?


нужно использовать __stdcall

long __stdcall StreamInProc(HANDLE hFile, PVOID pBuffer, DWORD NumBytes, LPDWORD pBytesWritten)
{
return 1^ReadFile (hFile, pBuffer, NumBytes, pBytesWritten, NULL);
}



Ранг: 39.6 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 11 мая 2010 14:06
· Личное сообщение · #4

Заработал!!!!! Vamit, RSI, огромное спасибо!


 eXeL@B —› Программирование —› Неверная работа со стеком
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати