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

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

Делаем Aobscan:

Сразу к делу. Допустим есть у вас нужный скрипт и на него нужно повесить Aobscan. Идём в Memory View, на любой иструкции кликаем правой кн. мыши и выбераем пункт Go to adress. Копируем из скрипта адрес инструкции, например "nfs.exe"+1224F5 и вставляем его в поле для ввода в окошке Go to adress, нажимаем Ок. Вы перейдёте к вашей инструкции, далее выделите вашу инструкцию левой кн. мыши, зажмите клавишу Shift и отсчитайте от неё вниз 5 инструкций. Отсчитали? Теперь держа Shift клацните на пятую инструкцию. Итого вместе с вашей инструкцией получится 6 выделенных. Далее не снимая выделение нажмите правую кн. мыши и выберите Copy to clippboard --> Bytes. Надеюсь у вас получилось. Далее откройте блокнот и вставьте туда скопированное нажатием Ctrl+V. В блокноте будет 6 строчек такого вида:


XXX+376F - 68 DC7D4001
XXX+3774 - 64 A1 00000000
XXX+377A - 50
XXX+377B - 64 89 25 00000000
XXX+3782 - 83 EC 58
XXX+3785 - 53

Приведите их к такому виду:


68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53

Я надеюсь вы поняли что я сделал. ОБЯЗАТЕЛЬНО должно быть по 2 цифры и между ними отступ - 01 02

Далее идём в Memory View --> Tools --> Lua Engine, появляется окно с двумя строками, в нижнюю бьём такой код:


sl = AOBScan("ХХ ХХ ХХ ХХ ХХ");
if(sl == nil) then
print("No code found!");
else
j = stringlist_getCount(sl);
print("Found:",j);
for i = 1, j do
print(stringlist_getString(sl,i-1));
end
object_destroy(sl);
end

Вместо XX вставляем наши байты:


sl = AOBScan("68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53");
if(sl == nil) then
print("No code found!");
else
j = stringlist_getCount(sl);
print("Found:",j);
for i = 1, j do
print(stringlist_getString(sl,i-1));
end
object_destroy(sl);
end

И жмём Execute, программа задумалась............ Но не зависла, ждём...

В Output в конце концов должна будет появиться надпись:


Found: 1
12345678 - ничего не напоминает? Неет?!

Идём в Memory View и смотрим адрес нашей инструкции из скрипта - 12345678 - 8B 74 24 08 - mov esi,[esp+08], совпадает? Ура, мы нашли правильные проверочные байты!

Далее идём к нашему скрипту, на который будем вешать AOBScan и адаптируем под мой пример:


[ENABLE]
alloc(newmem,2048)
label(ammo)
label(returnhere)
registersymbol(ammo)
aobscan(aob_ammo,68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53) Естественно сюда вставляем наши проверочные байты.

newmem:
mov [esi+00000140],#100
mov eax,[esi+00000140]
jmp returnhere

aob_ammo:
ammo:
jmp newmem
nop
returnhere:

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
unregistersymbol(ammo)
ammo:
mov eax,[esi+00000140]
//Alt: db 8B 86 40 01 00 00

Вместо ammo пишем что угодно.

Ну вот вы сделали скрипт заряженый проверочными байтами ;)

Автор статьи - Ac1d

Автор lua скрипта для проверки - Akama

Автор скрипта-болванки - Ac1d

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

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

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

Адреса лучше выводить в hex виде. Я бы так написал:


function CheckAOBScan(signature)
local sl = AOBScan(signature);
if(sl == nil) then
print("No code found!");
else
local count = stringlist_getCount(sl);
print("Found:",count);

local maxIndex = count-1;
for i = 0, maxIndex do
local line = stringlist_getString(sl,i)
local line2 = string.format("%3d) 0x%08x: ", i+1, line )
print(line2);
end

object_destroy(sl);
end
end

CheckAOBScan("68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53")
CheckAOBScan("68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53")
CheckAOBScan("68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53")
CheckAOBScan("68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53")
CheckAOBScan("68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53")

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

  • 2 месяца спустя...

мне это не понятно Идём в Memory View и смотрим адрес нашей инструкции из скрипта - 12345678 - 8B 74 24 08 - mov esi,[esp+08], откуда вы взяли это все 12345678 - 8B 74 24 08 - mov esi,[esp+08] ????? вот я пробовал вот что вышло

sl = AOBScan("6A 70 68 90 13 00 01 E8 DF 01 00 00 33 DB 53 8B 3D 8C 10 00 01");

if(sl == nil) then

print("No code found!");

else

j = stringlist_getCount(sl);

print("Found:",j);

for i = 1, j do

print(stringlist_getString(sl,i-1));

end

object_destroy(sl);

