using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Diagnostics; using System.Threading; namespace HaloHBF { public partial class Form1 : Form { private MemoryHandler memHandler = new MemoryHandler(); private List ptable = new List(30); private int myAddy = 0; private int myHotkey = 0x10; private int aimingAddy = 0; private bool aimOn = true, drawLead = true, injected = false; /*change the trial lead here Halo FV is 7, * but trial is bigger, so make it 8 or 9*/ private float lead = 9; public struct vect2d { public float h; public float v; } public struct vect3d { public float x; public float y; public float z; } public Form1() { InitializeComponent(); } private bool findHalo() { if (memHandler.ProcessRunning) return true; return memHandler.setProcessByTitle("Halo"); } private int getClosestPlayerAddy() { int closestAddy = -1; double shortestDist = 0; vect3d myVect = getMyCoords(); vect3d playerVect; float maxFov = float.Parse(txtFov.Text); for (int i = 0; i < ptable.Count; i++) { playerVect = getPlayerVect(ptable[i]); if (ptable[i] == myAddy) continue; double dist = getAngleDistance(getMouse(), get2dVect(myVect, playerVect)); if (dist > maxFov) continue; if (dist != 0 /* not ourselves */ && (dist < shortestDist || shortestDist == 0)) { shortestDist = dist; closestAddy = ptable[i]; } } return closestAddy; } private vect2d get2dVect(vect3d vect1, vect3d vect2) { vect2d resVect = new vect2d(); float dx = vect2.x - vect1.x, dy = vect2.y - vect1.y, dz = vect2.z - vect1.z; float divisor = (float)Math.Sqrt(dx * dx + dy * dy); resVect.v = (float)Math.Atan2(dz, divisor == 0 ? 0.0001F : divisor); // don't want divide by zero for tan divisor = dx; if (divisor == 0) divisor = 0.0001F; // we use abs here since we are going to offset the angle by quandrants below resVect.h = (float)Math.Atan(Math.Abs(dy) / Math.Abs(divisor)); // quad 1 if (dx > 0 && dy >= 0) ; // quad 2 if (dx < 0 && dy >= 0) resVect.h = (float)(Math.PI - resVect.h); // quad 3 if (dx < 0 && dy < 0) resVect.h = (float)(Math.PI + resVect.h); // quad 4 if (dx > 0 && dy < 0) resVect.h = (float)(2 * Math.PI - resVect.h); return resVect; } public float getAngleDistance(vect2d vect1, vect2d vect2) { return (float)(60 * Math.Acos(Math.Sin(vect1.v) * Math.Sin(vect2.v) + Math.Cos(vect1.v) * Math.Cos(vect2.v) * Math.Cos(vect2.h - vect1.h))); } private double get3dDistance(vect3d vect1, vect3d vect2) { // 3d dist: sqrt((ax - bx)^2 + (ay - by)^2 + (az - bz)^2) return Math.Sqrt(Math.Pow(vect1.x - vect2.x, 2) + Math.Pow(vect1.y - vect2.y, 2) + Math.Pow(vect1.z - vect2.z, 2)); } #region halomemfunc public bool inMenu() { return memHandler.readMemoryByte(0x00718EBC) != 0x0; } private void trapMouse() { memHandler.WriteProcessMemory(0x4722DA, new byte[] { 0x90, 0x90, 0x90 }); memHandler.WriteProcessMemory(0x47277A, new byte[] { 0x90, 0x90, 0x90 }); memHandler.WriteProcessMemory(0x4727B4, new byte[] { 0x90, 0x90, 0x90 }); } private void releaseMouse() { memHandler.WriteProcessMemory(0x4722DA, new byte[] { 0xD9, 0x5F, 0x0C }); memHandler.WriteProcessMemory(0x47277A, new byte[] { 0xD9, 0x57, 0x10 }); memHandler.WriteProcessMemory(0x4727B4, new byte[] { 0xD9, 0x5F, 0x10 }); } private vect2d getMouse() { vect2d mVect = new vect2d(); mVect.h = memHandler.readMemoryFloat(0x4BD7D4B8); mVect.v = memHandler.readMemoryFloat(0x4BD7D4BC); return mVect; } private void setMouse(vect2d mVect) { memHandler.writeMemoryFloat(0x4BD7D4B8, mVect.h); memHandler.writeMemoryFloat(0x4BD7D4BC, mVect.v); } private bool inVehicle() { return memHandler.readMemoryByte(0x6A3970) != 0x00; } /*Beginning of Player Table. Gets the x,y,z coords of each player*/ private vect3d getMyCoords() { vect3d tVect = new vect3d(); tVect.x = memHandler.readMemoryFloat(0x6A3964); tVect.y = memHandler.readMemoryFloat(0x6A3968); tVect.z = memHandler.readMemoryFloat(0x6A396C); return tVect; } public string getCurrentMap() { byte[] buf; int read = memHandler.ReadProcessMemory(0x400001E8, 13, out buf); return Encoding.ASCII.GetString(buf, 0, read); } public vect3d getPlayerVect(int playerLocAddy) { vect3d tVect = new vect3d(); tVect.x = memHandler.readMemoryFloat(playerLocAddy); tVect.y = memHandler.readMemoryFloat(playerLocAddy + 4); tVect.z = memHandler.readMemoryFloat(playerLocAddy + 8); return tVect; } public vect3d getPlayerVectOffsets(int playerLocAddy) { vect3d tVect = new vect3d(); tVect.x = memHandler.readMemoryFloat(playerLocAddy + 12); tVect.y = memHandler.readMemoryFloat(playerLocAddy + 16); tVect.z = memHandler.readMemoryFloat(playerLocAddy + 20); return tVect; } #endregion private void updatePlayerList() { // sanity and menu check if (!memHandler.ProcessRunning || inMenu()) return; /*1st line of code is the code-cave and ASM injection. * 2nd line is the jmp to the code-cave. * The 2nd line jmps to 1st, then back and continues on with halo.*/ if (!injected) { injected = true; memHandler.WriteProcessMemory(0x40034C, hexToBytes("A344034000A14803400089900006400083F850740583C004EB05B800000000A348034000A144 034000891A8942046A0051897208E96F881500")); memHandler.WriteProcessMemory(0x558BE9, hexToBytes("E95E77EAFF909090909090")); } // grabs addresses from the injected output and stores them in adr int[] adr = new int[20]; for (int i = 0; i < adr.Length; i++) adr[i] = memHandler.readMemoryInt(0x400600 + (i * 4)); // stores only unique addresses from adr into unique List unique = new List(20); for (int i = 0; i < adr.Length; i++) if (!unique.Contains(adr[i])) unique.Add(adr[i]); // stores old addresses from ptable that still exist into updated List updated = new List(20); for (int i = 0; i < ptable.Count; i++) if (unique.Contains(ptable[i])) updated.Add(ptable[i]); // any address from unique that weren't in ptable are now added to updated for (int i = 0; i < unique.Count; i++) if (!updated.Contains(unique[i])) updated.Add(unique[i]); ptable.Clear(); ptable = updated; // gets your coords to find yourself on the list vect3d myVect = getMyCoords(); for (int i = 0; i < ptable.Count; i++) if (myVect.x == memHandler.readMemoryFloat(ptable[i])) { myAddy = ptable[i]; break; } } private void textBox2_KeyDown(object sender, KeyEventArgs e) { //MessageBox.Show("" + e.KeyValue); string keyname = ""; if (e.Modifiers == Keys.Shift) keyname = "Shift"; else if (e.KeyCode == Keys.CapsLock) keyname = "Caps Lock"; else if (e.KeyCode == Keys.Tab) keyname = "Tab"; else if (e.Modifiers == Keys.Alt) keyname = "Alt"; else if (e.Modifiers == Keys.Control) keyname = "Control"; else if (e.KeyValue > 47 && e.KeyValue < 94) keyname = ((char)e.KeyValue).ToString(); if (keyname != "") { textBox2.Text = keyname; myHotkey = e.KeyValue; } } #region HexManip public static string bytesToHex(byte[] bytes, int start, int length, string delim) { System.Text.StringBuilder sb = new System.Text.StringBuilder(bytes.Length * 2); int end = start + length; for (int i = start; i < end; i++) { sb.Append(bytes[i].ToString("X2")); sb.Append(delim); } return sb.ToString(); } public static byte[] hexToBytes(string hexString) { if (hexString.StartsWith("0x")) hexString = hexString.Substring(2); hexString = System.Text.RegularExpressions.Regex.Replace(hexString, "[^a-fA-F0-9]", ""); if (hexString.Length % 2 != 0) hexString = hexString.Substring(0, hexString.Length - 1); int length = hexString.Length / 2; byte[] buf = new byte[length]; for (int i = 0; i < length; i++) buf[i] = byte.Parse(hexString.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); return buf; } public static int hexToInt(string hexString) { if (hexString.StartsWith("0x")) hexString = hexString.Substring(2); return int.Parse(hexString, System.Globalization.NumberStyles.HexNumber); } #endregion private void Form1_FormClosing(object sender, FormClosingEventArgs e) { timer1.Enabled = false; } private void timer1_Tick(object sender, EventArgs e) { int res = WinApi.GetKeyState(119); if ((res & 0x8000) != 0) { aimOn = !aimOn; Thread.Sleep(200); } // F7 res = WinApi.GetKeyState(118); if ((res & 0x8000) != 0) { drawLead = !drawLead; Thread.Sleep(200); } // + sign if ((WinApi.GetKeyState(107) & 0x8000) != 0) { lead += 0.5F; Thread.Sleep(200); } // - sign if ((WinApi.GetKeyState(109) & 0x8000) != 0) { lead -= 0.5F; Thread.Sleep(200); } if (drawLead) { IntPtr hWnd = WinApi.FindWindowA("Halo", null); IntPtr hDC = WinApi.GetDC(hWnd); Graphics memDC = Graphics.FromHdc(hDC); memDC.DrawString("" + lead, new Font("Arial", 14, FontStyle.Bold), Brushes.Red, new PointF(5, 5)); WinApi.ReleaseDC(hWnd, hDC); label4.Text = "Press F7 to disable lead drawing"; } else label4.Text = "Press F7 to enable lead drawing"; if (!aimOn) { label2.Text = "Press F8 to enable aimbot"; return; } else label2.Text = "Press F8 to disable aimbot"; findHalo(); res = WinApi.GetKeyState(myHotkey); res &= 0x8000; if (res != 0) { updatePlayerList(); vect3d myvector = getMyCoords(); vect3d enemyvector = getPlayerVect(aimingAddy); vect3d enemyoffset = getPlayerVectOffsets(aimingAddy); enemyvector.x += enemyoffset.x * lead; enemyvector.y += enemyoffset.y * lead; float height = inVehicle() ? 0.1F : 0.6F; enemyvector.z += height + enemyoffset.z * lead; vect2d lookVect = get2dVect(myvector, enemyvector); //if (getAngleDistance(getMouse(), lookVect) > float.Parse(txtFov.Text)) //aimingAddy = -1; // finds a new player if needed if (aimingAddy == -1) aimingAddy = getClosestPlayerAddy(); if (aimingAddy != -1) { setMouse(lookVect); } } else { aimingAddy = -1; } }