public void Shutdown() { try { if (injector != null) { injector.Dispose(); } injector = null; } catch (Exception ex) { Log.Error("Failed to dispose the injector", ex); } try { if (d3 != null) { d3.Close(); } d3 = null; } catch (Exception ex) { Log.Error("Failed to close the D3 process", ex); } }
/// <summary> /// Returns the running WoW's in a WoWExe List containing the logged in playername and /// Process object. /// </summary> /// <returns>A list containing all the runnign WoW processes</returns> public static List <WowExe> GetRunningWows() { List <WowExe> wows = new List <WowExe>(); List <Process> processList = new List <Process>(Process.GetProcessesByName("Wow")); foreach (Process p in processList) { AmeisenLogger.Instance.Log(LogLevel.DEBUG, $"Found WoW Process! PID: {p.Id}", "AmeisenCore"); WowExe wow = new WowExe(); BlackMagic blackmagic = new BlackMagic(p.Id); wow.characterName = blackmagic.ReadASCIIString(Offsets.playerName, 12); wow.process = p; wows.Add(wow); blackmagic.Close(); } return(wows); }
/// <summary> /// Returns the running WoW's in a WoWExe List containing the /// logged in playername and Process object. /// </summary> /// <returns>A list containing all the runnign WoW processes</returns> public static List <WowExe> GetRunningWows() { List <WowExe> wows = new List <WowExe>(); List <Process> processList = new List <Process>(Process.GetProcessesByName("Wow")); foreach (Process p in processList) { AmeisenLogger.Instance.Log(LogLevel.DEBUG, $"Found WoW Process! PID: {p.Id}", "AmeisenCore"); BlackMagic blackmagic = new BlackMagic(p.Id); uint pDevice = blackmagic.ReadUInt(Offsets.devicePtr1); uint pEnd = blackmagic.ReadUInt(pDevice + Offsets.devicePtr2); uint pScene = blackmagic.ReadUInt(pEnd); uint endscene = blackmagic.ReadUInt(pScene + Offsets.endScene); bool isAlreadyHooked = false; try { isAlreadyHooked = BlackMagic.ReadByte(endscene + 0x2) == 0xE9; } catch { } string name = blackmagic.ReadASCIIString(Offsets.playerName, 12); if (name == "") { name = "not logged in"; } wows.Add(new WowExe { characterName = name, process = p, alreadyHooked = isAlreadyHooked }); blackmagic.Close(); } return(wows); }
public static Structs.PatternList FindPatternList(Structs.PatternList patternList) { Structs.PatternList newPatternList = new Structs.PatternList(); newPatternList.processName = patternList.processName; uint baseModule = 0; BlackMagic memread = new BlackMagic(); if (memread.OpenProcessAndThread(SProcess.GetProcessFromProcessName(patternList.processName))) { try { // Dump module ProcessModuleCollection modules = Process.GetProcessById(memread.ProcessId).Modules; foreach (ProcessModule o in modules) { Structs.ModuleList m = new Structs.ModuleList(); m.Name = o.ModuleName; m.baseAddressDec = (int)o.BaseAddress; m.baseAddressHex = (o.BaseAddress).ToString("X"); patternList.Modules.Add(m); // Check module base if exist. if (patternList.baseModuleName != "") { if (patternList.baseModuleName.ToLower() == o.ModuleName.ToLower()) { baseModule = (uint)o.BaseAddress; } } } } catch { } foreach (Structs.Pattern p in patternList.Patterns) { try { uint dwCodeLoc = memread.FindPattern(p.pattern, p.mask); uint offset = memread.ReadUInt((uint)((int)dwCodeLoc + p.offsetLocation)); if (offset > 0) { offset = offset - baseModule; dwCodeLoc = dwCodeLoc - baseModule; } if (offset > 0) { // Dump offset p.offset = offset.ToString("X"); p.offsetDec = offset; p.offsetUsedAtDec = (uint)((int)dwCodeLoc + p.offsetLocation); p.offsetUsedAt = ((int)dwCodeLoc + p.offsetLocation).ToString("X"); try { switch (p.type) { case "int64": p.value = Convert.ToString(memread.ReadUInt64(p.offsetDec)); break; case "int": p.value = Convert.ToString(memread.ReadInt(p.offsetDec)); break; case "float": p.value = Convert.ToString(memread.ReadFloat(p.offsetDec)); break; case "string": p.value = Convert.ToString(memread.ReadASCIIString(p.offsetDec, 30)); break; } } catch { p.value = "No Found"; } } else { p.offset = "No Found"; } } catch { p.offset = "No Found"; } newPatternList.Patterns.Add(p); } memread.Close(); } else { MessageBox.Show("Process no found."); } return(patternList); }
private void bCreatePattern_Click(object sender, EventArgs e) { if (cbProcess1.Text.Replace(" ", "") != "" && cbProcess2.Text.Replace(" ", "") != "" && tbOffset1.Text.Replace(" ", "").Replace("0x", "") != "" && tbOffset2.Text.Replace(" ", "").Replace("0x", "") != "") { string[] process1Array = cbProcess1.Text.Replace(" ", "").Split(Convert.ToChar("-")); string[] process2Array = cbProcess2.Text.Replace(" ", "").Split(Convert.ToChar("-")); if (process1Array != null && process2Array != null) { if (process1Array.Length > 0 && process2Array.Length > 0) { try { // Process choose to ID int process1Id = Convert.ToInt32(process1Array[0]); int process2Id = Convert.ToInt32(process2Array[0]); // Open Process BlackMagic process1BM = new BlackMagic(); BlackMagic process2BM = new BlackMagic(); if (!process1BM.OpenProcessAndThread(process1Id)) { MessageBox.Show("Open Process 1 failled."); return; } if (!process2BM.OpenProcessAndThread(process2Id)) { MessageBox.Show("Open Process 2 failled."); return; } // Get Module uint moduleBase1BM = 0; uint moduleBase2BM = 0; string moduleShow = ""; if (baseModuleNameTB.Text != "") { moduleBase1BM = (uint)process1BM.GetModule(baseModuleNameTB.Text).BaseAddress; moduleBase2BM = (uint)process2BM.GetModule(baseModuleNameTB.Text).BaseAddress; moduleShow = baseModuleNameTB.Text + " + "; if (moduleBase1BM <= 0 || moduleBase2BM <= 0) { MessageBox.Show("Module not found."); return; } } // Offset choose to uint uint offset1 = uint.Parse(tbOffset1.Text.Replace(" ", "").Replace("0x", ""), System.Globalization.NumberStyles.HexNumber) + moduleBase1BM; uint offset2 = uint.Parse(tbOffset2.Text.Replace(" ", "").Replace("0x", ""), System.Globalization.NumberStyles.HexNumber) + moduleBase2BM; // Offset to 4 Byte string tPattern1 = offset1.ToString("X"); while (tPattern1.Length < 8) { tPattern1 = "0" + tPattern1; } string tPattern2 = offset2.ToString("X"); while (tPattern2.Length < 8) { tPattern2 = "0" + tPattern2; } // Offset 4 byte inverse string t2Pattern1 = tPattern1.Substring(6, 2); t2Pattern1 += " " + tPattern1.Substring(4, 2); t2Pattern1 += " " + tPattern1.Substring(2, 2); t2Pattern1 += " " + tPattern1.Substring(0, 2); string t2Pattern2 = tPattern2.Substring(6, 2); t2Pattern2 += " " + tPattern2.Substring(4, 2); t2Pattern2 += " " + tPattern2.Substring(2, 2); t2Pattern2 += " " + tPattern2.Substring(0, 2); // Find offset used at string tMask = "xxxx"; uint dwCodeLoc1 = process1BM.FindPattern(t2Pattern1, tMask); uint dwCodeLoc2 = process2BM.FindPattern(t2Pattern2, tMask); if (dwCodeLoc1 <= 0 || dwCodeLoc2 <= 0) { MessageBox.Show("Offset not found."); return; } // Read Pattern byte[] bytesPorcess1 = process1BM.ReadBytes(dwCodeLoc1, 16); byte[] bytesPorcess2 = process2BM.ReadBytes(dwCodeLoc2, 16); // Make mask string mask = ""; for (int i = 0; i <= bytesPorcess1.Length - 1; i++) { if (bytesPorcess1[i] == bytesPorcess2[i] && i > 3) { mask += "x"; } else { bytesPorcess1[i] = 0; bytesPorcess2[i] = 0; mask += "?"; } } // Pattern to String string pattern = BitConverter.ToString(bytesPorcess1); pattern = pattern.Replace("-", " "); // Show Result tbPattern.Text = ""; tbPattern.Text += "Offset 1 used at: " + moduleShow + "0x" + (dwCodeLoc1 - moduleBase1BM).ToString("x") + Environment.NewLine; tbPattern.Text += "Offset 2 used at: " + moduleShow + "0x" + (dwCodeLoc2 - moduleBase2BM).ToString("x") + Environment.NewLine + Environment.NewLine; tbPattern.Text += "<Pattern>" + Environment.NewLine; tbPattern.Text += " <offsetName>" + tbOffsetName.Text + "</offsetName>" + Environment.NewLine; tbPattern.Text += " <pattern>" + pattern + "</pattern>" + Environment.NewLine; tbPattern.Text += " <mask>" + mask + "</mask>" + Environment.NewLine; tbPattern.Text += " <offsetLocation>0</offsetLocation>" + Environment.NewLine; tbPattern.Text += " <type>" + cbValueType.Text + "</type>" + Environment.NewLine; tbPattern.Text += "</Pattern>"; process1BM.Close(); process2BM.Close(); } catch { MessageBox.Show("Error, please verif all info."); } } else { MessageBox.Show("Please select Process."); } } else { MessageBox.Show("Please select Process."); } } else { MessageBox.Show("Please enter all information."); } }
private void button2_Click(object sender, EventArgs e) { if (Utils.IsUserAdministrator()) { Utils.SYSTEM_INFO sys_info = new Utils.SYSTEM_INFO(); Utils.GetSystemInfo(out sys_info); IntPtr proc_min_address = sys_info.minimumApplicationAddress; IntPtr proc_max_address = sys_info.maximumApplicationAddress; long proc_min_address_l = (long)proc_min_address; long proc_max_address_l = (long)proc_max_address; logDebug(String.Format("Min {0} Max {1}", proc_min_address_l, proc_max_address_l)); BlackMagic bm = new BlackMagic(); if (bm.OpenProcessAndThread(SProcess.GetProcessFromProcessName(windowName[0]))) { logDebug("Found"); Utils.MEMORY_BASIC_INFORMATION mem_basic_info = new Utils.MEMORY_BASIC_INFORMATION(); while (proc_min_address_l < proc_max_address_l) { // 28 = sizeof(MEMORY_BASIC_INFORMATION) Utils.VirtualQueryEx(bm.ProcessHandle, proc_min_address, out mem_basic_info, 28); //logDebug(mem_basic_info.ToString()); // if this memory chunk is accessible if ((mem_basic_info.Protect == Utils.PAGE_READWRITE || mem_basic_info.Protect == Utils.PAGE_READONLY) && mem_basic_info.State == Utils.MEM_COMMIT) { //logDebug(String.Format("Addr={0:X8} Size={1}", mem_basic_info.BaseAddress, mem_basic_info.RegionSize)); byte[] buffer = new byte[mem_basic_info.RegionSize]; // read everything in the buffer above buffer = bm.ReadBytes((uint)mem_basic_info.BaseAddress, mem_basic_info.RegionSize); //Utils.ReadProcessMemory((int)bm.ProcessHandle, mem_basic_info.BaseAddress, buffer, mem_basic_info.RegionSize, ref bytesRead); MemoryStream ms = new MemoryStream(buffer); BinaryReader br = new BinaryReader(ms); while (ms.Position != ms.Length) { int data = br.ReadInt32(); if ((data == 18248) || (data == 18622)) { int readData = bm.ReadInt((uint)(mem_basic_info.BaseAddress + ms.Position - 4)); logDebug(String.Format("Found Addr={0:X8} Size={1}", mem_basic_info.BaseAddress + ms.Position - 4, readData)); } } // then output this in the file //for (int i = 0; i < mem_basic_info.RegionSize; i++) // sw.WriteLine("0x{0} : {1}", (mem_basic_info.BaseAddress + i).ToString("X"), (char)buffer[i]); } // move to the next memory chunk proc_min_address_l += mem_basic_info.RegionSize; proc_min_address = new IntPtr(proc_min_address_l); } bm.Close(); logDebug("Done"); } } else { logDebug("Need admin user"); } }