Проблема с функцией WriteProcessMemory!
От: ToXX Россия  
Дата: 23.03.05 17:56
Оценка:
Имеется следующий код:

static HINSTANCE ntHinstDLL;
ntHinstDLL = GetModuleHandle("ntdll.dll");

#pragma pack (push,1)
struct jmp_far
{
BYTE instr_push; //здесь будет код инструкции push
DWORD arg; //аргумент push
BYTE instr_ret; //здесь будет код инструкции ret
};
#pragma pack (pop)

jmp_far JmpZwCreateThread;
DWORD AdrZwResumeThread, written;
HANDLE CurrProc;
...

CurrProc = CurrProc = GetCurrentProcess();
AdrZwResumeThread = (DWORD)GetProcAddress(ntHinstDLL,"ZwResumeThread");

{1}

JmpZwResumeThread.instr_push = 0x68;
JmpZwResumeThread.arg = (DWORD)&NewZwResumeThread;
JmpZwResumeThread.instr_ret = 0xC3;

WriteProcessMemory(CurrProc, (void*)AdrZwResumeThread, (void*)&JmpZwResumeThread, sizeof(jmp_far), &written))

При его выполнении я заметил одну странную вещь, а именно почему то байт с адресом 77F7F093 (Значение B8) никак не хочет перезаписываться.

Начальное состояние:

77F7F08F C2 04 00 ret 4
77F7F092 90 nop
---------------------------------------------------
77F7F093 B8 CE 00 00 00 mov eax,0CEh
77F7F098 BA 00 03 FE 7F mov edx,7FFE0300h
77F7F09D FF D2 call edx
77F7F09F C2 08 00 ret 8
---------------------------------------------------
77F7F0A2 90 nop
77F7F0A3 B8 CF 00 00 00 mov eax,0CFh

1-й вариант выполнения

AdrZwResumeThread = 77F7F093
&NewZwResumeThread = 01032F20

77F7F08F C2 04 00 ret 4
77F7F092 90 nop
---------------------------------------------------
77F7F093 B8 20 2F 03 01 mov eax,offset NewZwResumeThread (1032F20h)
77F7F098 C3 ret
77F7F099 00 03 add byte ptr [ebx],al
77F7F09B ?? db feh
77F7F09C 7F FF jg 77F7F09D
77F7F09E D2 C2 rol dl,cl
---------------------------------------------------

77F7F0A0 08 00 or byte ptr [eax],al
77F7F0A2 90 nop
77F7F0A3 B8 CF 00 00 00 mov eax,0CFh

2-й вариант выполнения

В {1} добавим AdrZwResumeThread -= 1;
AdrZwResumeThread = 77F7F092
&NewZwResumeThread = 01092F30

77F7F08F C2 04 00 ret 4
77F7F092 68 db 68h
---------------------------------------------------
77F7F093 B8 2F 09 01 C3 mov eax,0C301092Fh
77F7F098 BA 00 03 FE 7F mov edx,7FFE0300h
77F7F09D FF D2 call edx
77F7F09F C2 08 00 ret 8
---------------------------------------------------
77F7F0A2 90 nop
77F7F0A3 B8 CF 00 00 00 mov eax,0CFh

3-й вариант выполнения

В {1} добавим AdrZwResumeThread -= 2;
AdrZwResumeThread = 77F7F091
&NewZwResumeThread = 010B2F30

77F7F08F C2 04 68 ret 6804h
77F7F092 30 db 30h
---------------------------------------------------
77F7F093 B8 0B 01 C3 00 mov eax,0C3010Bh
77F7F098 BA 00 03 FE 7F mov edx,7FFE0300h
77F7F09D FF D2 call edx
77F7F09F C2 08 00 ret 8
---------------------------------------------------
77F7F0A2 90 nop
77F7F0A3 B8 CF 00 00 00 mov eax,0CFh

Кто-нибудь знает почему так получилось, что байт 77F7F093 остался нетронутым??

15.04.05 20:57: Перенесено модератором из 'C/C++' — Павел Кузнецов
Re: Проблема с функцией WriteProcessMemory!
От: Fantomas_  
Дата: 23.03.05 19:26
Оценка:
Почему токая уверенность, что ты туда что-то пишешь? По моему нет. Да этот вопрос более близок к форуму Низкоуровневое программирование.
Re[2]: Проблема с функцией WriteProcessMemory!
От: ToXX Россия  
Дата: 23.03.05 20:30
Оценка:
Здравствуйте, Fantomas_, Вы писали:

F_>Почему токая уверенность, что ты туда что-то пишешь? По моему нет. Да этот вопрос более близок к форуму Низкоуровневое программирование.


Насчет уверенности, что пишешь... Ну ведь остальные 5 байт из шести записываются в память

Было:
77F7F093 B8 CE 00 00 00
77F7F098 BA 00 03

Пишем 6 байт, начиная с 77F7F093 :: 68,01032F20,C3 (записывается вобратном порядке 202F0301)

Стало:
77F7F093 B8 20 2F 03 01
77F7F098 C3 00 03

т.е. вся последовательность кроме первого байта успешно записывается в память.

Что насчет второго, то возможно и более близок, просто писал на C и засунул в этот форум.
Re: Проблема с функцией WriteProcessMemory!
От: ToXX Россия  
Дата: 24.03.05 07:10
Оценка:
Ну что??? так никто и не поможет??
Re[3]: Проблема с функцией WriteProcessMemory!
От: Fantomas_  
Дата: 24.03.05 09:25
Оценка:
Предоставь, пожалуйста для полной уверенности еще 2 варианта:
1. Пишем нули в память, а не какие-то значения(ну или FFFFFF) Это чтоб ыидно было.
2. Попробуй писать на 1 байт меньший адрес на 2, на 3, покажи результаты. Будь добр.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.