Перейти к содержимому


Фотография
- - - - -

[C#] AOBScan или "откажемся от примитивного ЛУА"


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 iDReeM

iDReeM

    Капрал

  • Пользователи
  • PipPip
  • Репутация
    12
  • 16 сообщений
  • 2 тем

Отправлено 19 Июнь 2015 - 03:47

Всем ку, фишка вот в чем: мне надоело то, что всякие "запутавшиеся" юзеры, вояют читы на самом примитивном огрызке который смеет называться языком программирования, а именно на ЛУА, сегодня хочу хотя бы от части, перетащить вас в шарп) по этому намутил для васс класс, AOBScan средстами этого ЯП, строго не судите:

public class AOBScan
{
    protected uint ProcessID;
    public AOBScan(uint ProcessID)
    {
        this.ProcessID = ProcessID;
    }

    [DllImport("kernel32.dll")]
    protected static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] buffer, uint size, int lpNumberOfBytesRead);
    [DllImport("kernel32.dll")]
    protected static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, int dwLength);

    [StructLayout(LayoutKind.Sequential)]
    protected struct MEMORY_BASIC_INFORMATION
    {
        public IntPtr BaseAddress;
        public IntPtr AllocationBase;
        public uint AllocationProtect;
        public uint RegionSize;
        public uint State;
        public uint Protect;
        public uint Type;
    }

    protected List<MEMORY_BASIC_INFORMATION> MemoryRegion { get; set; }

    protected void MemInfo(IntPtr pHandle)
    {
        IntPtr Addy = new IntPtr();
        while (true)
        {
            MEMORY_BASIC_INFORMATION MemInfo = new MEMORY_BASIC_INFORMATION();
            int MemDump = VirtualQueryEx(pHandle, Addy, out  MemInfo, Marshal.SizeOf(MemInfo));
            if (MemDump == 0) break;
            if ((MemInfo.State & 0x1000) != 0 && (MemInfo.Protect & 0x100) == 0)
                MemoryRegion.Add(MemInfo);
            Addy = new IntPtr(MemInfo.BaseAddress.ToInt32() + (int)MemInfo.RegionSize);
        }
    }
    protected IntPtr Scan(byte[] sIn, byte[] sFor)
    {
        int[] sBytes = new int[256]; int Pool = 0;
        int End = sFor.Length - 1;
        for (int i = 0; i < 256; i++)
            sBytes[i] = sFor.Length;
        for (int i = 0; i < End; i++)
            sBytes[sFor[i]] = End - i;
        while (Pool <= sIn.Length - sFor.Length)
        {
            for (int i = End; sIn[Pool + i] == sFor[i]; i--)
                if (i == 0) return new IntPtr(Pool);
            Pool += sBytes[sIn[Pool + End]];
        }
        return IntPtr.Zero;
    }
    public IntPtr AobScan(byte[] Pattern)
    {
        Process Game = Process.GetProcessById((int)this.ProcessID);
        if (Game.Id == 0) return IntPtr.Zero;
        MemoryRegion = new List<MEMORY_BASIC_INFORMATION>();
        MemInfo(Game.Handle);
        for (int i = 0; i < MemoryRegion.Count; i++)
        {
            byte[] buff = new byte[MemoryRegion[i].RegionSize];
            ReadProcessMemory(Game.Handle, MemoryRegion[i].BaseAddress, buff, MemoryRegion[i].RegionSize, 0);

            IntPtr Result = Scan(buff, Pattern);
            if (Result != IntPtr.Zero)
                return new IntPtr(MemoryRegion[i].BaseAddress.ToInt32() + Result.ToInt32());
        }
        return IntPtr.Zero;
    }
} 

Зависимости:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Runtime.InteropServices; 

Использование:

AOBScan ScanMemory = new AOBScan(айди процесса);
int SomeAdress = (int)ScanMemory.AobScan(new byte[] { 0x00 }); 

  • 1

#2 Hex

Hex

    Мастер-сержант

  • Пользователи
  • PipPipPipPip
  • Репутация
    -7
  • 37 сообщений
  • 2 тем

Отправлено 25 Июнь 2015 - 08:11

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытый текст

Он уже и до сюда добрался  :)


  • 0

#3 MByte

MByte

    Генералиссимус

  • Пользователи
  • PipPipPipPipPipPipPipPipPipPipPipPipPipPipPip
  • Репутация
    539
  • 272 сообщений
  • 4 тем