end

Found: 1

01003E21

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

мне это не понятно Идём в Memory View и смотрим адрес нашей инструкции из скрипта - 12345678 - 8B 74 24 08 - mov esi,[esp+08], откуда вы взяли это все 12345678 - 8B 74 24 08 - mov esi,[esp+08] ????? вот я пробовал вот что вышло

sl = AOBScan("6A 70 68 90 13 00 01 E8 DF 01 00 00 33 DB 53 8B 3D 8C 10 00 01");

if(sl == nil) then

print("No code found!");

else

j = stringlist_getCount(sl);

print("Found:",j);

for i = 1, j do

print(stringlist_getString(sl,i-1));

end

object_destroy(sl);

end

Found: 1

01003E21

Кнопочка Memory View открывает окно отладчика, верхняя часть которого состоит из дизассемблированных команд, а нижняя - из дампа памяти. Вот как раз в верхнем окне команды и записываются следующим образом:

Адрес - Опкоды - Мнемоника

Например:

0x123456 90 nop

Как раз опкоды (представления команд в виде цифр, а не букв) и нужны для работы aobscan;

Вот как это выглядит на примере OllyDbg:

post-6695-0-21258600-1341067856_thumb.pn

Выделенная строчка:

00A45025  |.  8945 FC         MOV DWORD PTR SS:[LOCAL.1],EAX

Адрес: 0х00A45025

Опкоды: 89 45 FC

Мнемоника: MOV DWORD PTR SS:[LOCAL.1],EAX

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

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

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

так вот не пойму что делать то что бы все норм работало ) сказали что надо aobscan вот и я пишу тут

кенг расскажи еще ты что надо делать пожалуйста

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

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

сори за вопрос ну это как ?

Это когда ты нашёл адрес памяти, жмёшь на нём ПКМ и говоришь "Find what writes to this address", выскакивает окошко отладчика - идёшь обратно в игру и значение адреса меняешь - а отладчик показывает инструкции, которые это самое значение поменяли. Вот у тебя там выскочила инструкция call блаблабла - это явно не то, потому что это вызов функции, а инструкции должны быть аля:


inc eax
dec eax
mov eax,ebx
mov [0x12345],eax
fstp [eax+0x25]

Такого вида, но никак не какие-нибудь call или ret. Попробуй подольше поизменять адрес - если, к примеру, ищешь патроны - смени оружие, поперезаряжайся и так далее. Если вылезает только эта инструкция - попробуй найти значение чего-нибудь ещё, например гранат или здоровья.

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

1. Проверяешь, что это верный адрес (пишешь скрипт).

2. Берёшь опкоды (89 86 64 07 и так далее) из отладчика, модифицируешь скрипт с использованием aobscan().

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

1. Проверяешь, что это верный адрес (пишешь скрипт).

2. Берёшь опкоды (89 86 64 07 и так далее) из отладчика, модифицируешь скрипт с использованием aobscan().

1 как его проверить ?

2 как его модифицировать скрипт ?

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

Што значит "как проверить"? Пишешь скрипт для этого адреса, если работает - значит адрес верный и команду ты нашёл нужную, если нет - значит нет. Ты же до этого скрипты писал (без aobscan) - вот то же самое. Самый обычный скрипт.

Хотя, если ты задаёшь подобные вопросы - можешь ответить, зачем тебе использование aobscan в скрипте понадобилось?

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

Мне кажется, Босс, ты зациклился. Я эти вопросы уже видел в других ветках форума, и на них уже давались ответы. Если ты забываешь все что тебе говорили, может тебе в тетрадку записывать?

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

Мне кажется, Босс, ты зациклился. Я эти вопросы уже видел в других ветках форума, и на них уже давались ответы. Если ты забываешь все что тебе говорили, может тебе в тетрадку записывать?

Я, кстати, именно по этой причине веду блог (и заодно в тетрадку записываю) - у меня от этого информация гораздо лучше в голове укладывается. :D

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

Што значит "как проверить"? Пишешь скрипт для этого адреса, если работает - значит адрес верный и команду ты нашёл нужную, если нет - значит нет. Ты же до этого скрипты писал (без aobscan) - вот то же самое. Самый обычный скрипт.

Хотя, если ты задаёшь подобные вопросы - можешь ответить, зачем тебе использование aobscan в скрипте понадобилось?

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

Мне кажется, Босс, ты зациклился. Я эти вопросы уже видел в других ветках форума, и на них уже давались ответы. Если ты забываешь все что тебе говорили, может тебе в тетрадку записывать?

та у меня когда то была тетрадка все записывал там ) я думаю надо видео уроков по больше вот как кенг сделал уроки и все понятно хотя надо и без видео уроков учится ну это тяжело я просто всего много хочу сделать и не знаю с чего начать а людей мало кто помогут
Ссылка на комментарий
Поделиться на другие сайты

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

