C# Внедрение и чтение значения регистра в 64-битной версии

Я хотел бы ввести код и регистр чтения при выполнении какого-либо метода. Итак, я хотел бы записатьrcx значение из этого метода

1211F4000 8B 41 50 mov eax,[rcx+50]
1211F4003 89 47 10 mov [rdi+10],eax

Мне удалось получить адрес памяти, содержащий этот метод, в мое приложение C# с помощью AOB Scanner, и я получил 1211F4000уже. Затем я попытался выделить память для записи этих методов

 byte[] asm = new byte[] {
                    0x48, 0x89, 0x0C, 0x25, 0x02, 0x00, 0x1F, 0x02, // mov [021F0002],rcx
                    0xC3                            // RET
                };

Однако о методах написано уже в 021F0002 что правильно, но когда я использую CreateRemoteThread Я столкнулся с такой проблемой

Fatal error. System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.

Однако я использовал Process_All, чтобы получить дескриптор процесса

MemoryReader.OpenProcess(0x001F0FFF, false, GetProcess().Id);

Итак, мои вопросы: 1. Кто-нибудь знает, почему возникает эта ошибка? Или, может быть, я сделал какую-то ошибку, которая привела к неудаче. 2. В настоящее время я жестко кодирую021F0002 часть, могу ли я изменить байт динамически в зависимости от выделенного адреса памяти?

это мой кусок кода

 byte[] asm = new byte[] {
                    0x48, 0x89, 0x0C, 0x25, 0x02, 0x00, 0x1F, 0x02, // mov [021F0002],rcx
                    0xC3                            // RET
                };
                IntPtr hAlloc = VirtualAllocEx(hProcess, IntPtr.Zero, (uint)asm.Length, AllocationType.Commit, MemoryProtection.ExecuteReadWrite);
                if (hAlloc == IntPtr.Zero)
                    throw new ApplicationException("Cannot allocate memory for code.");

                UIntPtr bytesWritten = UIntPtr.Zero;

                if (!WriteProcessMemory(hProcess, hAlloc, asm, (uint)asm.Length, out bytesWritten))
                    throw new ApplicationException("Cannot write process memory.");

                if (asm.Length != (int)bytesWritten)
                    throw new ApplicationException("Invalid written size.");
                uint iThreadId = 0;
                IntPtr hThread = CreateRemoteThread(hProcess, hitpoint, 0, hAlloc, IntPtr.Zero, 0, out iThreadId);

Спасибо ребята!

0 ответов

Другие вопросы по тегам