Отправлено 25 Июнь 2015 - 20:28

Чо обидно то, что тут возвращает один адресс после поиска, а лучше было бы если бы возвращало StringList


  • 0

#4 iDReeM

iDReeM

    Капрал

  • Пользователи
  • PipPip
  • Репутация
    12
  • 16 сообщений
  • 2 тем

Отправлено 25 Июнь 2015 - 20:45

Чо обидно то, что тут возвращает один адресс после поиска, а лучше было бы если бы возвращало StringList

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


  • 0

#5 MByte

MByte

    Генералиссимус

  • Пользователи
  • PipPipPipPipPipPipPipPipPipPipPipPipPipPipPip
  • Репутация
    539
  • 272 сообщений
  • 4 тем

Отправлено 26 Июнь 2015 - 09:42

 

Чо обидно то, что тут возвращает один адресс после поиска, а лучше было бы если бы возвращало StringList

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

 

Не знаю этот C#, а именно ебучий синтаксис, но в дельфи со списком мороки нету:

if FindAll = False then
              begin
                if (FByte(PByte(Integer(buffer) + i), @sign[0], _mask)) then
                begin
                  List.Add(IntToStr(Integer(mbi.BaseAddress) + i));
                  Break;
                end;
              end;
              if FindAll = True then
              begin
                if (FByte(PByte(Integer(buffer) + i), @sign[0], _mask)) then
                begin
                  List.add(IntToStr(Integer(mbi.BaseAddress) + i));
                end;
              end;

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


  • 0

#6 iDReeM

iDReeM

    Капрал

  • Пользователи
  • PipPip
  • Репутация
    12
  • 16 сообщений
  • 2 тем

Отправлено 26 Июнь 2015 - 13:31

 

 

Чо обидно то, что тут возвращает один адресс после поиска, а лучше было бы если бы возвращало StringList

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

 

Не знаю этот C#, а именно ебучий синтаксис, но в дельфи со списком мороки нету:

if FindAll = False then
              begin
                if (FByte(PByte(Integer(buffer) + i), @sign[0], _mask)) then
                begin
                  List.Add(IntToStr(Integer(mbi.BaseAddress) + i));
                  Break;
                end;
              end;
              if FindAll = True then
              begin
                if (FByte(PByte(Integer(buffer) + i), @sign[0], _mask)) then
                begin
                  List.add(IntToStr(Integer(mbi.BaseAddress) + i));
                end;
              end;

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

 

да я понял о чем ты, лично не вижу в этом смысла, ну нашло оно 10 адресов, записало их в лист, и толку? в большинстве случаев - нужно патчить только один.


  • 0

#7 iDReeM

iDReeM

    Капрал

  • Пользователи
  • PipPip
  • Репутация
    12
  • 16 сообщений
  • 2 тем

Отправлено 26 Июнь 2015 - 15:02

вот вам пруф работоспособности: cccc3c4aa959.jpg


  • 0

#8 gta0707

gta0707

    Рядовой

  • Пользователи
  • Pip
  • Репутация
    0
  • 5 сообщений
  • 1 тем

Отправлено 29 Июнь 2015 - 00:08

Как маску задать ?
чито это :
for (int i = 0; i < 256; i++)
sBytes = sFor.Length;


плохойкод (зачем?)
Pool += sBytes[sIn[Pool + End]];



в памяти 01 01 01 01 03
ищем 01 01 01 03
твоя хрень не найдет. она после 1 й итерации пропустит первые 3 единицы и будет сравнивать с 01 03 на 2й итерации


  • 0

#9 iDReeM

iDReeM

    Капрал

  • Пользователи
  • PipPip
  • Репутация
    12
  • 16 сообщений
  • 2 тем

Отправлено 29 Июнь 2015 - 12:59

Как маску задать ?
чито это :
for (int i = 0; i < 256; i++)
sBytes = sFor.Length;


плохойкод (зачем?)
Pool += sBytes[sIn[Pool + End]];



в памяти 01 01 01 01 03
ищем 01 01 01 03
твоя хрень не найдет. она после 1 й итерации пропустит первые 3 единицы и будет сравнивать с 01 03 на 2й итерации

а зачем тебе маска? это АОБСКАН а не финд паттерн.

ты хоть знаешь зачем там 256 стоит? почитай про системы счисления.


  • 1




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных