Всем привет пытаюсь вызвать длл мейн методом патчинга вин апи функции но что то не выходит приложение ложится вот код шелл кода и как я делаю может кто сможет помочь буду благодарен Код (C++): BYTE shellcode[] = { //hook 0x00, 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x10, 0x48, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x50, 0x08, 0x48, 0x83, 0xEC, 0x28, 0x48, 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x15, 0x02, 0x00, 0x00, 0x00, 0xEB, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x28, 0x48, 0x31, 0xC0, 0xC6, 0x05, 0xAE, 0xFF, 0xFF, 0xFF, 0x01, 0xC3 }; вот он в асм виде Код (ASM): 0: 00 48 b8 add BYTE PTR [rax-0x48],cl ... b: 48 ba 00 00 00 00 00 movabs rdx,0x0 12: 00 00 00 15: 48 89 10 mov QWORD PTR [rax],rdx 18: 48 ba 00 00 00 00 00 movabs rdx,0x0 1f: 00 00 00 22: 48 89 50 08 mov QWORD PTR [rax+0x8],rdx 26: 48 83 ec 28 sub rsp,0x28 2a: 48 ba 01 00 00 00 00 movabs rdx,0x1 31: 00 00 00 34: ff 15 02 00 00 00 call QWORD PTR [rip+0x2] # 0x3c 3a: eb 08 jmp 0x44 ... 44: 48 83 c4 28 add rsp,0x28 48: 48 31 c0 xor rax,rax 4b: c6 05 ae ff ff ff 01 mov BYTE PTR [rip+0xffffffffffffffae],0x1 # 0x0 52: c3 ret Код (C++): PVOID PeekMessageW = (PVOID)PAGE_ALIGN(user32Dll.BaseImage + 105184);//GetProcAddress(user32Dll.BaseImage, "PeekMessageW"); LOG_WARNING("PeekMessageW in game %p", PeekMessageW); BYTE shellcode[] = { //hook 0x00, 0x48, 0xB8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x10, 0x48, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x89, 0x50, 0x08, 0x48, 0x83, 0xEC, 0x28, 0x48, 0xBA, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x15, 0x02, 0x00, 0x00, 0x00, 0xEB, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x83, 0xC4, 0x28, 0x48, 0x31, 0xC0, 0xC6, 0x05, 0xAE, 0xFF, 0xFF, 0xFF, 0x01, 0xC3 }; *(PVOID*)(&shellcode[3]) = PeekMessageW; TAEGET_MEMORY data = { 0 }; data.pId = InjectData.pId; data.pAdress = (ULONGLONG)PeekMessageW; data.iSize = sizeof(ULONG64); data.pBuffer = (ULONGLONG)(&shellcode[13]); status = ReadMemory(&data); data = { 0 }; data.pId = InjectData.pId; data.pAdress = (ULONGLONG)PeekMessageW + sizeof(ULONG64); data.iSize = sizeof(ULONG64); data.pBuffer = (ULONGLONG)(&shellcode[26]); status = ReadMemory(&data); *(PVOID*)(&shellcode[60]) = (PVOID)(allocateMemory.address + dllHeader->OptionalHeader.AddressOfEntryPoint); LOG_WARNING("AddressOfEntryPoint %p", (PVOID)(allocateMemory.address + dllHeader->OptionalHeader.AddressOfEntryPoint)); data = { 0 }; data.pId = InjectData.pId; data.pAdress = allocateMemory.address + allocateMemory.size - sizeof(shellcode); data.iSize = sizeof(shellcode); data.pBuffer = (ULONGLONG)(&shellcode); status = WriteMemory(&data); BYTE jump[14] = { 0xFF, 0x25, 0x00, 0x00, 0x00, 0x00 }; *(PVOID*)(&jump[6]) = (PVOID)(data.pAdress + 1); SIZE_T ViewSize = 2 * sizeof(ULONG64); ULONG oldProt = 0; status = ZwProtectVirtualMemory(ZwCurrentProcess(), &PeekMessageW, &ViewSize, PAGE_EXECUTE_READWRITE, &oldProt); LOG_WARNING("ZwProtectVirtualMemory %p", status); data = { 0 }; data.pId = InjectData.pId; data.pAdress = (ULONGLONG)PeekMessageW; data.iSize = sizeof(jump); data.pBuffer = (ULONGLONG)jump; status = WriteMemory(&data); шелл код
accord, а можно более детальней описать, то что вы сделали? Ну т.е. выложить ту ДЛЛ, которую вы патчили и т.д. и т.п. Чтобы взять на практике все пробовать и получить\увидеть результат: что было до и что стало после. Если, конечно, это не что-то секретное и если вам это не в тягость. P.S. Извиняюсь, если что, за свое дилетантство - никогда такое не делал, но планирую.
Я, конечно, понимаю, что краткость сестра таланта, но не до такой же степени. Мне еще у Инди нравится фраза, которую он раньше частенько использовал: "техзадание составлено неверно, поэтому вопрос смысла не имеет". Еще можно послать в гугл или сделать вид, что не заметил пост с вопросом. Да способов масса - было б желание, а способ и повод всегда можно найти и придумать.