ReadProcessMemory - ERROR_NOACCESS

Тема в разделе "WASM.WIN32", создана пользователем DPX, 28 июл 2005.

  1. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    Здравствуйте! Почему не работает следующий код:
    Код (Text):
    1. ;hWnd - хэндл диалогового окна
    2. GetHWND proc hWnd:HWND
    3. LOCAL PID:DWORD
    4. LOCAL hBuf:HWND
    5.     invoke FindWindow,addr CLASS_NAME,addr WINDOW_NAME
    6.     .if eax==NULL
    7.         invoke MessageBox,hWnd,addr errtext,addr mescaption,MB_OK or MB_ICONERROR or MB_APPLMODAL
    8.         mov eax, -12
    9.         ret
    10.     .endif
    11.     mov hBuf, eax
    12.     invoke GetWindowThreadProcessId,hBuf,addr PID
    13.     invoke OpenProcess,PROCESS_ALL_ACCESS,FALSE,PID
    14.     .if eax==NULL
    15.         invoke MessageBox,hWnd,addr errtext,addr mescaption,MB_OK or MB_ICONERROR or MB_APPLMODAL
    16.         mov eax, -12
    17.     .endif
    18.     ret
    19. GetHWND endp
    20.  
    21. ;address - указатель на адрес для чтения/записи
    22. ;val - указатель на значение для записи
    23. ;isRead - определяет, вызывается ли функция для чтения или нет
    24. ;siz - размер данных для чтения/записи
    25. ;mHWND - хэндл диалогового окна
    26. TrnEng PROC address:LPVOID,val:LPVOID,isRead:BOOL,siz:DWORD,mHWND:HWND
    27. LOCAL oldaccess:DWORD
    28. LOCAL pHWND:HWND
    29.     invoke GetHWND,mHWND
    30.     mov pHWND, eax
    31.     .if pHWND==-12
    32.         invoke MessageBox,addr mHWND,addr uerrtxt,addr mescaption,MB_OK or MB_ICONERROR or MB_APPLMODAL
    33.         mov eax, -12
    34.         ret
    35.     .endif
    36.  
    37.     invoke VirtualProtectEx,pHWND,address,siz,PAGE_EXECUTE_READWRITE,addr oldaccess
    38.     .if isRead==TRUE
    39.         invoke ReadProcessMemory,pHWND,address,eax,siz,NULL
    40.     .else
    41.         invoke WriteProcessMemory,pHWND,address,val,siz,NULL
    42.     .endif
    43.  
    44.     push eax
    45.     invoke VirtualProtectEx,pHWND,address,siz,oldaccess,oldaccess
    46.     invoke CloseHandle,pHWND
    47.     pop eax
    48.     ret
    49. TrnEng endp


    OllyDbg пишет, что при выполнении инструкции ReadProcessMemory возникает ошибка ERROR_NOACCESS. Причём все хэндлы, PID`ы и всё остальное возвращаются правильно.
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    DPX

    Покажи значения параметров, передаваемых в ReadProcessMemory.
     
  3. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    BOOL ReadProcessMemory(



    HANDLE hProcess, // handle of the process whose memory is read

    LPCVOID lpBaseAddress, // address to start reading

    LPVOID lpBuffer, // address of buffer to place read data

    DWORD nSize, // number of bytes to read

    LPDWORD lpNumberOfBytesRead // address of number of bytes read

    );
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Ес-но, ты куда пытаешься данные считать - по несуществующему адресу lpBuffer = eax, который после BOOL VirtualProtect() = TRUE или FALSE
     
  5. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    спасибо, счас проверим
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    DPX

    Не описание функции, а значения параметров.
     
  7. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    ошибки больше нет, но значение всё равно 0. Может быть, это из-за того, что по адресу находится значение типа FLOAT? Для преобразования его (значения) в строку я использую msvcrt.sprintf. Вот код функции, может там что-то не так?
    Код (Text):
    1. ;isMoney - значение, показывающее, является ли значение типа FLOAT внутриигровыми деньгами (TRUE) или рейтингом (FALSE)
    2. ;value - значение типа DWORD (в игре деньги вряд ли будут больше даже 10 млн.), конвертируется в QWORD
    3. ;переменная Money - QWORD (Money dq ?); szMsvcrt - BYTE (szMsvcrt db 'msvcrt.dll',0)
    4. ;szSprintf - BYTE (szSprintf db 'sprintf',0); szFloat - BYTE (szFloat db '%f',0)
    5. ;moneybuf - BYTE (moneybuf db ?)
    6. RealToStr proc isMoney:BOOL,value:DWORD
    7.     invoke LoadLibrary,offset szMsvcrt
    8.     invoke GetProcAddress,eax,offset szSprintf
    9.     .if isMoney==TRUE
    10.         mov edx, value
    11.         mov dword ptr money, edx
    12.         mov dword ptr money+4, 0
    13.        
    14.         push dword ptr money+4
    15.         push dword ptr money
    16.         push offset szFloat
    17.         push offset moneybuf
    18.         call eax
    19.     .else
    20.     .endif
    21.     add esp, 3*4
    22.     ret 8
    23. RealToStr endp




    и если уж на то пошло, как отбросить дробную часть числа типа FLOAT?
     
  8. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    q_q

    понятно, вот они:

    address = 00679020h

    pHWND = 5C (но разве эта величина должна быть постоянной?)

    вместо eax теперь у меня стоит addr valBuf (LOCAL valBuf:lol: WORD)

    siz = 4

    NULL = 0 :)
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    DPX

    по адресу находится значение типа FLOAT

    Покажи восемь байт по адресу.



    В masm32.lib есть fptoa.asm и fptoa2.asm, в fpu.lib есть FpuFLtoA.asm.
     
  10. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    60 30 DE 48 04 00 00 00

    кстати, как использовать эти функции? В смысле, какой параметр за что отвечает? А то в MSDN этого, вроде, нету.
     
  11. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    оказывается, всё дело в неправильной функции RealToStr! С помощью FloatToStr в masm32.lib всё получилось, но минус в том, что значение функция возвращает в виде мантиссы и экспоненты, а мне надо десятичное число! Как с этим справиться?
     
  12. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    DPX

    Ты уврен, что это число с плавающей точкой? Afaik не похоже.
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    DPX

    > "минус в том, что значение функция возвращает в виде мантиссы и экспоненты, а мне надо десятичное число!"



    Во-первых, FloatToStr представлет в децимальном виде только числа от 0.1 <= x < 10^7, а для увеличения диапазона до x < |10^16| нужно использовать FloatToStr2 (см.комменты в fptoa.asm и fptoa2.asm).

    Во-вторых, как ты в децимальном виде хочешь представить число (?) 6030DE4804000000 ~ 2.26E+155 если старшие разряды слева или ~ 9.09E-314 если старшие справа (denormal).

    Или может это 32-бит single 0x48DE3060h = 455043 ?

    Или ты не по тому адресу свои money читаешь ?
     
  14. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    да, это 455043, но в утилке, где я смотрю память процесса - TSearch - написано, что это Float!
     
  15. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    в общем я со всем разобрался, но остался единственный вопрос: как преобразовать 80-bit LONG DOUBLE (или 64-bit DOUBLE) в 32-bit FLOAT, или как преобразовать строку в 32-bit FLOAT?
     
  16. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Все преобразования вещ.чисел делаются путем загрузки в FPU в одном формате и выгрузке в другом. Загрузка:

    fld tbyte [..] ;загрузить extended 80-бит

    fld qword [..] ;загрузить double 64-бит

    fld dword [..] ;загрузить single 32-бит

    fild dword [..] ;загрузить целое 32-бит

    Выгрузка: делается аналогично командой fstp для сохранения в вещ.формате или fistp - для преобразования к целому dword или qword.



    Если твои money целые, то проще и работать с 32-битными числами:

    fild dword [imoney] ;грузим целое

    fstp dword [fmoney] ;сохраняем как вещественное
     
  17. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    оооооогромное спасибо! работает!