та у меня когда то была тетрадка все записывал там ) я думаю надо видео уроков по больше вот как кенг сделал уроки и все понятно хотя надо и без видео уроков учится ну это тяжело

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

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

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

спасибо щас попробую сделать скрипт и проверить )

все сделал всем спасибо все пашет )

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

  • 1 год спустя...

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

Допустим:


68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53

А стало, например:


68 ? ? ? 01 64 ? ? ? ? ? ? 64 89 25 00 00 00 00 83 EC 58 53

Не раз такое видел в скриптах на этом сайте. И интересно узнать, как и с чем это едят?

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

И также интересно, почему в примере берем 5 строк снизу? А не сверху, допустим? Это зависит от адреса инструкции? Т.е. с того момента, где нам показал отладчик нужную строку с инструкцией, и до того момента, где заканчивается оперирование значением?

Вопросов уйма, догадок - еще больше... не знаю куда податься прям.

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

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

Допустим:


68 DC 7D 40 01 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53

А стало, например:


68 ? ? ? 01 64 ? ? ? ? ? ? 64 89 25 00 00 00 00 83 EC 58 53

Не раз такое видел в скриптах на этом сайте. И интересно узнать, как и с чем это едят?

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

И также интересно, почему в примере берем 5 строк снизу? А не сверху, допустим? Это зависит от адреса инструкции? Т.е. с того момента, где нам показал отладчик нужную строку с инструкцией, и до того момента, где заканчивается оперирование значением?

Вопросов уйма, догадок - еще больше... не знаю куда податься прям.

В некоторых играх сигнатура может изменяться, т.е. байты в сигнатуре поэтому прописываются знаки вопроса

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

Насчёт отчёта 5 ти строк вниз - можно брать 5 строк, можно и больше чем длиннее сигнатура тем уникальний скрипт.

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

По вопр. знакам понятно. А вот по поводу строк - еще вопрос: если, допустим, я возьму несколько строк из другой сигнатуры, это как-то повлияет на работу скрипта?

Также еще вопрос по поводу составления АА скрипта.

Несколько раз видел такой шаблон скрипта с аобсканом:


[ENABLE]
aobscan(some_name, bytes)
registersymbol(some_name)

some_name:
db ##

[DISABLE]
some_name:
db ##
unregistersymbol(some_name)

Вместо ## что именно вписывается? Значение? Проверочные байты? Если значение, то почему в секции disable это тоже необходимо? Ведь по-умолчанию (зачастую) значение может быть любым, и это не так важно (по-моему), как в случае с инструкциями. И как скрипт понимает, на каком именно месте (строке) нужно делать инъекцию? Путем вписывания вместо ## - проверочных байт? Тогда как указать значение?

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

По вопр. знакам понятно. А вот по поводу строк - еще вопрос: если, допустим, я возьму несколько строк из другой сигнатуры, это как-то повлияет на работу скрипта?

Также еще вопрос по поводу составления АА скрипта.

Несколько раз видел такой шаблон скрипта с аобсканом:


[ENABLE]
aobscan(some_name, bytes)
registersymbol(some_name)

some_name:
db ##

[DISABLE]
some_name:
db ##
unregistersymbol(some_name)

Вместо ## что именно вписывается? Значение? Проверочные байты? Если значение, то почему в секции disable это тоже необходимо? Ведь по-умолчанию (зачастую) значение может быть любым, и это не так важно (по-моему), как в случае с инструкциями. И как скрипт понимает, на каком именно месте (строке) нужно делать инъекцию? Путем вписывания вместо ## - проверочных байт? Тогда как указать значение?

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

Насчёт ## сдесь вписываются нопы тоесть "nop"

Пример

[ENABLE]
aobscan(Infinite_Ammo_aob, f3xxxxxxxxxxxxxxf3xxxxxx0f2fxx0f86xxxxxxxx8bxxxxxxxxxx80)
alloc(newmem, 2048)
label(returnhere)
label(Infinite_Ammo)
registersymbol(Infinite_Ammo)

newmem:
mov [ebx+00000C4C],437A0000
movss xmm0,[ebx+00000C4C]
jmp returnhere

Infinite_Ammo_aob:
Infinite_Ammo:
jmp newmem
db 90 90 90 - это тоже самое что и nop только в байтах, нужно вписывать определенное кол-во нопов нужно считать сколько занимает инструкция байт и потом вписывать
returnhere:

[DISABLE]
Infinite_Ammo://some_name:
movss xmm0,[ebx+00000C4C]
dealloc(newmem)
unregistersymbol(Infinite_Ammo)

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

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

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

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