Advertisement
Guest User

Untitled

a guest
Jan 18th, 2018
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.71 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Reflection;
  5. using System.Runtime.InteropServices;
  6. using ZzukBot.Authentication;
  7. using ZzukBot.ExtensionMethods;
  8. using ZzukBot.Server.AuthClient;
  9. using Ptr = ZzukBot.Constants.Offsets;
  10.  
  11. namespace ZzukBot.Mem.AntiWarden
  12. {
  13.     internal static class HookWardenMemScan
  14.     {
  15.         /// <summary>
  16.         ///     Delegate to our c# function we will jmp to
  17.         /// </summary>
  18.         private static WardenMemCpyDelegate _wardenMemCpyDelegate;
  19.  
  20.         /// <summary>
  21.         ///     Delegate to our c# function we will jmp to
  22.         /// </summary>
  23.         private static WardenPageScanDelegate _wardenPageScanDelegate;
  24.  
  25.         /// <summary>
  26.         ///     First 5 bytes of Wardens Memscan function
  27.         /// </summary>
  28.         private static readonly byte[] MemScanOriginalBytes = {0x56, 0x57, 0xFC, 0x8B, 0x54};
  29.  
  30.         private static readonly byte[] PageScanOriginalBytes = {0x8B, 0x45, 0x08, 0x8A, 0x04};
  31.  
  32.         /// <summary>
  33.         ///     Is Wardens Memscan modified?
  34.         /// </summary>
  35.         private static IntPtr WardensMemScanFuncPtr = IntPtr.Zero;
  36.  
  37.         private static IntPtr WardensPageScanFuncPtr = IntPtr.Zero;
  38.  
  39.         private static IntPtr WardenMemCpyDetourPtr = IntPtr.Zero;
  40.         private static IntPtr WardenPageScanDetourPtr = IntPtr.Zero;
  41.  
  42.         private static IntPtr AddrToWardenMemCpy = IntPtr.Zero;
  43.         private static IntPtr AddrToWardenPageScan = IntPtr.Zero;
  44.  
  45.         /// <summary>
  46.         ///     Delegate to our C# function
  47.         /// </summary>
  48.         private static readonly ModifyWardenDetour _modifyWarden;
  49.  
  50.         /// <summary>
  51.         ///     A private list to keep track of all hacks registered
  52.         /// </summary>
  53.         private static readonly List<Hack> Hacks = new List<Hack>();
  54.  
  55.         static HookWardenMemScan()
  56.         {
  57.             Console.WriteLine("HookWardenMemScan created");
  58.             _modifyWarden = DisableWarden;
  59.             // get PTR for our c# function
  60.             var addrToDetour = Marshal.GetFunctionPointerForDelegate(_modifyWarden);
  61.             string[] asmCode =
  62.             {
  63.                 SendOvers.WardenLoadDetour[0],
  64.                 SendOvers.WardenLoadDetour[1],
  65.                 SendOvers.WardenLoadDetour[2],
  66.                 SendOvers.WardenLoadDetour[3],
  67.                 SendOvers.WardenLoadDetour[4].Replace("[|addr|]", ((uint)addrToDetour).ToString()),
  68.                 SendOvers.WardenLoadDetour[5],
  69.                 SendOvers.WardenLoadDetour[6],
  70.                 SendOvers.WardenLoadDetour[7],
  71.             };
  72.             var wardenDetour = Memory.InjectAsm(asmCode, "WardenLoadDetour");
  73.             Memory.InjectAsm(0x006CA22E, "jmp " + wardenDetour, "WardenLoadDetourJmp");
  74.         }
  75.  
  76.         /// <summary>
  77.         ///     Init the hack
  78.         /// </summary>
  79.         [Obfuscation(Feature = "virtualization", Exclude = false)]
  80.         private static void DisableWarden(IntPtr parWardenPtr1)
  81.         {
  82.             //var second = Memory.Reader.Read<IntPtr>(parWardenPtr1);
  83.             var wardenModuleStart = parWardenPtr1.ReadAs<IntPtr>();
  84.             var memScanPtr = IntPtr.Add(wardenModuleStart, (int) Ptr.Warden.WardenMemScanStart);
  85.             var pageScanPtr = IntPtr.Add(wardenModuleStart, (int) Ptr.Warden.WardenPageScan);
  86.  
  87.             Console.WriteLine(pageScanPtr.ToString("X"));
  88.  
  89.             if (pageScanPtr != WardensPageScanFuncPtr)
  90.             {
  91.                 var CurrentBytes = Memory.Reader.ReadBytes(pageScanPtr, 5);
  92.                 //var CurrrentBytes = (tmpPtr).ReadAs<Byte>(); //How do I read 5 bytes?
  93.                 var isEqual = CurrentBytes.SequenceEqual(PageScanOriginalBytes);
  94.                 if (!isEqual) return;
  95.  
  96.                 if (AddrToWardenPageScan == IntPtr.Zero)
  97.                 {
  98.                     _wardenPageScanDelegate = WardenPageScanHook;
  99.                     AddrToWardenPageScan = Marshal.GetFunctionPointerForDelegate(_wardenPageScanDelegate);
  100.                     if (WardenPageScanDetourPtr == IntPtr.Zero)
  101.                     {
  102.                         // IntPtr readBase, int readOffset, IntPtr writeTo
  103.                         string[] asmCode =
  104.                         {
  105.                             SendOvers.WardenPageScanDetour[0],
  106.                             SendOvers.WardenPageScanDetour[1],
  107.                             SendOvers.WardenPageScanDetour[2],
  108.                             SendOvers.WardenPageScanDetour[3],
  109.                             SendOvers.WardenPageScanDetour[4],
  110.                             SendOvers.WardenPageScanDetour[5],
  111.                             SendOvers.WardenPageScanDetour[6],
  112.                             SendOvers.WardenPageScanDetour[7],
  113.                             SendOvers.WardenPageScanDetour[8],
  114.                             SendOvers.WardenPageScanDetour[9].Replace("[|addr|]", ((uint)AddrToWardenPageScan).ToString()),
  115.                             SendOvers.WardenPageScanDetour[10],
  116.                             SendOvers.WardenPageScanDetour[11],
  117.                             SendOvers.WardenPageScanDetour[12],
  118.                             SendOvers.WardenPageScanDetour[13].Replace("[|addr|]", ((uint)wardenModuleStart + 0x2B2C).ToString())
  119.                         };
  120.                         WardenPageScanDetourPtr = Memory.InjectAsm(asmCode, "WardenPageScanDetour");
  121.                     }
  122.                 }
  123.  
  124.                 Memory.InjectAsm((uint) pageScanPtr,
  125.                     "jmp 0x" + WardenPageScanDetourPtr.ToString("X"),
  126.                     "WardenPageScanJmp");
  127.                 WardensPageScanFuncPtr = pageScanPtr;
  128.             }
  129.  
  130.             if (memScanPtr != WardensMemScanFuncPtr)
  131.             {
  132.                 var CurrentBytes = Memory.Reader.ReadBytes(memScanPtr, 5);
  133.                 //var CurrrentBytes = (tmpPtr).ReadAs<Byte>(); //How do I read 5 bytes?
  134.                 var isEqual = CurrentBytes.SequenceEqual(MemScanOriginalBytes);
  135.                 if (!isEqual) return;
  136.  
  137.                 if (AddrToWardenMemCpy == IntPtr.Zero)
  138.                 {
  139.                     _wardenMemCpyDelegate = WardenMemCpyHook;
  140.                     AddrToWardenMemCpy = Marshal.GetFunctionPointerForDelegate(_wardenMemCpyDelegate);
  141.  
  142.                     if (WardenMemCpyDetourPtr == IntPtr.Zero)
  143.                     {
  144.                         string[] asmCodeOnline =
  145.                         {
  146.                             SendOvers.WardenMemCpyDetour[0],
  147.                             SendOvers.WardenMemCpyDetour[1],
  148.                             SendOvers.WardenMemCpyDetour[2],
  149.                             SendOvers.WardenMemCpyDetour[3],
  150.                             SendOvers.WardenMemCpyDetour[4],
  151.                             SendOvers.WardenMemCpyDetour[5],
  152.                             SendOvers.WardenMemCpyDetour[6],
  153.                             SendOvers.WardenMemCpyDetour[7],
  154.                             SendOvers.WardenMemCpyDetour[8],
  155.                             SendOvers.WardenMemCpyDetour[9],
  156.                             SendOvers.WardenMemCpyDetour[10],
  157.                             SendOvers.WardenMemCpyDetour[11],
  158.                             SendOvers.WardenMemCpyDetour[12],
  159.                             SendOvers.WardenMemCpyDetour[13].Replace("[|addr|]", "0x" + ((uint) AddrToWardenMemCpy).ToString("X")),
  160.                             SendOvers.WardenMemCpyDetour[14],
  161.                             SendOvers.WardenMemCpyDetour[15],
  162.                             SendOvers.WardenMemCpyDetour[16],
  163.                             SendOvers.WardenMemCpyDetour[17],
  164.                             SendOvers.WardenMemCpyDetour[18].Replace("[|addr|]", "0x" + ((uint) (memScanPtr + 0x24)).ToString("X"))
  165.                         };
  166.                         WardenMemCpyDetourPtr = Memory.InjectAsm(asmCodeOnline, "WardenMemCpyDetour");
  167.                     }
  168.                 }
  169.  
  170.                 Memory.InjectAsm((uint) memScanPtr, "jmp 0x" + WardenMemCpyDetourPtr.ToString("X"), "WardenMemCpyJmp");
  171.                 WardensMemScanFuncPtr = memScanPtr;
  172.             }
  173.         }
  174.  
  175.         /// <summary>
  176.         ///     add a hack to the list from the outside
  177.         ///     hack contains: original bytes, bytes we inject, the address we inject to
  178.         /// </summary>
  179.         internal static void AddHack(Hack parHack)
  180.         {
  181.             if (Hacks.All(i => i.Address != parHack.Address))
  182.             {
  183.                 RemoveHack(parHack.Name);
  184.                 Hacks.Add(parHack);
  185.             }
  186.         }
  187.  
  188.         internal static void RemoveHack(string parName)
  189.         {
  190.             var hack = Hacks.Where(i => i.Name == parName).ToList();
  191.             foreach (var x in hack)
  192.                 x.Remove();
  193.             Hacks.RemoveAll(i => i.Name == parName);
  194.         }
  195.  
  196.         internal static void RemoveHack(IntPtr parAddress)
  197.         {
  198.             var hack = Hacks.Where(i => i.Address == parAddress).ToList();
  199.             foreach (var x in hack)
  200.                 x.Remove();
  201.             Hacks.RemoveAll(i => i.Address == parAddress);
  202.         }
  203.  
  204.         internal static Hack GetHack(string parName)
  205.         {
  206.             return Hacks.FirstOrDefault(i => i.Name == parName);
  207.         }
  208.  
  209.         internal static Hack GetHack(IntPtr parAddress)
  210.         {
  211.             return Hacks.FirstOrDefault(i => i.Address == parAddress);
  212.         }
  213.  
  214.  
  215.         private static void WardenPageScanHook(IntPtr readBase, int readOffset, IntPtr writeTo)
  216.         {
  217.             var readByteFrom = readBase + readOffset;
  218.  
  219.             var activeHacks = Hacks.Where(x => x.IsActivated && x.IsWithinScan(readByteFrom, 1)).ToList();
  220.             activeHacks.ForEach(x =>
  221.             {
  222.                 x.Remove();
  223.                 Console.WriteLine($@"[PageScan] Disabling {x.Name} at {x.Address.ToString("X")}");
  224.             });
  225.             var myByte = Memory.Reader.Read<byte>(readByteFrom);
  226.             Memory.Reader.Write(writeTo, myByte);
  227.  
  228.             activeHacks.ForEach(x => x.Apply());
  229.         }
  230.  
  231.         /// <summary>
  232.         ///     Will be called from our ASM stub
  233.         ///     will check if the scanned addr range contains any registered hack
  234.         ///     if yes: restore original byte for the hack
  235.         ///     do the scan
  236.         ///     restore back to the "hacked" state
  237.         /// </summary>
  238.         private static void WardenMemCpyHook(IntPtr addr, int size, IntPtr bufferStart)
  239.         {
  240.             if (size != 0)
  241.             {
  242.                 // LINQ to get all affected hacks
  243.                 var match = Hacks
  244.                     .Where(i => i.Address.ToInt32() <= IntPtr.Add(addr, size).ToInt32()
  245.                                 && i.Address.ToInt32() >= addr.ToInt32())
  246.                     .ToList();
  247.  
  248.                 var ActiveHacks = new List<Hack>();
  249.                 foreach (var x in match)
  250.                 {
  251.                     if (!x.IsActivated) continue;
  252.                     ActiveHacks.Add(x);
  253.                     x.Remove();
  254.                 }
  255.                 // Do the memscan
  256.                 Memory.Reader.WriteBytes(bufferStart, Memory.Reader.ReadBytes(addr, size));
  257.                 // reapply
  258.                 ActiveHacks.ForEach(i => i.Apply());
  259.             }
  260.         }
  261.  
  262.  
  263.         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
  264.         private delegate void ModifyWardenDetour(IntPtr parWardenPtr);
  265.  
  266.         /// <summary>
  267.         ///     Delegate for our c# function
  268.         /// </summary>
  269.         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
  270.         private delegate void WardenMemCpyDelegate(IntPtr addr, int size, IntPtr bufferStart);
  271.  
  272.         [UnmanagedFunctionPointer(CallingConvention.StdCall)]
  273.         private delegate void WardenPageScanDelegate(IntPtr readBase, int readOffset, IntPtr writeTo);
  274.     }
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement