Имеется следующий код:
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++' — Павел Кузнецов
Почему токая уверенность, что ты туда что-то пишешь? По моему нет. Да этот вопрос более близок к форуму Низкоуровневое программирование.