void xxl_maps_init(void) { // render_minimap: 74 3A 80 BE DA 00 00 00 00 unsigned char mem_render_minimap[] = { 0x74, 0x3A, // JE SHORT <+0x34> 0x80, 0xBE, 0xDA, 0x00, 0x00, 0x00, 0x00 // CMP BYTE PTR DS : [ESI + 0DA], 0 }; unsigned int off_render_minimap = -0x55; orig_render_minimap = hook_find_by_needle(NULL, mem_render_minimap, sizeof(mem_render_minimap)) + off_render_minimap; // Patch away minimap rendering to prevent crash on XXL maps unsigned char patch_render_minimap[] = { 0xC2, 0x18, 0x00 }; // RETN 18 DWORD dwOldProtect = 0; VirtualProtect((LPVOID)orig_render_minimap, sizeof(patch_render_minimap), PAGE_EXECUTE_READWRITE, &dwOldProtect); memcpy(orig_render_minimap, patch_render_minimap, sizeof(patch_render_minimap)); VirtualProtect((LPVOID)orig_render_minimap, sizeof(patch_render_minimap), dwOldProtect, &dwOldProtect); }
void stack_split_init(void) { /////////////////////////////////////////////////////////////////////////////////////////////// // hero_select_stack: 8B 01 75 44 /////////////////////////////////////////////////////////////////////////////////////////////// unsigned char mem_hero_select_stack[] = { 0x8B, 0x01, // MOV EAX, DWORD PTR DS : [ECX] 0x75, 0x44 }; // JNE SHORT <+0x44> int off_hero_select_stack = -0x21; /////////////////////////////////////////////////////////////////////////////////////////////// // town_select_stack: 83 F8 09 0F 87 EE 03 00 00 /////////////////////////////////////////////////////////////////////////////////////////////// unsigned char mem_town_select_stack[] = { 0x83, 0xF8, 0x09, // CMP EAX, 9 0x0F, 0x87, 0xEE, 0x03, 0x00, 0x00 }; // JA <+0x3F4> int off_town_select_stack = -0x0F; /////////////////////////////////////////////////////////////////////////////////////////////// // swap_select_stack: 8A 84 07 88 C8 00 00 3A 84 1F 88 C8 00 00 0F 94 C0 /////////////////////////////////////////////////////////////////////////////////////////////// unsigned char mem_swap_select_stack[] = { 0x8A, 0x84, 0x07, 0x88, 0xC8, 0x00, 0x00, // MOV AL, [EDI + EAX + 0x0C888] 0x3A, 0x84, 0x1F, 0x88, 0xC8, 0x00, 0x00, // CMP AL, [EDI + EBX + 0x0C888] 0x0F, 0x94, 0xC0 }; // SETZ AL int off_swap_select_stack = -0x33; /////////////////////////////////////////////////////////////////////////////////////////////// // move_stack: 89 04 99 8B 44 B7 1C /////////////////////////////////////////////////////////////////////////////////////////////// unsigned char mem_move_stack[] = { 0x89, 0x04, 0x99, // MOV DWORD PTR DS : [EBX * 4 + ECX], EAX 0x8B, 0x44, 0xB7, 0x1C // MOV EAX, [EDI + ESI * 4 + 0x1C] }; int off_move_stack = -0x19; /////////////////////////////////////////////////////////////////////////////////////////////// // swap_move_stack: 8B 41 50 81 C6 8D 00, 00, 00 /////////////////////////////////////////////////////////////////////////////////////////////// unsigned char mem_swap_move_stack[] = { 0x8B, 0x41, 0x50, // MOV EAX, [ECX+0x50] 0x81, 0xC6, 0x8D, 0x00, 0x00, 0x00 // ADD ESI, 0x8D }; int off_swap_move_stack = -0x26; /////////////////////////////////////////////////////////////////////////////////////////////// // retn_hero_select_stack: 81 C1 8D 00 00 00 51 52 // NOTE! This is a retn address, not a function, and should be at this mov (addresses dynamic ofc): // mov dword ptr ds:12CBDF0h, 0FFFFFFFFh // call sub_4D8DC0 // jmp loc_4DCEAF /////////////////////////////////////////////////////////////////////////////////////////////// unsigned char mem_retn_hero_select_stack[] = { 0x81, 0xC1, 0x8D, 0x00, 0x00, 0x00, // ADD ECX, 0x8D 0x51, // PUSH ECX 0x52 // PUSH EDX }; int off_retn_hero_select_stack = 0x0D; /////////////////////////////////////////////////////////////////////////////////////////////// HOOK_NEEDLE_FAIL_MSG(NULL, hero_select_stack); HOOK_NEEDLE_FAIL_MSG(NULL, town_select_stack); HOOK_NEEDLE_FAIL_MSG(NULL, swap_select_stack); HOOK_NEEDLE_FAIL_MSG(NULL, move_stack); HOOK_NEEDLE_FAIL_MSG(NULL, swap_move_stack); retn_hero_select_stack = hook_find_by_needle(NULL, mem_retn_hero_select_stack, sizeof(mem_retn_hero_select_stack)) + off_retn_hero_select_stack; }