public PwClient(IntPtr descript) { this.Descrypt = descript; Int32 processID; WinApi.GetWindowThreadProcessId(descript, out processID); ProcessID = processID; handle = WinApi.OpenProcess(WinApi.ProcessAccessFlags.All, false, ProcessID); Name = CalcMethods.ReadString(handle, OfsPresenter.getInstance("BA")[0], OfsPresenter.getInstance("GA+Player+Name+0x0")); Money = CalcMethods.ReadInt(handle, OfsPresenter.getInstance("BA")[0], OfsPresenter.getInstance("GA+Player+Money")); }
/// <summary> /// Инжект для GUI элементов /// </summary> /// <param name="win_struct"></param> /// <param name="command_text"></param> /// <param name="processID"></param> public static void GUI_Inject(int win_struct, int command_text, IntPtr oph) { try { // ---- Создаем скелет пакета для инжектирования byte[] gui_packet = { 0x60, //Pushad 0xB9, 0x0, 0x0, 0x0, 0x0, //Mov_ECX + win_struct_address 0x68, 0x0, 0x0, 0x0, 0x0, //Push68 + command_text_address 0xB8, 0x0, 0x0, 0x0, 0x0, //Mov_EAX + call_address 0xFF,0xD0, //Call_EAX 0x61, //Popad 0xC3 //Ret }; // ---- заменяем указанные эелементы пакета адресом для GUI инжектирования var x = OfsPresenter.getInstance("GUI")[0]; Buffer.BlockCopy(BitConverter.GetBytes(OfsPresenter.getInstance("GUI")[0]), 0, gui_packet, 12, 4); // ---- заменяем указанные эелементы пакета адресом структуры необходимого окна Buffer.BlockCopy(BitConverter.GetBytes(win_struct), 0, gui_packet, 2, 4); // ---- заменяем указанные эелементы пакета адресом функции необходимого контрола Buffer.BlockCopy(BitConverter.GetBytes(command_text), 0, gui_packet, 7, 4); // ---- временные переменные int lpNumberOfBytesWritten = 0; IntPtr lpThreadId; // ---- выделяем место в памяти IntPtr gui_address = WinApi.VirtualAllocEx(oph, IntPtr.Zero, 20, WinApi.AllocationType.Commit, WinApi.MemoryProtection.ReadWrite); // ---- записываем в выделенную память наш пакет WinApi.WriteProcessMemory(oph, (int)gui_address, gui_packet, 20, out lpNumberOfBytesWritten); // ---- запускаем записанную в память функцию IntPtr hProcThread = WinApi.CreateRemoteThread(oph, IntPtr.Zero, 0, gui_address, IntPtr.Zero, 0, out lpThreadId); // ---- Ожидаем завершения функции WinApi.WaitForSingleObject(hProcThread, WinApi.INFINITE); // ---- подчищаем за собой WinApi.VirtualFreeEx(oph, gui_address, 20, WinApi.FreeType.Release); WinApi.VirtualFreeEx(oph, hProcThread, 20, WinApi.FreeType.Release); } catch (Exception ex) { throw ex; } }
public static void GetCords(PwClient pw, out double x, out double y, out double z) { x = Math.Round(CalcMethods.ReadFloat(pw.Handle, OfsPresenter.getInstance("BA")[0], OfsPresenter.getInstance("GA+Player+X")), 1); y = Math.Round(CalcMethods.ReadFloat(pw.Handle, OfsPresenter.getInstance("BA")[0], OfsPresenter.getInstance("GA+Player+Y")), 1); z = Math.Round(CalcMethods.ReadFloat(pw.Handle, OfsPresenter.getInstance("BA")[0], OfsPresenter.getInstance("GA+Player+Z")), 1); }
public static void CheckMoney(PwClient pw) { pw.Money = CalcMethods.ReadInt(pw.Handle, OfsPresenter.getInstance("BA")[0], OfsPresenter.getInstance("GA+Player+Money")); }
///// <summary> ///// Узнаем адрес контрола активного окна указанного по ID процесса клиента ///// </summary> ///// <param name="processID"></param> ///// <returns></returns> //public static int[] CalcControlAddress(IntPtr oph) //{ // try // { // int[] result = { 0, 0 }; // string name_control = ""; // int[] offset_win_struct = { 0x1c, 0x18, 0x8, 0x74 }; // int address_win_struct = ReadInt(oph, Offsets.getInstance().BaseAdress, offset_win_struct); // int temp_address = CalcInt32Value(oph, address_win_struct + 0x1cc); // for (int k = 0; k < 50; k++) // { // int window_address = CalcInt32Value(oph, temp_address + 0x4); // for (int j = 0; j < k; j++) // { // window_address = CalcInt32Value(oph, window_address + 0x4); // } // int controlstruct_address = CalcInt32Value(oph, window_address + 0x8); // window_address = CalcInt32Value(oph, controlstruct_address + 0x18); // name_control = CalcStringValue_ASCII(oph, window_address + 0x0); // if (name_control.IndexOf("Btn_Back") != -1) // { // int address_to_command_control = CalcInt32Value(oph, controlstruct_address + 0x1c); // result[0] = address_win_struct; // result[1] = address_to_command_control; // return result; // } // } // return result; // } // catch (Exception ex) // { // throw ex; // } //} ///// <summary> ///// Узнаем адрес активного окна ///// </summary> ///// <param name="oph"></param> ///// <returns></returns> //public static int CalcAddressActiveWindow(IntPtr oph) //{ // try // { // int[] offset_win_struct = { 0x1c, 0x18, 0x8, 0x74 }; // return ReadInt(oph, Offsets.getInstance().BaseAdress, offset_win_struct); // } // catch (Exception ex) // { // throw ex; // } //} /// <summary> /// Узнаем адрес контрола активного окна указанного по ID процесса клиента. /// Возвращает {указатель на окно, указатель на команду контрола, указатель на контрол} /// </summary> /// <param name="oph">Дескриптор окна</param> /// <param name="window_name">Имя окна</param> /// <param name="processID">Имя контрола</param> /// <returns></returns> public static Int32[] CalcControlAddress(IntPtr oph, String window_name, String control_name) { try { //вводим временный массив дял хранения результатов Int32[] result = { 0, 0, 0 }; //вводим пустые переменные для хранения имени окна и контрола String win_name_8C = String.Empty; String win_name_AC = String.Empty; String name_control = String.Empty; //считываем начало массива структур окон нижнего или верхнего уровня уровня во временную переменную var xxx = OfsPresenter.getInstance("BA")[0]; Int32 temp_address_8C = ReadInt(oph, OfsPresenter.getInstance("BA")[0], new Int32[] { 0x1c, 0x18, 0x8, 0x8C }); Int32 temp_address_AC = ReadInt(oph, OfsPresenter.getInstance("BA")[0], new Int32[] { 0x1c, 0x18, 0x8, 0xAC }); //в цикле проверяем имя каждого окна, пока не найдем нужное for (Int32 iter = 0; iter < 1500; iter++) { if (iter > 0) { temp_address_8C = CalcInt32Value(oph, temp_address_8C + 0x0); temp_address_AC = CalcInt32Value(oph, temp_address_AC + 0x0); } Int32 temp_address_8C_2 = CalcInt32Value(oph, temp_address_8C + 0x8); Int32 temp_address_AC_2 = CalcInt32Value(oph, temp_address_AC + 0x8); Int32 temp_address_8C_3 = CalcInt32Value(oph, temp_address_8C_2 + 0x4c); Int32 temp_address_AC_3 = CalcInt32Value(oph, temp_address_AC_2 + 0x4c); win_name_8C = CalcStringValue_ASCII(oph, temp_address_8C_3 + 0x0); win_name_AC = CalcStringValue_ASCII(oph, temp_address_AC_3 + 0x0); if (win_name_8C == "" && win_name_AC == "") { break; } if (CalcStringValue_ASCII(oph, temp_address_8C_3 + 0x0) == window_name) { //сохраняем значение временной переменной и выходим из цикла result[0] = temp_address_8C_2; break; } if (CalcStringValue_ASCII(oph, temp_address_AC_3 + 0x0) == window_name) { //сохраняем значение временной переменной и выходим из цикла result[0] = temp_address_AC_2; break; } } //если не нашли нужное окно, то выходим и возвращаем 0 if (result[0] == 0) { return(result); } //считываем начало массива контролов найденного окна во временную переменную Int32 temp_address = CalcInt32Value(oph, result[0] + 0x1e4); //в цикле проверяем имя каждого контрола, пока не найдем нужное for (Int32 iter = 0; iter < 100; iter++) { if (iter > 0) { temp_address = CalcInt32Value(oph, temp_address + 0x4); } //считываем адреса структуры контрола Int32 controlstruct_address = CalcInt32Value(oph, temp_address + 0x8); Int32 temp_address_2 = CalcInt32Value(oph, controlstruct_address + 0x18); name_control = CalcStringValue_ASCII(oph, temp_address_2 + 0x0); if (CalcStringValue_ASCII(oph, temp_address_2 + 0x0) == control_name) { //сохраняем значение адреса структуры контрола result[1] = CalcInt32Value(oph, controlstruct_address + 0x1c); result[2] = controlstruct_address; return(result); } } return(result); } catch (Exception ex) { throw ex; } }