Beispiel #1
0
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);
}
Beispiel #2
0
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;
}