4L4K1 Ответов: 3

Как найти все переменные, которые использует exe-файл?


Как найти все переменные, которые использует exe-файл?
Я имею в виду, можно ли оштрафовать Адрес, Тип или имя переменной ?
У меня есть exe-файл, который не знает, на каком языке написан.
Но когда вы запустите его, процесс начнет работать, и переменные будут инициализированы в оперативной памяти.
Я умею читать по памяти
Я знаю, что переменные (адрес,тип,имя) тоже находятся в памяти.
Но я не знаю, что такое байты для какой переменной.
Вот как я читаю память о процессе.

Что я уже пробовал:

const int PROCESS_WM_READ = 0x0010;
const int PROCESS_ALL_ACCESS = 0x1F0FFF;
[DllImport("kernel32.dll")]
public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);

[DllImport("kernel32.dll")]
public static extern bool ReadProcessMemory(int hProcess, long lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool WriteProcessMemory(int hProcess, long lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesWritten);

public Process process;
public IntPtr processHandle;

void Read()
{
    process = Process.GetProcessesByName("ProcessesName")[0];
    processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);

    IntPtr startOffset = process.MainModule.BaseAddress;
    IntPtr endOffset = IntPtr.Add(startOffset, process.MainModule.ModuleMemorySize);
    string startOffsetStr = startOffset.ToString("X");
    string endOffsetStr = endOffset.ToString("X");

    int start = int.Parse(startOffsetStr, NumberStyles.HexNumber);
    int end = int.Parse(endOffsetStr, NumberStyles.HexNumber);
    int totalBytes = end - start;
    int bytesRead = 0;
    byte[] buffer = new byte[totalBytes];

    ReadProcessMemory((int)processHandle, start, buffer, buffer.Length, ref bytesRead);
    string result = ByteArrayToHexString(buffer);
    File.WriteAllText("C:\\result.txt", result);

}
public static string ByteArrayToHexString(byte[] baytes)
{
    StringBuilder hex = new StringBuilder(baytes.Length * 2);
    for (int i = baytes.Length - 1; i >= 0; i--)
    {

        hex.AppendFormat("{0:x2}", baytes[i]);
    }

    return hex.ToString();
}

Заранее благодарю вас.

johannesnestler

"У меня есть exe-файл, который не знает, на каком языке написан"... [- да и вы не узнаете (может быть, догадываетесь, хотя и с большим количеством знаний) - https://en.wikipedia.org/wiki/.exe ]
"Я знаю,что переменные (адрес,тип, имя) тоже находятся в памяти". ... [ нет, это не так - это просто адрес]
Эти предложения показывают мне, что вы должны узнать много, прежде чем вы сможете взломать процессы или реинжинирировать их.
Может быть, вы скажете нам свою конечную цель - может быть, есть лучший способ ее достичь?

3 Ответов

Рейтинг:
2

Mehdi Gholam

Это не тот вопрос, на который можно ответить в целом, так как если вы не знаете используемый компилятор, то вы не можете эффективно делать то, что хотите.

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


Рейтинг:
2

Dave Kreskowiak

У вас нет никакого способа "найти" эти вещи для вас. Вы просто должны быть действительно хороши в использовании WinDbg и анализе кода, который выполняется, чтобы определить, где значения, которые вы пытаетесь найти, хранятся в адресном пространстве процесса.

Там нет ничего, что будет делать это для вас автоматически

О, и когда код компилируется в файл .EXE или .DLL и запускается, такой вещи, как "переменная", не существует. Это просто значения где-то в памяти.


Рейтинг:
0

OriginalGriff

Ты не можешь.
В современных программах существует три типа переменных:
1) локальные переменные - они основаны на стеке и существуют только в то время, когда содержащий метод фактически выполняется. Как только метод возвращается, они уничтожаются. Их адрес зависит от потока, в котором они выполняются, и порядка, в котором вызывается метод.
2) переменные на основе классов - они основаны на куче, но являются локальными для экземпляра класса, который используется в данный момент: если у вас есть три экземпляра, то у вас есть три разных местоположения для переменной, по одному для каждого экземпляра. (Думайте об этом как о перчаточном ящике - у каждого автомобиля есть отдельный, поэтому местоположение перчаточного ящика зависит от физического местоположения автомобиля, частью которого он является.) Расположение экземпляра класса в памяти не обязательно фиксировано относительно чего - либо и в современных фреймворках может даже не оставаться неизменным в течение всего срока службы приложения-они могут быть перемещены в память для освобождения места и компактного использования памяти.
3) глобальные (или статические) переменные. Их адрес фиксируется при запуске приложения, но они не так часто встречаются в современных приложениях.

Из всех этих вариантов у вас есть шанс найти действительный и фиксированный адрес только для последнего - и они используются меньше, чем раньше.

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

Я подозреваю, что, что бы вы ни пытались сделать, вы не найдете это совсем простым - если это возможно. Если вы пытаетесь взломать игры, например, вы, вероятно, не найдете это работает вообще ...