Ac1d Опубликовано 25 апреля, 2012 Поделиться Опубликовано 25 апреля, 2012 Делаем 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 DC7D4001XXX+3774 - 64 A1 00000000XXX+377A - 50XXX+377B - 64 89 25 00000000XXX+3782 - 83 EC 58XXX+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: 112345678 - ничего не напоминает? Неет?!Идём в 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],#100mov eax,[esi+00000140]jmp returnhereaob_ammo:ammo:jmp newmemnopreturnhere:[DISABLE]//code from here till the end of the code will be used to disable the cheatdealloc(newmem)unregistersymbol(ammo)ammo:mov eax,[esi+00000140]//Alt: db 8B 86 40 01 00 00Вместо ammo пишем что угодно.Ну вот вы сделали скрипт заряженый проверочными байтами Автор статьи - Ac1dАвтор lua скрипта для проверки - AkamaАвтор скрипта-болванки - Ac1d 4 Ссылка на комментарий Поделиться на другие сайты Поделиться
ZOCKIR Опубликовано 25 апреля, 2012 Поделиться Опубликовано 25 апреля, 2012 Вопрос:Почему снизу берем 5 адресов а не больше или меньше? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 25 апреля, 2012 Поделиться Опубликовано 25 апреля, 2012 В следующем патче какая-то из, к примеру, локальных переменных может "переехать" чуть ниже в стеке, и, следовательно, код немного видоизменится. В этом случае такая проверка ничего не даст - код не будет найден, ибо часть байтов будет заменена. Отсюда вывод - цепочку проверочных байт нужно строить только по байткодам инструкций, без привязки к байтам операндов. Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 26 апреля, 2012 Поделиться Опубликовано 26 апреля, 2012 Адреса лучше выводить в 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); endendCheckAOBScan("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") Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 мне это не понятно Идём в 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);endFound: 1 01003E21 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 14:30, boss сказал: мне это не понятно Идём в 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);endFound: 101003E21 Кнопочка Memory View открывает окно отладчика, верхняя часть которого состоит из дизассемблированных команд, а нижняя - из дампа памяти. Вот как раз в верхнем окне команды и записываются следующим образом:Адрес - Опкоды - МнемоникаНапример:0x123456 90 nopКак раз опкоды (представления команд в виде цифр, а не букв) и нужны для работы aobscan;Вот как это выглядит на примере OllyDbg:Выделенная строчка:00A45025 |. 8945 FC MOV DWORD PTR SS:[LOCAL.1],EAXАдрес: 0х00A45025Опкоды: 89 45 FCМнемоника: MOV DWORD PTR SS:[LOCAL.1],EAX Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 блин не понял как это все сделать вот я нашел патроны перешел в дизассемблир там вот что дальше делать то ? Показать контент Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Так тебе ведь уже в соседней теме подсказали, что это явно не та инструкция. Выход - искать другую, которая должна работать с адресом\регистром, а не вызывать какую-то другую функцию. Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 так вот не пойму что делать то что бы все норм работало ) сказали что надо aobscan вот и я пишу туткенг расскажи еще ты что надо делать пожалуйста Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 15:27, boss сказал: так вот не пойму что делать то что бы все норм работало ) сказали что надо aobscan вот и я пишу туткенг расскажи еще ты что надо делать пожалуйстаАобскан аобсканом, но ему для поиска адреса нужна правильная инструкция. Попробуй другой тип значения поискать, или ещё поотлаживай уже найденный адрес. Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 15:31, keng сказал: поотлаживай уже найденный адрес.сори за вопрос ну это как ? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 15:33, boss сказал: сори за вопрос ну это как ?Это когда ты нашёл адрес памяти, жмёшь на нём ПКМ и говоришь "Find what writes to this address", выскакивает окошко отладчика - идёшь обратно в игру и значение адреса меняешь - а отладчик показывает инструкции, которые это самое значение поменяли. Вот у тебя там выскочила инструкция call блаблабла - это явно не то, потому что это вызов функции, а инструкции должны быть аля:inc eaxdec eaxmov eax,ebxmov [0x12345],eaxfstp [eax+0x25]Такого вида, но никак не какие-нибудь call или ret. Попробуй подольше поизменять адрес - если, к примеру, ищешь патроны - смени оружие, поперезаряжайся и так далее. Если вылезает только эта инструкция - попробуй найти значение чего-нибудь ещё, например гранат или здоровья. Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 ага понял щас проверю )кенг вот что нашел что дальше то делать ? Показать контент Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 1. Проверяешь, что это верный адрес (пишешь скрипт).2. Берёшь опкоды (89 86 64 07 и так далее) из отладчика, модифицируешь скрипт с использованием aobscan(). Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 17:01, keng сказал: 1. Проверяешь, что это верный адрес (пишешь скрипт).2. Берёшь опкоды (89 86 64 07 и так далее) из отладчика, модифицируешь скрипт с использованием aobscan().1 как его проверить ?2 как его модифицировать скрипт ? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Што значит "как проверить"? Пишешь скрипт для этого адреса, если работает - значит адрес верный и команду ты нашёл нужную, если нет - значит нет. Ты же до этого скрипты писал (без aobscan) - вот то же самое. Самый обычный скрипт.Хотя, если ты задаёшь подобные вопросы - можешь ответить, зачем тебе использование aobscan в скрипте понадобилось? Ссылка на комментарий Поделиться на другие сайты Поделиться
Kvazimado Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 Мне кажется, Босс, ты зациклился. Я эти вопросы уже видел в других ветках форума, и на них уже давались ответы. Если ты забываешь все что тебе говорили, может тебе в тетрадку записывать? Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 17:15, Kvazimado сказал: Мне кажется, Босс, ты зациклился. Я эти вопросы уже видел в других ветках форума, и на них уже давались ответы. Если ты забываешь все что тебе говорили, может тебе в тетрадку записывать?Я, кстати, именно по этой причине веду блог (и заодно в тетрадку записываю) - у меня от этого информация гораздо лучше в голове укладывается. Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 17:14, keng сказал: Што значит "как проверить"? Пишешь скрипт для этого адреса, если работает - значит адрес верный и команду ты нашёл нужную, если нет - значит нет. Ты же до этого скрипты писал (без aobscan) - вот то же самое. Самый обычный скрипт.Хотя, если ты задаёшь подобные вопросы - можешь ответить, зачем тебе использование aobscan в скрипте понадобилось?а не знаю ) просто увидел что делают и сам подумал сделать ну если можно просто скриптом создать тренер тогда сделаю просто скрипт В 30.06.2012 в 17:15, Kvazimado сказал: Мне кажется, Босс, ты зациклился. Я эти вопросы уже видел в других ветках форума, и на них уже давались ответы. Если ты забываешь все что тебе говорили, может тебе в тетрадку записывать? та у меня когда то была тетрадка все записывал там ) я думаю надо видео уроков по больше вот как кенг сделал уроки и все понятно хотя надо и без видео уроков учится ну это тяжело я просто всего много хочу сделать и не знаю с чего начать а людей мало кто помогут Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 17:23, boss сказал: а не знаю ) просто увидел что делают и сам подумал сделать ну если можно просто скриптом создать тренер тогда сделаю просто скриптта у меня когда то была тетрадка все записывал там ) я думаю надо видео уроков по больше вот как кенг сделал уроки и все понятно хотя надо и без видео уроков учится ну это тяжелоНу вообще, если "просто увидел что делают", но сам смысла этой фичи не понимаешь - лучше не делай, зря только голову забьёшь. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
boss Опубликовано 30 июня, 2012 Поделиться Опубликовано 30 июня, 2012 В 30.06.2012 в 17:25, keng сказал: Ну вообще, если "просто увидел что делают", но сам смысла этой фичи не понимаешь - лучше не делай, зря только голову забьёшь.спасибо щас попробую сделать скрипт и проверить )все сделал всем спасибо все пашет ) Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 1 марта, 2014 Поделиться Опубликовано 1 марта, 2014 А мне вот интересно, в каких случаях заменяют некоторые числа на вопросительный знак?Допустим: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 строк снизу? А не сверху, допустим? Это зависит от адреса инструкции? Т.е. с того момента, где нам показал отладчик нужную строку с инструкцией, и до того момента, где заканчивается оперирование значением?Вопросов уйма, догадок - еще больше... не знаю куда податься прям. Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 2 марта, 2014 Поделиться Опубликовано 2 марта, 2014 В 01.03.2014 в 15:33, NullAlex сказал: А мне вот интересно, в каких случаях заменяют некоторые числа на вопросительный знак?Допустим: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 строк, можно и больше чем длиннее сигнатура тем уникальний скрипт. Ссылка на комментарий Поделиться на другие сайты Поделиться
Гость Опубликовано 2 марта, 2014 Поделиться Опубликовано 2 марта, 2014 По вопр. знакам понятно. А вот по поводу строк - еще вопрос: если, допустим, я возьму несколько строк из другой сигнатуры, это как-то повлияет на работу скрипта?Также еще вопрос по поводу составления АА скрипта.Несколько раз видел такой шаблон скрипта с аобсканом:[ENABLE]aobscan(some_name, bytes)registersymbol(some_name)some_name:db ##[DISABLE]some_name:db ##unregistersymbol(some_name)Вместо ## что именно вписывается? Значение? Проверочные байты? Если значение, то почему в секции disable это тоже необходимо? Ведь по-умолчанию (зачастую) значение может быть любым, и это не так важно (по-моему), как в случае с инструкциями. И как скрипт понимает, на каком именно месте (строке) нужно делать инъекцию? Путем вписывания вместо ## - проверочных байт? Тогда как указать значение? Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 2 марта, 2014 Поделиться Опубликовано 2 марта, 2014 В 02.03.2014 в 13:22, NullAlex сказал: По вопр. знакам понятно. А вот по поводу строк - еще вопрос: если, допустим, я возьму несколько строк из другой сигнатуры, это как-то повлияет на работу скрипта?Также еще вопрос по поводу составления АА скрипта.Несколько раз видел такой шаблон скрипта с аобсканом:[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],437A0000movss xmm0,[ebx+00000C4C]jmp returnhereInfinite_Ammo_aob:Infinite_Ammo:jmp newmemdb 90 90 90 - это тоже самое что и nop только в байтах, нужно вписывать определенное кол-во нопов нужно считать сколько занимает инструкция байт и потом вписыватьreturnhere:[DISABLE]Infinite_Ammo://some_name:movss xmm0,[ebx+00000C4C]dealloc(newmem)unregistersymbol(Infinite_Ammo) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения