Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
60
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.31 KB | None | 0 0
  1.   public struct Direct3D
  2.     {
  3.         public static uint Direct3D9__Device = 0x98BCDC;
  4.         public static uint Direct3D9__Device__OffsetA = 0x27C4;
  5.         public static uint Direct3D9__Device__OffsetB = 0xA8;
  6.     }
  7.     public class HookManager
  8.     {
  9.         private BlackMagic process;
  10.  
  11.         private bool mainThreadHooked;
  12.         private bool ExecutingCode;
  13.  
  14.         private uint codeCave;
  15.         private uint injectionAddress;
  16.         private uint returnAddress;
  17.  
  18.         public HookManager(BlackMagic process)
  19.         {
  20.             this.process = process;
  21.  
  22.             this.mainThreadHooked = false;
  23.             this.ExecutingCode = false;
  24.  
  25.             this.codeCave = 0;
  26.             this.injectionAddress = 0;
  27.             this.returnAddress = 0;
  28.         }
  29.  
  30.         private void HookApplication()
  31.         {
  32.             if (!process.IsProcessOpen)
  33.                 throw new Exception("Process is not open");
  34.  
  35.             uint baseAddress = (uint)process.MainModule.BaseAddress;
  36.             uint pDevice = process.ReadUInt(baseAddress + Direct3D.Direct3D9__Device);
  37.             uint pEnd = process.ReadUInt(pDevice + Direct3D.Direct3D9__Device__OffsetA);
  38.             uint pScene = process.ReadUInt(pEnd);
  39.             uint pEndScene = process.ReadUInt(pScene + Direct3D.Direct3D9__Device__OffsetB);
  40.  
  41.             if (process.ReadUInt(pEndScene) == 0xE9 && (codeCave == 0 || injectionAddress == 0))
  42.             {
  43.                 DisposeOfHook();
  44.             }
  45.             if (process.ReadUInt(pEndScene) != 0xE9)
  46.             {
  47.                 try
  48.                 {
  49.                     mainThreadHooked = false;
  50.  
  51.                     codeCave = process.AllocateMemory(2048);
  52.                     injectionAddress = process.AllocateMemory(0x4);
  53.  
  54.                     process.WriteInt(injectionAddress, 0);
  55.  
  56.                     returnAddress = process.AllocateMemory(0x4);
  57.                     process.WriteInt(returnAddress, 0);
  58.  
  59.                     process.Asm.Clear();
  60.  
  61.                     process.Asm.AddLine("mov edi, edi");
  62.                     process.Asm.AddLine("push ebp");
  63.                     process.Asm.AddLine("mov ebp, esp");
  64.  
  65.                     process.Asm.AddLine("pushfd");
  66.                     process.Asm.AddLine("pushad");
  67.                    
  68.                     //Test for waiting code?
  69.                     process.Asm.AddLine("mov eax, [" + injectionAddress + "]");
  70.                     process.Asm.AddLine("test eax, ebx");
  71.                     process.Asm.AddLine("je @out");
  72.  
  73.                     //Execute waiting code
  74.                     process.Asm.AddLine("mov eax, [" + injectionAddress + "]");
  75.                     process.Asm.AddLine("call eax");
  76.  
  77.                     //Copy pointer to return value
  78.                     process.Asm.AddLine("mov [" + returnAddress + "], eax");
  79.  
  80.                     process.Asm.AddLine("mov edx, " + injectionAddress);
  81.                     process.Asm.AddLine("mov ecx, 0");
  82.                     process.Asm.AddLine("mov [edx], ecx");
  83.  
  84.                     //Close Function
  85.                     process.Asm.AddLine("@out:");
  86.  
  87.                     //Inject Code
  88.                     uint sizeAsm = (uint)(process.Asm.Assemble().Length);
  89.  
  90.                     process.Asm.Inject(codeCave);
  91.  
  92.                     int sizeJumpBack = 5;
  93.  
  94.                     // create jump back stub
  95.                     process.Asm.Clear();
  96.                     process.Asm.AddLine("jmp " + (pEndScene + sizeJumpBack));
  97.                     process.Asm.Inject(codeCave + sizeAsm);// + (uint)sizeJumpBack);
  98.  
  99.                     // create hook jump
  100.                     process.Asm.Clear(); // $jmpto
  101.                     process.Asm.AddLine("jmp " + (codeCave));
  102.                     process.Asm.Inject(pEndScene);
  103.  
  104.                 }
  105.                 catch
  106.                 {
  107.                     mainThreadHooked = false; return;
  108.                 }
  109.                 mainThreadHooked = true;
  110.             }
  111.  
  112.         }
  113.         private void DisposeOfHook()
  114.         {
  115.             if (!process.IsProcessOpen)
  116.                 throw new Exception("Process is not open");
  117.  
  118.             uint baseAddress = (uint)process.MainModule.BaseAddress;
  119.             uint pDevice = process.ReadUInt(baseAddress + Direct3D.Direct3D9__Device);
  120.             uint pEnd = process.ReadUInt(pDevice + Direct3D.Direct3D9__Device__OffsetA);
  121.             uint pScene = process.ReadUInt(pEnd);
  122.             uint pEndScene = process.ReadUInt(pScene + Direct3D.Direct3D9__Device__OffsetB);
  123.  
  124.             try
  125.             {
  126.                 if (process.ReadByte(pEndScene) == 0xE9) // check if wow is already hooked and dispose Hook
  127.                 {
  128.                     // Restore origine endscene:
  129.                     process.Asm.Clear();
  130.                     process.Asm.AddLine("mov edi, edi");
  131.                     process.Asm.AddLine("push ebp");
  132.                     process.Asm.AddLine("mov ebp, esp");
  133.                     process.Asm.Inject(pEndScene);
  134.                 }
  135.  
  136.                 // free memory:
  137.                 process.FreeMemory(codeCave);
  138.                 process.FreeMemory(injectionAddress);
  139.                 process.FreeMemory(returnAddress);
  140.             }
  141.             catch
  142.             {
  143.             }
  144.         }
  145.  
  146.         public byte[] InjectAndExecute(string[] asm)
  147.         {
  148.             while (ExecutingCode)
  149.             {
  150.                 System.Threading.Thread.Sleep(5);
  151.             }
  152.  
  153.             ExecutingCode = true;
  154.  
  155.             HookApplication();
  156.  
  157.             byte[] tempsByte = new byte[0];
  158.  
  159.             // reset return value pointer
  160.             process.WriteInt(returnAddress, 0);
  161.  
  162.             if (process.IsProcessOpen && mainThreadHooked)
  163.             {
  164.                 // Write the asm stuff
  165.                 process.Asm.Clear();
  166.                 foreach (string tempLineAsm in asm)
  167.                 {
  168.                     process.Asm.AddLine(tempLineAsm);
  169.                 }
  170.  
  171.                 // Allocation Memory
  172.                 int codeSize = process.Asm.Assemble().Length;
  173.                 uint injectionAsm_Codecave = process.AllocateMemory(codeSize);
  174.  
  175.  
  176.                 try
  177.                 {
  178.                     // Inject
  179.                     process.Asm.Inject(injectionAsm_Codecave);
  180.                     process.WriteInt(injectionAddress, (int)injectionAsm_Codecave);
  181.  
  182.                     // Wait to launch code
  183.                     while (process.ReadInt(injectionAddress) > 0)
  184.                     {
  185.                         System.Threading.Thread.Sleep(5);
  186.                     }
  187.  
  188.                     byte Buf = new Byte();
  189.                     List<byte> retnByte = new List<byte>();
  190.                     uint dwAddress = process.ReadUInt(returnAddress);
  191.                     Buf = process.ReadByte(dwAddress);
  192.                     while (Buf != 0)
  193.                     {
  194.                         retnByte.Add(Buf);
  195.                         dwAddress = dwAddress + 1;
  196.                         Buf = process.ReadByte(dwAddress);
  197.                     }
  198.                     tempsByte = retnByte.ToArray();
  199.                 }
  200.                 catch { }
  201.  
  202.                 // Free memory allocated
  203.                 process.FreeMemory(injectionAsm_Codecave);
  204.             }
  205.  
  206.             DisposeOfHook();
  207.  
  208.             ExecutingCode = false;
  209.  
  210.             return tempsByte;
  211.         }
  212.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement