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

Не записываются байты в память (C#)


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

Здравствуйте.

Возникла проблема.

Хочу сделать что то вроде само-обновляемого трейнера. Но почему то после поиска сигнатур (При включении/выключении чекбокса) функция включается, а вот назад никак не хочет выключаться.

Приведу код:

Для переключения функций используется статическая булева переменная:

static bool func1 = false;

Код поиска сигнатуры, и записи в в память:


private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
SigScan _sigScan = new SigScan(seap, new IntPtr(0x401000), 0x10bc000);
byte[] buffer2 = new byte[] { 0x75, 0x05, 0xC6, 0x44, 0x24, 0x0B, 0x01, 0x85, 0xC0, 0x0F, 0x94, 0xC1, 0x83, 0xF8, 0x01, 0x0F, 0x94, 0x44, 0x24, 0x0C, 0x83, 0xF8, 0x02, 0x0F, 0x94, 0x44, 0x24, 0x0D, 0x80, 0xBE, 0xE9, 0x0C, 0x00, 0x00, 0x00, 0x53, 0x74, 0x13, 0xD9, 0xEE };
IntPtr num = _sigScan.FindPattern(buffer2, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 0);
if (func1 == false)//если переменная [BYTE] равна 0(true - 1, false - 0)
{
byte[] buffer = new byte[] { 0x90, 0x90 };//байт, который записывается,если переменная [BYTE] равна 0, то есть выключена функция.
memory.WriteByteArray((IntPtr)num, buffer);//записываем в адрес байты.
checkBox1.Checked = true;
func1 = true;
}
else//Иначе
{
byte[] buffer = new byte[] { 0x75, 0x05 };//байт, который записывается, если переменная [BYTE] равна 1, то есть включена функция.
memory.WriteByteArray((IntPtr)num, buffer);//записываем в адрес байты.
checkBox1.Checked = false;
func1 = false;
}

Всё никак не могу разобраться, в чём проблема то? :(

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

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

1)90 90 90 90 90 90

изменил ее на

2)80 90 90 90 90 90

принцип твоего трейнера в том чтобы найти 1 сигнатуру и заменить первый байт на 80 ... ну когда ты деактивируешь функцию происходить снова сканирование по первой цепочке байт ... ну увы сигнатура уже изменилась ... по этому ты и не можешь записать байты при деактивации функции

Вот должно работать


private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
SigScan _sigScan = new SigScan(seap, new IntPtr(0x401000), 0x10bc000);

if (func1 == false)//если переменная [BYTE] равна 0(true - 1, false - 0)
{
byte[] buffer2 = new byte[] { 0x75, 0x05, 0xC6, 0x44, 0x24, 0x0B, 0x01, 0x85, 0xC0, 0x0F, 0x94, 0xC1, 0x83, 0xF8, 0x01, 0x0F, 0x94, 0x44, 0x24, 0x0C, 0x83, 0xF8, 0x02, 0x0F, 0x94, 0x44, 0x24, 0x0D, 0x80, 0xBE, 0xE9, 0x0C, 0x00, 0x00, 0x00, 0x53, 0x74, 0x13, 0xD9, 0xEE };
IntPtr num = _sigScan.FindPattern(buffer2, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 0);
byte[] buffer = new byte[] { 0x90, 0x90 };//байт, который записывается,если переменная [BYTE] равна 0, то есть выключена функция.
memory.WriteByteArray((IntPtr)num, buffer);//записываем в адрес байты.
checkBox1.Checked = true;
func1 = true;
}
else//Иначе
{
byte[] buffer2 = new byte[] { 0x90, 0x90, 0xC6, 0x44, 0x24, 0x0B, 0x01, 0x85, 0xC0, 0x0F, 0x94, 0xC1, 0x83, 0xF8, 0x01, 0x0F, 0x94, 0x44, 0x24, 0x0C, 0x83, 0xF8, 0x02, 0x0F, 0x94, 0x44, 0x24, 0x0D, 0x80, 0xBE, 0xE9, 0x0C, 0x00, 0x00, 0x00, 0x53, 0x74, 0x13, 0xD9, 0xEE };
IntPtr num = _sigScan.FindPattern(buffer2, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 0);
byte[] buffer = new byte[] { 0x75, 0x05 };//байт, который записывается, если переменная [BYTE] равна 1, то есть включена функция.
memory.WriteByteArray((IntPtr)num, buffer);//записываем в адрес байты.
checkBox1.Checked = false;
func1 = false;
}

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

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

1)90 90 90 90 90 90

изменил ее на

2)80 90 90 90 90 90

принцип твоего трейнера в том чтобы найти 1 сигнатуру и заменить первый байт на 80 ... ну когда ты деактивируешь функцию происходить снова сканирование по первой цепочке байт ... ну увы сигнатура уже изменилась ... по этому ты и не можешь записать байты при деактивации функции

Вот должно работать


private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
SigScan _sigScan = new SigScan(seap, new IntPtr(0x401000), 0x10bc000);

if (func1 == false)//если переменная [BYTE] равна 0(true - 1, false - 0)
{
byte[] buffer2 = new byte[] { 0x75, 0x05, 0xC6, 0x44, 0x24, 0x0B, 0x01, 0x85, 0xC0, 0x0F, 0x94, 0xC1, 0x83, 0xF8, 0x01, 0x0F, 0x94, 0x44, 0x24, 0x0C, 0x83, 0xF8, 0x02, 0x0F, 0x94, 0x44, 0x24, 0x0D, 0x80, 0xBE, 0xE9, 0x0C, 0x00, 0x00, 0x00, 0x53, 0x74, 0x13, 0xD9, 0xEE };
IntPtr num = _sigScan.FindPattern(buffer2, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 0);
byte[] buffer = new byte[] { 0x90, 0x90 };//байт, который записывается,если переменная [BYTE] равна 0, то есть выключена функция.
memory.WriteByteArray((IntPtr)num, buffer);//записываем в адрес байты.
checkBox1.Checked = true;
func1 = true;
}
else//Иначе
{
byte[] buffer2 = new byte[] { 0x90, 0x90, 0xC6, 0x44, 0x24, 0x0B, 0x01, 0x85, 0xC0, 0x0F, 0x94, 0xC1, 0x83, 0xF8, 0x01, 0x0F, 0x94, 0x44, 0x24, 0x0C, 0x83, 0xF8, 0x02, 0x0F, 0x94, 0x44, 0x24, 0x0D, 0x80, 0xBE, 0xE9, 0x0C, 0x00, 0x00, 0x00, 0x53, 0x74, 0x13, 0xD9, 0xEE };
IntPtr num = _sigScan.FindPattern(buffer2, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", 0);
byte[] buffer = new byte[] { 0x75, 0x05 };//байт, который записывается, если переменная [BYTE] равна 1, то есть включена функция.
memory.WriteByteArray((IntPtr)num, buffer);//записываем в адрес байты.
checkBox1.Checked = false;
func1 = false;
}

Работает, но немного с другой маской, т.к НОП равен одному байту.

Сарказм ?

Ни в коем случае, искренняя благодарность ;)

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

Работает, но немного с другой маской, т.к НОП равен одному байту.

Ни в коем случае, искренняя благодарность ;)

++ спс__))

Хотел добавить зачем обновлять переменную

static bool func1 = false;

ведь у чекбокса есть свойство и так - false = True оно равно свойству CheckBox.Checked = True(False)

просто сделай так

if CheckBox1.Checked = True

bla bla bla

else

bla bla bla

end;

на много проще ))

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

Ах да, сигнатура тоже поменьше стала (Это так, на заметку)

++ спс__))

Хотел добавить зачем обновлять переменную

ведь у чекбокса есть свойство и так - false = True оно равно свойству CheckBox.Checked = True(False)

просто сделай так

if CheckBox1.Checked = True

bla bla bla

else

bla bla bla

end;

на много проще ))

Не знаю, в хоткее используются переменные, поэтому привык к ним :) А так да, легче ;)

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

Работает, но немного с другой маской, т.к НОП равен одному байту.

Ни в коем случае, искренняя благодарность ;)

да не много на C# мозго** со сканером )) Ну и на delphi тоже самое )) только с одним отличием не нужно вводить маску )) Тупо байты - начало = конец сканирования и усе ))

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

да не много на C# мозго** со сканером )) Ну и на delphi тоже самое )) только с одним отличием не нужно вводить маску )) Тупо байты - начало = конец сканирования и усе ))

Типа, вот такого: 72 D9 EB ?? C4 F0 ?? ?? ?? 38? Если да, то на C# тоже так можно сделать, но в ольке (OllyDBG), как ты наверное знаешь сигнатура и маска выдаются отдельно друг от друга, поэтому так и реализовываем ;)

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

×
×
  • Создать...

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

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