HPB Опубликовано 16 сентября, 2012 Поделиться Опубликовано 16 сентября, 2012 создал тему с надеждой что люди форума помогут мне ..выкладываю полный код моего проекта только с изменёнными адресами и смещениямисуть есть 1 указатель который укажет на другой адрес и если к нему прибавить +30 то выйдем на нужный нам статический адресnamespace WindowsFormsApplication{ public partial class Form1 : Form { VAMemory VAM; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { VAM = new VAMemory("Play"); //Имя процесса, без exe // int Jordan = Convert.ToInt32(textBox1.Text, 16); //хотел сделать так чтобы можно было через СЕ найти этот адрес потом вписать в ТекстБОкс где переменная бы содержала этот адрес потом передела в код ниже // label2.Text = (Convert.ToString(VAM.ReadByte((IntPtr)Jordan))); //label2 принимает значение по адрессу 011F0EA0 про 0x********!label2.Text = (Convert.ToString(VAM.ReadByte((IntPtr)0x011F0EA0))); //011F0EA0 адрес указателя textBox1.Text = label2.Text; } private void button2_Click(object sender, EventArgs e)//кнопка включения { timer2.Enabled = true;//вызываю цикл timer2.Interval = int.Parse(textBox2.Text);//задаю интервал таймера , потом сделаю через бегунок там будет прикольней textBox1.Text = label1.Text;//хер знает что тут button2.Visible = false;//убираю кнопку button3.Visible = true;//появляется кнопка выключения /*VAM = new VAMemory("Play"); // Имя процесса, без .exe! VAM.WriteByte((IntPtr)0x011F0EA0, byte.Parse(textBox1.Text.ToString()));//вверху был код чтение значение адреса и затем приравнивание его к Лабелу2 а тот в свою очередь ровнялся ТексБОксу,проблема в том что читалось значение УКАЗАТЕЛЯ а не того адреса на который должен быть указан ,плюс тут смещения нет (а через се написано +30)*/ } private void timer2_Tick(object sender, EventArgs e) { VAM = new VAMemory("play"); // Имя процесса, без .exe!,вот и сам цикл VAM.WriteByte((IntPtr)0x011F0EA0, byte.Parse(textBox1.Text.ToString())); // перезаписываем значение данного адреса со временем указанным в ТекстБоксе Интервала } private void button3_Click(object sender, EventArgs e)//кнопка выкл { timer2.Enabled = false;//вырубаем цикл button3.Visible = false;//убераем данную кнопку button2.Visible = true;//показываем кнопку включения } private void textBox1_TextChanged(object sender, EventArgs e) { //хрень } private void timer1_Tick_1(object sender, EventArgs e)//проверка процесса { System.Diagnostics.Process[] procs = System.Diagnostics.Process.GetProcesses();//запрос процессов try { System.Diagnostics.Process proc = procs.First(p => p.ProcessName == "Play");//диагностика как бы if (proc != null)//тут вот можно ли заместо != использовать ==? { //ну и тут пошли указания если процесс нашёлся button1.Enabled = true; label1.Text = ("значение:"); button2.Visible = true; button3.Visible = true; textBox1.Visible = true; label2.Visible = true; } } catch {//если же нет то button1.Visible = false; button2.Visible = false; button3.Visible = false; textBox1.Visible = false; label2.Visible = false; timer2.Enabled = false; label1.Text = ("ждёмс запуска:"); } // } } }для работы нужно скачать библиотеку VaMemory подключить ссылку и обновить сверху там уже обновлёнопрошу помощи как мне имея указатель прочитать адрес на который должен он указать и прибавить лишь одно смещение (+30)и выйти на тот адрес который содержит нужное мне значение .....затем тупо узнать его значение и перезаписывать (в этом коде часть чего я хочу уже имеется)//привёл коменты чтоб было пояснее Ссылка на комментарий Поделиться на другие сайты Поделиться
JuGGerNaunT Опубликовано 16 сентября, 2012 Поделиться Опубликовано 16 сентября, 2012 Int32 Jordan = Convert.ToInt32(textBox1.Text, 16); //читаешь значение с формыInt32 DestAddress = VAM.ReadInt32((IntPtr)Jordan); //читаешь содержимое указателя(он содержит адрес)Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30); //читаешь само значениеНу вот такой вариант может работать. Последняя строчка может изменяться в зависимости от того, какое значение у тебя итоговое: если float, то последняя строка будетSingle MyValue = VAM.ReadFloat(((IntPtr)DestAddress) + 30); Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 16 сентября, 2012 Автор Поделиться Опубликовано 16 сентября, 2012 планы изменилась я всё таки научился делать так чтобы можно было присваивать переменной адрес из ТЕксбокса.....а теперь такой вопрос ....как мне просто использую Метод kenga найти нужный мне адрес зная указатель и смещение! и вывести это всё в текстбокс опять же или в буфер запомнить а дальше я самInt32 Jordan = Convert.ToInt32(textBox1.Text, 16); //читаешь значение с формыInt32 DestAddress = VAM.ReadInt32((IntPtr)Jordan); //читаешь содержимое указателя(он содержит адрес)Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30); //читаешь само значениеНу вот такой вариант может работать. Последняя строчка может изменяться в зависимости от того, какое значение у тебя итоговое: если float, то последняя строка будетSingle MyValue = VAM.ReadFloat(((IntPtr)DestAddress) + 30);покажет только значение УКАЗАТЕЛЯ (но не найдёт тот адрес на который указывает указатель)прошу всё же кто сталкивался с таким случаемкак мне выйти на тот адрес который указывает "указатель" с опредлённым "одним" смещением вида "0x30"// 0x - считать как кусок 16чной системы HEXто что там написано 0A а в исходе 30 я просто по разному пытался и забыл исправить когда скринилна скрине:"картинка с СЕ""картинка с с#""картинка Откомп. Программы" Ссылка на комментарий Поделиться на другие сайты Поделиться
JuGGerNaunT Опубликовано 16 сентября, 2012 Поделиться Опубликовано 16 сентября, 2012 Ты просто не правильно разобрался, что куда указывает.Открой значение из своей таблицы, которое содержит указатель. Там где написано "твой указатель", подставляешь в строкуInt32 DestAddress = VAM.ReadInt32((IntPtr)твой_указатель);А в textbox записываешь не это значение, а пересчитаное. В итоге получаешь:Int32 DestAddress = VAM.ReadInt32((IntPtr)твой_указатель);Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);textBox1.Text = Convert.ToString(MyValue); Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 >> Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);Напоминаю, что у C# есть возможность реализации шаблонных функций. Т.е. через шаблонную функцию можно было бы сделать такvar myValue = VAM.Read<int>(((IntPtr)DestAddress) + 30);В угловых скобках должен быть предопределен тип и это может быть: тип структуры, массив некоторого типа и даже интерфейс (если я не ошибся). Метод T Read<T> можно было бы добавить в класс VAMemory тоже самое касается и Write- метода Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 Ты просто не правильно разобрался, что куда указывает.Открой значение из своей таблицы, которое содержит указатель. Там где написано "твой указатель", подставляешь в строкуInt32 DestAddress = VAM.ReadInt32((IntPtr)твой_указатель);А в textbox записываешь не это значение, а пересчитаное. В итоге получаешь:Int32 DestAddress = VAM.ReadInt32((IntPtr)твой_указатель);Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);textBox1.Text = Convert.ToString(MyValue);у меня на месте "твой указатель" написано так "игра"+011D0EA0 + смещение 30пробовал 2 сопсобами :1 указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 0x30);2. указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);в обоих случаях адреса были разные и не совпадали с адресом из СЕв се был адрес 069D24381 раз программа выдала адрес -11190403082 раз 1209416877может их нужно конвертировать? а в каком они видеtextBox1.Text = Convert.ToString(MyValue);Convert.ToStringя так понимаю что скорее всего в этом загвоздкаhttp://forum.gamehacklab.ru/topic/952-%D0%BF%D0%B8%D1%88%D0%B5%D0%BC-%D1%82%D1%80%D0%B5%D0%B9%D0%BD%D0%B5%D1%80-%D0%BD%D0%B0-vc-2010/можно и вот так же? но тут столько классов что я путаюсь и не понимаю что же мне конкретно нужно Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 у меня на месте "твой указатель" написано так "игра"+011D0EA0 + смещение 30пробовал 2 сопсобами :1 указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 0x30);2. указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);в обоих случаях адреса были разные и не совпадали с адресом из СЕв се был адрес 069D24381 раз программа выдала адрес -11190403082 раз 1209416877может их нужно конвертировать? а в каком они видеtextBox1.Text = Convert.ToString(MyValue);Convert.ToStringя так понимаю что скорее всего в этом загвоздкаhttp://forum.gamehac...%D0%B0-vc-2010/можно и вот так же? но тут столько классов что я путаюсь и не понимаю что же мне конкретно нужноПо-хорошему надо бы хоть немного самому выучить C# и понять - что есть указатель. Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 я знаю что указатель это адрес в памяти и если я буду на него ссылаться то он должен "jmp" как бы на другой адрес + относительное смещениеминимальное знание о указатели и представление где работаюа вы все такие "профи" ....сразу бы закопали ваша б воля"на ошибках учатся"я читал ни одну книгу и всегда мало что ясно, пока не попробуешь это сам.! ,а..когда сталкиваешь то на практике совсем все иначе Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 я знаю что указатель это адрес в памяти и если я буду на него ссылаться то он должен "jmp" как бы на другой адрес + относительное смещениеминимальное знание о указатели и представление где работаюа вы все таки "профи" ....сразу бы закопали ваша б воляОтвет не верный.Указатель - это обычный блок памяти в адресном пространстве, а содержит в себе он, не патроны или здоровье, а другой адрес.То есть, вот наш указатель: 0x00F04096, и по этому адресу в памяти записана вот такая штука - 0x007A8000, т.е. указатель 0x00F04096 содержит в себе 0x007A8000.Иными словами - он указывает на адрес - 0x007A8000, все адреса имеют тип целое 4 байта (DWORD/Int32). Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 я и хотел это сказать не правильно выразился...я знаю что указатель "указывает на другой адрес" тобишь обычный jmpа в чём моя проблема? Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 я и хотел это сказать не правильно выразился...я знаю что указатель "указывает на другой адрес" тобишь обычный jmpа в чём моя проблема?Нет никакого jmp. Причём тут исполняемый код приложения и обыкновенные адреса?Советую вначале почитать об указателях, прежде чем говорить - http://ru.wikipedia....D0%B0_(C%2B%2B)Писал раньше для себя такую функцию. public int ReadPointer(int basepointer, Int32[] offsets, int level) { VAM = new VAMemory(process_name); int pointer = basepointer; for (int i = 0; i < level; i++) { pointer = VAM.ReadInteger((IntPtr)pointer) + offsets[i]; } return pointer; } Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 где basepointer-указатель?offsets-офсет смещения? так или не такили это так сложно или я такой тугодумааа ужасно как же это действует на мозг Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 где basepointer-указатель?offsets-офсет смещения? так или не такили это так сложно или я такой тугодумааа ужасно как же это действует на мозгЯ думал ты в состоянии хоть что-то сам сделать.basepointer - база указателя, offsets - массив смещений, level - кол-во смещений. Не знание англ. языка - карается смертью Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 к сож. учу немец но тут ничего сложного не было... вы правымне нужно :int basepointer = 0x011А0EA0; int offsets = 30; int level = 1;?(int basepointer = 0x011А0EA0,int level = 1, Int32[] offsets = 0x30) Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 к сож. учу немец но тут ничего сложного не было... вы правымне нужно :int basepointer = 0x011D0EA0; int offsets = 30; int level = 1;?Второй параметр это массив. Так что надо int offsets[] = {0x30}; я думаю.Остальные переменные создавать не надо, это можно сразу передать в функцию. Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 всё таки с вторы параметром что то не такгуглю. JuGGerNaunT а почему у меня его вариант выдавал другой адрес или это был вовсе не адрес? Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 всё таки с вторы параметром что то не такгуглю. JuGGerNaunT а почему у меня его вариант выдавал другой адрес или это был вовсе не адрес?Ты меня уже убивать начинаешь, вот берёшь прям, и режешь ножом. Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 я не убийца просто ну не знаю я Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 я не убийца просто ну не знаю яТак зачем взялся за дело, если сам не знаешь ничего?иди учи C# и C++. Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 ну я же не настолько ничтоженhttp://kekekeng.blog.../2012/05/c.htmlклассов нет Ссылка на комментарий Поделиться на другие сайты Поделиться
Coder Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 ну я же не настолько ничтоженhttp://kekekeng.blog.../2012/05/c.htmlклассов нетИ ты до сих пор не смог прочитать указатели? Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 17 сентября, 2012 Автор Поделиться Опубликовано 17 сентября, 2012 я только что нашел блог kenga случайнои да я до сих пор не смог прочитать указатель..выйти на действительный нужный мне адреспоэтому и обратился к вам..так как не знал как справитьсяу меня есть 2 программы1. исполняемая (тобишь ты ввёл адрес и всё она покатила тебе там делать сама что надо)2. именно нужно найти вот этот адрес чтобы именно в первую и вставитькод кенга очень массивный это ж сколько будет моя програмка хоть и в Кб но всё равно ....Coder помоги ещё разок только чтоб уж до меня дошло до конца : (ну не получается у меня я уже по разному перепробовал...объясни на примеру игры Hitman - Silent Assassin как и что куда записать "как говориться последнее китайское после которого я пойму"как я разобралсяуказатель 0021E45C прибовляем 30 получаем 0012СС54 + 96 получаем 064EE746(конечный адрес..)как мне его найти посредством c# разсусольте пожалуйста ..буду вам благодаренмне не нужно найти значение а именно "конечный адрес" который в себе содержал указатель Ссылка на комментарий Поделиться на другие сайты Поделиться
JuGGerNaunT Опубликовано 17 сентября, 2012 Поделиться Опубликовано 17 сентября, 2012 указатель 0021E45C прибовляем 30 получаем 0012СС54 + 96 получаем 064EE746(конечный адрес..)Вот тут у тебя и ошибка. an2.exe + 0021E45C - это адрес от начала базы. an2.exe - это база. 0021E45C - смещение от нее. Чему равна база? Как ее найти через vamemory я не знаю, но это и не очень обязательно. Ее можно глянуть для конкретной игры в окне Enumerate Dlls(чтобы туда попасть нужно с окне Memory view выбрать View->Enumerates Dll's and Symbols).Обведенное - это значение базы. В этом списке тебе надо искать an2.exe. Т.е. в указанном выше примере получается:Указатель 0021E45C прибовляем 00400000(это база твоей игры, она может отличаться) и 30. Получаем 0012СС54 + 96 получаем 064EE746(конечный адрес)PS предвижу что это все равно ктонить скажет: да, база игры может меняться, поэтому правильно будет ее находить в программе с помощью специальной функции. Но т.к. на практике это редкий случай, то для начала достаточно подставлять ее вручную. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 18 сентября, 2012 Поделиться Опубликовано 18 сентября, 2012 Нет никакого jmp. Причём тут исполняемый код приложения и обыкновенные адреса?Советую вначале почитать об указателях, прежде чем говорить - http://ru.wikipedia....D0%B0_(C%2B%2B)Писал раньше для себя такую функцию. public int ReadPointer(int basepointer, Int32[] offsets, int level) { VAM = new VAMemory(process_name); int pointer = basepointer; for (int i = 0; i < level; i++) { pointer = VAM.ReadInteger((IntPtr)pointer) + offsets[i]; } return pointer; }Ошибка. Функция возвращает тип int и передаёт аргумент basepointer как int. Должно быть как минимум uint или uint64 для 64-разрядных ОС. Ссылка на комментарий Поделиться на другие сайты Поделиться
HPB Опубликовано 18 сентября, 2012 Автор Поделиться Опубликовано 18 сентября, 2012 вот зашёл в игру я ...именно такой же базовый адрес "00400000" и что дальше?как это всё будет примерно выглядеть в шарпе? Address op pointer ->hitman2.exe+0021E45CBaseAddress->0040000и как теперь быть?http://forum.gamehac...B5%D1%81%D1%83/что то я не поймуСпасибо за уроки которые я уже видел!Но меня все таки мучает один опрос, ответа на который я ни где не нашел.Как подключиться к базовому адресу, на который указывает указатель?Есть вот такой Offset, игры Half-Life:Вопрос как подключиться к указателю hw.dll+7bbd9c или модулю hw.dll, например в моем трейнере:using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Diagnostics;using System.Runtime.InteropServices;using System.Globalization;using System.Threading;namespace Half_Life_Opposing_Force{ public partial class Form1 : Form { #region Global variables Memory myMemory = new Memory(); Process[] myProcess; bool IsGameAvailable = false; bool UnlimitedAmmo = false; string AmmoPointer = "10343A08"; int[] AmmoOffset = { 0x578, 0xAC }; int ammoToFill = 50; #endregion public Form1() { InitializeComponent(); } private void UnlimAmmoBTN_Click(object sender, EventArgs e) { if (IsGameAvailable) { if (UnlimitedAmmo) { UnlimitedAmmo = false; UnlimAmmoBTN.Text = "OFF"; } else { UnlimitedAmmo = true; UnlimAmmoBTN.Text = "ON"; } } } private void GameAvailabilityTMR_Tick(object sender, EventArgs e) { myProcess = Process.GetProcessesByName("hl"); if (myProcess.Length != 0) { IsGameAvailable = true; statusLBL.Text = "Вы в игре"; } else { IsGameAvailable = false; statusLBL.Text = "Игра не запущенна"; } } private void UpdateCheatsTMR_Tick(object sender, EventArgs e) { if (IsGameAvailable) { #region Unlimited ammo if (UnlimitedAmmo) { myMemory.ReadProcess = myProcess[0]; myMemory.Open(); int pointerAddress = HexToDec(AmmoPointer); int[] pointerOffset = AmmoOffset; int bytesWriten; byte[] valueToWrite = BitConverter.GetBytes(ammoToFill); string writtenddress = myMemory.PointerWrite((IntPtr)pointerAddress, valueToWrite, pointerOffset, out bytesWriten); myMemory.CloseHandle(); } #endregion } } public static string HexToDec(int DEC) { return DEC.ToString("X"); } public static int HexToDec(string Hex) { return int.Parse(Hex, NumberStyles.HexNumber); } }} Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения