Перейти к содержанию

Рекомендуемые сообщения

создал тему с надеждой что люди форума помогут мне ..

выкладываю полный код моего проекта только с изменёнными адресами и смещениями

суть есть 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)

и выйти на тот адрес который содержит нужное мне значение .....затем тупо узнать его значение и перезаписывать (в этом коде часть чего я хочу уже имеется)

//привёл коменты чтоб было пояснее

Ссылка на комментарий
Поделиться на другие сайты

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);

Ссылка на комментарий
Поделиться на другие сайты

планы изменилась я всё таки научился делать так чтобы можно было присваивать переменной адрес из ТЕксбокса.....

а теперь такой вопрос ....как мне просто использую Метод 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);

покажет только значение УКАЗАТЕЛЯ (но не найдёт тот адрес на который указывает указатель)

image.png

прошу всё же кто сталкивался с таким случаем

как мне выйти на тот адрес который указывает "указатель" с опредлённым "одним" смещением вида "0x30"

// 0x - считать как кусок 16чной системы HEX

то что там написано 0A а в исходе 30 я просто по разному пытался и забыл исправить когда скринил

на скрине:

"картинка с СЕ"

"картинка с с#"

"картинка Откомп. Программы"

Ссылка на комментарий
Поделиться на другие сайты

Ты просто не правильно разобрался, что куда указывает.

image.png

Открой значение из своей таблицы, которое содержит указатель. Там где написано "твой указатель", подставляешь в строку

Int32 DestAddress = VAM.ReadInt32((IntPtr)твой_указатель);

А в textbox записываешь не это значение, а пересчитаное. В итоге получаешь:


Int32 DestAddress = VAM.ReadInt32((IntPtr)твой_указатель);
Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);
textBox1.Text = Convert.ToString(MyValue);

Ссылка на комментарий
Поделиться на другие сайты

>> Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);

Напоминаю, что у C# есть возможность реализации шаблонных функций. Т.е. через шаблонную функцию можно было бы сделать так

var myValue = VAM.Read<int>(((IntPtr)DestAddress) + 30);

В угловых скобках должен быть предопределен тип и это может быть: тип структуры, массив некоторого типа и даже интерфейс (если я не ошибся). Метод T Read<T> можно было бы добавить в класс VAMemory тоже самое касается и Write- метода

Ссылка на комментарий
Поделиться на другие сайты

Ты просто не правильно разобрался, что куда указывает.

image.png

Открой значение из своей таблицы, которое содержит указатель. Там где написано "твой указатель", подставляешь в строку

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);

в обоих случаях адреса были разные и не совпадали с адресом из СЕ

в се был адрес 069D2438

1 раз программа выдала адрес -1119040308

2 раз 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/

можно и вот так же? но тут столько классов что я путаюсь и не понимаю что же мне конкретно нужно

Ссылка на комментарий
Поделиться на другие сайты

у меня на месте "твой указатель" написано так "игра"+011D0EA0 + смещение 30

пробовал 2 сопсобами :

1 указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 0x30);

2. указывал Int32 MyValue = VAM.ReadInt32(((IntPtr)DestAddress) + 30);

в обоих случаях адреса были разные и не совпадали с адресом из СЕ

в се был адрес 069D2438

1 раз программа выдала адрес -1119040308

2 раз 1209416877

может их нужно конвертировать? а в каком они виде

textBox1.Text = Convert.ToString(MyValue);

Convert.ToString

я так понимаю что скорее всего в этом загвоздка

http://forum.gamehac...%D0%B0-vc-2010/

можно и вот так же? но тут столько классов что я путаюсь и не понимаю что же мне конкретно нужно

По-хорошему надо бы хоть немного самому выучить C# и понять - что есть указатель.

Ссылка на комментарий
Поделиться на другие сайты

я знаю что указатель это адрес в памяти и если я буду на него ссылаться то он должен "jmp" как бы на другой адрес + относительное смещение

минимальное знание о указатели и представление где работаю

а вы все такие "профи" ....сразу бы закопали ваша б воля

"на ошибках учатся"

я читал ни одну книгу и всегда мало что ясно, пока не попробуешь это сам.! ,а..когда сталкиваешь то на практике совсем все иначе

Ссылка на комментарий
Поделиться на другие сайты

я знаю что указатель это адрес в памяти и если я буду на него ссылаться то он должен "jmp" как бы на другой адрес + относительное смещение

минимальное знание о указатели и представление где работаю

а вы все таки "профи" ....сразу бы закопали ваша б воля

Ответ не верный.

Указатель - это обычный блок памяти в адресном пространстве, а содержит в себе он, не патроны или здоровье, а другой адрес.

То есть, вот наш указатель: 0x00F04096, и по этому адресу в памяти записана вот такая штука - 0x007A8000, т.е. указатель 0x00F04096 содержит в себе 0x007A8000.

