WoW 7.3.X Return Check menu

User Tag List

Results 1 to 7 of 7
  1. #1
    DarkLinux's Avatar Former Staff
    CoreCoins Purchaser Authenticator enabled
    Reputation
    1584
    Join Date
    May 2010
    Posts
    1,829
    Thanks G/R
    188/531
    Trade Feedback
    16 (100%)
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)

    WoW 7.3.X Return Check

    Started poking around some time back but never got around to seeing what they added to stop function calls. Below is part of GetLocalPlayer,

    0x000B70E4
    Code:
    push ebp
    mov ebp, esp
    sub esp, 0x10
    mov dword ptr [ebp - 8], 0x19b5c47
    mov edx, dword ptr [ebp + 4]			//Return Address
    push edi
    push esi
    mov dword ptr [ebp - 4], 0xd41000		//0xD40000 Image Base + 0x1000 Header
    cmp byte ptr [edx - 2], 0xff			//[edx - 2] = D4, ZF = 0
    sete cl						//cl = 0
    cmp byte ptr [edx - 3], 0xff			//[edx - 3] = 42, ZF = 0
    sete al						//al = 0
    or cl, al					//cl = 0
    cmp byte ptr [edx - 4], 0xff			//[edx - 4] = 48, ZF = 0
    sete al						//al = 0
    or cl, al					//cl = 0
    cmp byte ptr [edx - 6], 0xff			//[edx - 6] = C3, ZF = 0
    sete al						//al = 0
    or cl, al					//cl = 0
    cmp byte ptr [edx - 5], 0xe8			//[edx - 5] = E8, ZF = 1 <-- Main Check
    sete al						//al = 1
    or cl, al					//cl = 1
    cmp byte ptr [edx - 7], 0xff			//[edx - 7] = 5D, ZF = 0
    sete al						//al = 0
    or cl, al					//cl = 1
    je 0xdf7246					//Jump if ZF equal 1 (ZF = 0)
    cmp edx, dword ptr [ebp - 4]			//0x00d41000 > Return Address
    jb 0xdf7246					//Jump if above or equal Image Base + Some Size (not base off page type)
    cmp edx, dword ptr [ebp - 8]			//0x019b5c47 <= Return Address
    jae 0xdf7246
    As you can see they are checking if the caller is coming from inside wow and if the caller is using the opcode E8.

    I can only think of one reason that they are checking the caller, I'm guessing for ret hopping. But even then wow has some calls that still work like,

    00C74B04
    Code:
    call 004EDC9E+wow.exe
    ret
    Simple wrapper,
    Code:
    retAddress = 00C74B09h
    GetLocalPlayer = 00160767h
    -------------------------------------------------
    call SPOOF_RET
    jmp END
    SPOOF_RET:
    mov eax, retAddress
    push eax
    mov eax, GetLocalPlayer
    jmp eax
    END:
    Anyone know why they check for 0xFF? I feel like it just opens them up to more possibilities, as 2, 3, 4, 6 or 7 could be FF and bypass the E8 check.


    --edit

    nvm, skipped over

    Code:
    mov edx, dword ptr [ebp + 4]
    
    ....
    
    mov cl, byte ptr [edx - 5]
    cmp cl, 0xe8
    je 00EA094D
    mov al,[edx-07]
    cmp al, 0x9A
    je 00EA094D
    cmp al, 0xFF
    jne 00EA08D0
    Guess they check if its E8 or 9A Call. Then a 2nd check later.

    They also check the range again,
    Code:
    mov esi, dword ptr [0x19bd650] //Image Base Pointer
    ...
    mov eax, dword ptr [0x19bd654] //Image Size Pointer
    add eax, esi
    cmp edx, esi
    jb 0xea0dc6
    cmp edx, eax
    jae 0xea0dc6


    Does anyone have an idea what they are doing after the return check?

    Code:
    lea eax, dword ptr [ebp - 0x14]
    mov dword ptr [ebp - 0x14], 0x62a8cceb
    push eax //Arg2 0xC
    lea eax, dword ptr [ebp - 0x18]
    mov dword ptr [ebp - 0x18], 0x9da41324
    push eax //Arg1 0x8
    ....
    mov edx, dword ptr [ebp + 0xc] //-> 0x62a8cceb
    mov eax, 0xb821a50c
    mov esi, dword ptr fs:[0x20]   //Process ID
    mov ecx, dword ptr [edx] //0x62a8cceb
    ror ecx, 0xb
    sub eax, ecx
    mov dword ptr [edx], eax
    mov dword ptr [ebp + 0xc], 0x511e2d55
    lea ecx, dword ptr [ecx]
    mov edx, dword ptr [ebp + 8]  // -> 0x9da41324
    mov ecx, dword ptr [edx]      //0x9da41324
    imul ecx, esi
    not ecx
    xor ecx, 0x94d2769e
    xor dword ptr [edx], ecx
    I think its just returning a key.

    IDAs attemp,

    Code:
    int __cdecl sub_4071C0(_DWORD *a1, _DWORD *a2)
    {
      int v1; // ecx@1
      int result; // eax@1
    
      v1 = __ROR4__(*a2, 11);
      result = 0xB821A50C - v1;
      *a2 = 0xB821A50C - v1;
      *a1 ^= ~(__readfsdword(32) * *a1) ^ 0x94D2769E;
      return result;
    }
    
    ....
    
    DWORD __cdecl GetSomething(_DWORD *a1, _DWORD *a2)
    {
      int v1; // ecx@1
      int result; // eax@1
    
      //Caller Check
    
      v1 = __ROR4__(*a2, 11);
      result = 0xB821A50C - v1;
      *a2 = 0xB821A50C - v1;
      *a1 ^= ~(__readfsdword(32) * *a1) ^ 0x94D2769E;
      DWORD* _array = (DWORD*)0xFA31E0;
      
      DWORD unk1 = _array[result >> 14];
      DWORD unk1 = _array[result & 0xFFF];
    
    /* TO DO
    mov     esi, 0x11044FC+wow.exe
    mov     ebx, 1324h
    pop     ecx
    pop     ecx
    movzx   ecx, si
    mov     eax, ebx
    shr     esi, 10h
    sub     eax, ecx
    xor     esi, eax
    mov     edi, 511E2D55h
    shl     esi, 10h
    or      esi, ecx
    mov     edx, [ebp-14h]
    mov     eax, edx
    shr     eax, 14h
    and     edx, 0FFFh
    movzx   ecx, si
    shr     esi, 10h
    mov     eax, 0xFA31E0+wow.exe[eax]
    shr     eax, 10h
    ror     eax, 3
    add     eax, eax
    sub     eax, ecx
    xor     esi, eax
    mov     eax, 0xFA31E0+wow.exe[edx]
    shl     esi, 10h
    or      esi, ecx
    movzx   ecx, ax
    xor     esi, [ebp-18h]
    movzx   edx, si
    mov     eax, edx
    ror     ecx, 0Bh
    shr     esi, 10h
    not     eax
    xor     eax, ecx
    mov     [ebp-8], edi
    xor     esi, eax
    shl     esi, 10h
    or      esi, edxstc
    shr     dl, 0
    movzx   ecx, si
    mov     edi, 2768h
    shr     esi, 10h
    mov     eax, edi
    sub     eax, ecx
    xor     esi, eax
    shl     esi, 10h
    or      esi, ecx
    */
    }
    Last edited by DarkLinux; 01-21-2018 at 05:25 AM.

    WoW 7.3.X Return Check
  2. Thanks culino2, pogob, maper, squiggy, Alex__ (5 members gave Thanks to DarkLinux for this useful post)
  3. #2
    WiNiFiX's Avatar Banned
    Reputation
    242
    Join Date
    Jun 2008
    Posts
    447
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Unfortunately above my paygrade - but i can show you how to do it in pixels
    But thanks for posting your findings in public.

  4. #3
    air999's Avatar Contributor
    Reputation
    131
    Join Date
    Nov 2014
    Posts
    102
    Thanks G/R
    9/62
    Trade Feedback
    0 (0%)
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    This function, 0xB70E4 (WoW 25881 x32) is used to generate 2 keys to encrypt LocalPlayerBaseaddress, CTM positions and other critical info they want to hide from us.

    First key produced is allways constant, while second is generated using ImageBase or ProcessHeap for some randomisation.

    They also use special table with precomputed values, and first key is a pointer in this table.

    As for 0xFF value checking, it's opcode for jmp/call reg
    WoW 7.3.X Return Check-ff-gif

    The main question, why they check stack for this function?

  5. Thanks DarkLinux (1 members gave Thanks to air999 for this useful post)
  6. #4
    DarkLinux's Avatar Former Staff
    CoreCoins Purchaser Authenticator enabled
    Reputation
    1584
    Join Date
    May 2010
    Posts
    1,829
    Thanks G/R
    188/531
    Trade Feedback
    16 (100%)
    Mentioned
    6 Post(s)
    Tagged
    0 Thread(s)
    That's what I concluded after reversing a little more. Would like to know where you see ImageBase or ProcessHeap. I'm starting to think each client can be different. I have only seen Process ID being used. As for the 0xFF opcode, thanks, I did not even think of jmp/call.

  7. #5
    air999's Avatar Contributor
    Reputation
    131
    Join Date
    Nov 2014
    Posts
    102
    Thanks G/R
    9/62
    Trade Feedback
    0 (0%)
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)
    This is mine function. I think they patch this function at startup time after image extraction. So yes, it can be differ on each client.

    WoW 7.3.X Return Check-b7128-gif

  8. #6
    Zazazu's Avatar Contributor
    Reputation
    191
    Join Date
    Jun 2016
    Posts
    390
    Thanks G/R
    5/143
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by DarkLinux View Post
    I'm starting to think each client can be different.
    Originally Posted by air999 View Post
    So yes, it can be differ on each client.
    Does this mean that Blizz order the players base by the wow-client for detect what same accounts uses this client....

    PS: This is a rhetorical question

  9. #7
    MaiN's Avatar Elite User
    Reputation
    335
    Join Date
    Sep 2006
    Posts
    1,047
    Thanks G/R
    0/10
    Trade Feedback
    0 (0%)
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Originally Posted by air999 View Post
    This is mine function. I think they patch this function at startup time after image extraction. So yes, it can be differ on each client.

    WoW 7.3.X Return Check-b7128-gif
    Indeed, this is correct. There are 16 different variants. The variant is selected pseudorandomly for each machine based on the total amount of RAM available.
    The variants makes it much harder for someone to implement the encryption/decryption out of process, or even call it from inside the process.
    [16:15:41] Cypher: caus the CPU is a dick
    [16:16:07] kynox: CPU is mad
    [16:16:15] Cypher: CPU is all like
    [16:16:16] Cypher: whatever, i do what i want

Similar Threads

  1. [Buying] Lynnshop buying all wow gold (us/eu) now.check here~~main payment way =pp/wu
    By lynnshop in forum World of Warcraft Buy Sell Trade
    Replies: 4
    Last Post: 12-21-2012, 03:37 PM
  2. Replies: 6
    Last Post: 09-08-2012, 03:22 AM
  3. Replies: 7
    Last Post: 08-06-2010, 01:57 AM
  4. Izo WoW 3.3.3a Just Check It You Might Like It :D
    By Nocommentte in forum WoW Emulator Server Listings
    Replies: 0
    Last Post: 06-10-2010, 10:14 PM
  5. [Release] WoW Phisher w/ WORKING LOGIN CHECK
    By mjmorrell3 in forum WoW Scam Prevention
    Replies: 17
    Last Post: 11-09-2008, 04:09 AM
All times are GMT -5. The time now is 06:27 PM. Powered by vBulletin® Version 4.2.3
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved. User Alert System provided by Advanced User Tagging (Pro) - vBulletin Mods & Addons Copyright © 2024 DragonByte Technologies Ltd.
Digital Point modules: Sphinx-based search