Иными словами - он указывает на адрес - 0x007A8000, все адреса имеют тип целое 4 байта (DWORD/Int32).

Ссылка на комментарий
Поделиться на другие сайты

я и хотел это сказать не правильно выразился...

я знаю что указатель "указывает на другой адрес" тобишь обычный 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;
}

Ссылка на комментарий
Поделиться на другие сайты

где basepointer-указатель?

offsets-офсет смещения

? так или не так

или это так сложно или я такой тугодум

ааа ужасно как же это действует на мозг

Я думал ты в состоянии хоть что-то сам сделать.

basepointer - база указателя, offsets - массив смещений, level - кол-во смещений. Не знание англ. языка - карается смертью :-D

Ссылка на комментарий
Поделиться на другие сайты

к сож. учу немец но тут ничего сложного не было... вы правы

мне нужно :

int basepointer = 0x011А0EA0;

int offsets = 30;

int level = 1;

?

(int basepointer = 0x011А0EA0,int level = 1, Int32[] offsets = 0x30)

Ссылка на комментарий
Поделиться на другие сайты

к сож. учу немец но тут ничего сложного не было... вы правы

мне нужно :

int basepointer = 0x011D0EA0;

int offsets = 30;

int level = 1;

?

Второй параметр это массив. Так что надо int offsets[] = {0x30}; я думаю.

Остальные переменные создавать не надо, это можно сразу передать в функцию.

Ссылка на комментарий
Поделиться на другие сайты

всё таки с вторы параметром что то не так

гуглю. %)

JuGGerNaunT

а почему у меня его вариант выдавал другой адрес или это был вовсе не адрес?

Ты меня уже убивать начинаешь, вот берёшь прям, и режешь ножом.

Ссылка на комментарий
Поделиться на другие сайты

я только что нашел блог kenga случайно

и да я до сих пор не смог прочитать указатель..

выйти на действительный нужный мне адрес

поэтому и обратился к вам..так как не знал как справиться

у меня есть 2 программы

1. исполняемая (тобишь ты ввёл адрес и всё она покатила тебе там делать сама что надо)

2. именно нужно найти вот этот адрес чтобы именно в первую и вставить

код кенга очень массивный это ж сколько будет моя програмка хоть и в Кб но всё равно ....

Coder помоги ещё разок только чтоб уж до меня дошло до конца : (

ну не получается у меня я уже по разному перепробовал...

объясни на примеру игры Hitman - Silent Assassin как и что куда записать "как говориться последнее китайское после которого я пойму"

image.png

как я разобрался

указатель 0021E45C прибовляем 30 получаем 0012СС54 + 96 получаем 064EE746(конечный адрес..)

как мне его найти посредством c# разсусольте пожалуйста ..буду вам благодарен

мне не нужно найти значение а именно "конечный адрес" который в себе содержал указатель

Ссылка на комментарий
Поделиться на другие сайты

указатель 0021E45C прибовляем 30 получаем 0012СС54 + 96 получаем 064EE746(конечный адрес..)

Вот тут у тебя и ошибка. an2.exe + 0021E45C - это адрес от начала базы. an2.exe - это база. 0021E45C - смещение от нее. Чему равна база? Как ее найти через vamemory я не знаю, но это и не очень обязательно. Ее можно глянуть для конкретной игры в окне Enumerate Dlls(чтобы туда попасть нужно с окне Memory view выбрать View->Enumerates Dll's and Symbols).

image.png

Обведенное - это значение базы. В этом списке тебе надо искать an2.exe. Т.е. в указанном выше примере получается:

Указатель 0021E45C прибовляем 00400000(это база твоей игры, она может отличаться) и 30. Получаем 0012СС54 + 96 получаем 064EE746(конечный адрес)

PS предвижу что это все равно ктонить скажет: да, база игры может меняться, поэтому правильно будет ее находить в программе с помощью специальной функции. Но т.к. на практике это редкий случай, то для начала достаточно подставлять ее вручную.

Ссылка на комментарий
Поделиться на другие сайты

Нет никакого 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-разрядных ОС.

Ссылка на комментарий
Поделиться на другие сайты

вот зашёл в игру я ...именно такой же базовый адрес "00400000"

и что дальше?

image.png

как это всё будет примерно выглядеть в шарпе?

Address op pointer ->hitman2.exe+0021E45C

BaseAddress->0040000

и как теперь быть?

http://forum.gamehac...B5%D1%81%D1%83/

что то я не пойму

Спасибо за уроки которые я уже видел!

Но меня все таки мучает один опрос, ответа на который я ни где не нашел.

Как подключиться к базовому адресу, на который указывает указатель?

Есть вот такой Offset, игры Half-Life:

14908570873c9e341f65032e29c6bc50.jpg

Вопрос как подключиться к указателю 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);
}
}
}

Ссылка на комментарий
Поделиться на другие сайты

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.