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

[CE] Lua - Неизвестный косяк со скриптом


pachela

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

Есть скрипт и этот скрипт косячит. А если быть точным, то он в упор отказывается видеть процесс. Вот код скрипта

Скрытый текст

function CEButton1Click(sender)

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)


if(GemeID == nul) then
   showMessage("запустите процесс!")
   return
end

openProcess(GameName)


result = AOBScan(0xA0,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x86,0x01,0x00,0x00)
if(result == nul) then
   showMessage("сигнатура не рабочая!")
   return
end
cound = stringlist_getcount(result)
i = 0
while i~= cound do

address = stringlist_getcount(result,i)

writeBytes(address,0x60,0xE3,0x16,0x00)
end
showMessage("актевировано!")
end

 

Пока что не разбирал работоспособность скрипта дальше чем сообщение "Запустите процесс!". Что я делаю не так?

П.с. Как использовать фуркцию memrec_freeze? Мне нужно что бы запись байт происходила в цикле, т.е. заморожено =).

// Пользуемся тегами кода и спойлера (если код большой). Garik66. Пока устное предупреждение.

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

2 часа назад, pachela сказал:

то он в упор отказывается видеть процесс

Попробуй первую часть скрипта переписать так:

Скрытый текст

function CEButton1Click(sender)

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)


if(GemeID == nil) then
   showMessage("запустите процесс!")
   
   openProcess(GameName)
end

-- дальше код я не смотрел Garik66

result = AOBScan(0xA0,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x86,0x01,0x00,0x00)
if(result == nul) then
   showMessage("сигнатура не рабочая!")
   return
end
cound = stringlist_getcount(result)
i = 0
while i~= cound do

address = stringlist_getcount(result,i)

writeBytes(address,0x60,0xE3,0x16,0x00)
end
showMessage("актевировано!")
end

 

И второе - ты уверен в своей сигнатуре?

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

14 часа назад, Garik66 сказал:

Попробуй первую часть скрипта переписать так:

  Скрыть содержимое


function CEButton1Click(sender)

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)


if(GemeID == nil) then
   showMessage("запустите процесс!")
   
   openProcess(GameName)
end

-- дальше код я не смотрел Garik66

result = AOBScan(0xA0,0x86,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA0,0x86,0x01,0x00,0x00)
if(result == nul) then
   showMessage("сигнатура не рабочая!")
   return
end
cound = stringlist_getcount(result)
i = 0
while i~= cound do

address = stringlist_getcount(result,i)

writeBytes(address,0x60,0xE3,0x16,0x00)
end
showMessage("актевировано!")
end

 

И второе - ты уверен в своей сигнатуре?

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

2. Сигнатура на 100% нужная. Первые 4 байта дублируются в конце сигнатуры всегда. Был бы код не на Луа, а на "С", при использовании патерна, я бы с 13 байта и по 0хА0 поставил бы "?", т.к. эти байты при определенных условиях могут изменяться. Но для начала нужно разобраться с "топорной" сигнатурой и не допускать изменения наличной сигнатуры. Т.е. пока я не захочу, эта сигнатура будет иметь именно такой вид.

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

53 минуты назад, pachela сказал:

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

2. Сигнатура на 100% нужная. Первые 4 байта дублируются в конце сигнатуры всегда. Был бы код не на Луа, а на "С", при использовании патерна, я бы с 13 байта и по 0хА0 поставил бы "?", т.к. эти байты при определенных условиях могут изменяться. Но для начала нужно разобраться с "топорной" сигнатурой и не допускать изменения наличной сигнатуры. Т.е. пока я не захочу, эта сигнатура будет иметь именно такой вид.

Уважаемый pachela. Имею смелость заметить, что вы используете какой то заведомо "рабочий" код, изменив его под себя, не понимая сути. Мы лишь можем направить или указать на ошибки в общем случае.

Во-первых, советую ознакомиться с синтаксисом (в данном случае Lua) и обратить внимание на опечатки в коде.

Во-вторых, все инструкции CE используемые в Lua описываются подробно в файле main.lua, находящимся в корневой папке с Cheat Engine.

В-третьих, использовать "??" в сигнатуре до сих пор возможно. 

Изменено пользователем SnedS91
  • Плюс 2
Ссылка на комментарий
Поделиться на другие сайты

2 минуты назад, SnedS91 сказал:

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

Во-первых, советую ознакомиться с синтаксисом (в данном случае Lua) и обратить внимание на опечатки в коде.

Во-вторых, все инструкции CE используемые в Lua описываются подробно в файле main.lua, находящимся в корневой папке с Cheat Engine.

В-третьих, использовать "??" в сигнатуре до сих пор возможно. 

Уважаемый SnedS91 код приведенный мной ранее действительно взят как по идее рабочий из видеомануала по созданию сего именно кода. И потому то я понимаю, что в коде для чего нужно. Но вот беда в том, что работоспособность кода на видео не была показана!!!

По поводу main.lua я знаю. Но вопрос то стоял по другому? Одно дело справочный материал на английском, а другое, когда на русском.

По поводу возможности использовать в Луа сигнатуры с "??" нигде не встречал, посему и предположил что нельзя!

Ну и в конце концов: Почему на офф-форуме СЕ люди подсказывают, помогают и объясняют, а тут только предлагают платные услуги и тыкают носом?

Я не прошу написать мне сложную программу с кучей функций, GUI, БлекДжеком и проститутками, а всего навсего прошу подсказать где допущена ошибка, как ее исправить и как лучше внести коррекцию кода под себя. Человек который понимает в Луа, Си и хорошо знаком с СЕ, может решить эту задачку за 2 минуты! Я же возможно и могу решить эту задачку под посторонних подсказок, только на это уйдет уже не 2 минуты и скорее всего не 2 дня.

Я уже давно не школьник, имею жену и ребенка. У меня нет такой роскоши как безграничное время! Лучше же когда мне знающий человек подскажет, я погляжу где я был не прав, сделаю выводы, положу полученное знание на полочку и перейду на следующую ступень, со следующим заданием и новой трудностью, которую возможно я решу сам, а возможно буду снова спрашивать "гуру".

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

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

Кроме того в Lua есть возможность использовать aobscan более удобным способом, т.е. не набором байт, а строкой, к примеру:

AOBScan('A0 86 01 ?? 00') //можно и без пробелов 
Ссылка на комментарий
Поделиться на другие сайты

Скрытый текст

function CEButton1Click(sender)
	GameName = "notepad++.exe"
	
	if(openProcess(GameName) == nil) then
	   showMessage("запустите процесс!")
	   return
	end

	result = AOBScan('тут свои байты')
	if(result == nil) then
	   showMessage("сигнатура не рабочая!")
	   return
	end
	count = result.Count
	i = 0
	while i~= count do
		address = result.getString(i)
		writeBytes(address,{0x60,0xE3,0x16,0x00})
		i = i + 1
	end
	showMessage("активировано!")
end

 

Возможно в таком виде тебя устроит скрипт :)

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

6 часов назад, pachela сказал:

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

 

Это подключение к процессу, как Attach to proccess. Процесс уже должен быть запущен.

Если нужно создать процесс и сразу подлючитья к нему, то

 

Цитата

createProcess(path, parameters OPTIONAL, debug OPTIONAL, breakonentrypoint OPTIONAL) : Creates a process. If debug is true it will be created using the windows debugger and if breakonentry is true it will cause a breakpoint to occur on entrypoint

 

 

Пример

createProcess('D:\\test.exe')

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

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

В 07.02.2017в13:54, Vlad2 сказал:

if(GemeID == nul) then

if (GameID == nil) then

Спасибо. Действительно в исходнике который я выставил в начале темы было несколько недоделок. первая, это опечатки на которые как раз ты и указал. Сделал я эту ошибку т.к. когда просматривал видео, сразу пытался и писать код, а в видео автор сказал именно Нул! Это меня не удивило, т.к., по моему, в С+ есть Нул. Вторая недоделка это та, что автор видео в другом своем уроке сказал что в прошлом видео ошибся и забыл добавить openProcess(GameName).

В 07.02.2017в14:00, SnedS91 сказал:

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

Кроме того в Lua есть возможность использовать aobscan более удобным способом, т.е. не набором байт, а строкой, к примеру:


AOBScan('A0 86 01 ?? 00') //можно и без пробелов 

Это хорошо. И тут же сразу вопрос такой, имеет ли разница в скобочках? Двойные или одинарные ставятся? И еще, а можно ли в байтах обозначенных "??" ставить варианты, ну типа есть вариант что примерт такой вид или иной, но не совершенно иной? Возможно в виде переменной это обозначать? Ну это просто из любознательности, на последний вопрос можно ответить кратко: Да или Нет. И за это будет большое спасибо.

Представленный тобой скрипт работает отлично! Спасибо большое.

В 07.02.2017в18:14, MasterGH сказал:

 

Это подключение к процессу, как Attach to proccess. Процесс уже должен быть запущен.

Теперь разобрался. Просто написано "open" и это смущает. Хотя в справке и написано "подключиться", но все же перевод технической документации бывает двоякий.

Вот код который у меня вышел в результате, но я снова накосячил

Скрытый текст

function CEButton1Click(sender)
	GameName = "notepad++.exe"

	if(openProcess(GameName) == nil) then
	   showMessage("запустите процесс!")
	   return
	end

	result = AOBScan('A0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 86 01 00')
	if(result == nil) then
	   showMessage("сигнатура не рабочая!")
	   return
	end
	count = result.Count
	i = 0
	while i~= count do
		address = result.getString(i)
		writeBytes(address,0xC0, 0x5C, 0x15, 0x00)
		i = i + 1
	end
	while true do
		res2 = readInteger(address)
		if(res2 == 1400000) then
		Sleep(50)
		end
		if not(res2 == 1400000) then
		writeBytes(address,0xC0, 0x5C, 0x15, 0x00)
		end
	end
end

 

Код работает нормально, если не считать того печального факта, что СЕ со скриптом виснет наглухо. Я так понимаю что в конце нужно оставить только условие If not, а просто if убрать?

// Читаем правила (особенно пункт 1.3 ) Garik66

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

Такс. Ну вот бороздя просторы большого ютубо-гугла я нашел причину почему трейнер вешается при активации, а точнее решение. Это запускать сканирование в потоки. Как я понял, то у меня должен быть 1 поток. Сначала 1 поток сканирует сигнатуру и записывает адрес. Далее поток освобождается и мы можем снова его использовать, что бы запустить цикл перезаписи, если изменяется значение в адресе.

Я все правильно понял?

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

Скрытый текст

function CEButton1Click(sender)
if (getProcessIDFromProcessName('notepad.exe')==nil) then
messageDialog("Запустите игру...",-1,0)
return end
openProcess('notepad.exe')
potok = createNativeThread(potokF)
end

function potokF(senderThread)
results=AOBScan("3F 00 00 00 00 00 00 E0"  ,"*W*C*X")
if (results==nil) then
messageDialog("Сигнатура не найдена...",-1,0)
return end
count=stringlist_getCount(results)
for i = 0, (count-1), 1 do
address =stringlist_getString(results,i)
writeBytes(address,0x20, 0xF2, 0x0F, 0x59, 0xC9, 0x90, 0x90, 0x90)
end
messageDialog("Чит активирован!.",-1,0)
end

 

такой код устроит с потоком?

// Читаем правила (особенно пункт 1.3 ) Garik66

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

2 часа назад, pachela сказал:

Это хорошо. И тут же сразу вопрос такой, имеет ли разница в скобочках? Двойные или одинарные ставятся? И еще, а можно ли в байтах обозначенных "??" ставить варианты, ну типа есть вариант что примерт такой вид или иной, но не совершенно иной? Возможно в виде переменной это обозначать? Ну это просто из любознательности, на последний вопрос можно ответить кратко: Да или Нет. И за это будет большое спасибо.

Представленный тобой скрипт работает отлично! Спасибо большое.

"??" или "xx" обозначение неизвестного байта. Переменную можно в принципе использовать, получится что-то вроде подстановки в шаблон.

36 минуты назад, pachela сказал:

Такс. Ну вот бороздя просторы большого ютубо-гугла я нашел причину почему трейнер вешается при активации, а точнее решение. Это запускать сканирование в потоки. Как я понял, то у меня должен быть 1 поток. Сначала 1 поток сканирует сигнатуру и записывает адрес. Далее поток освобождается и мы можем снова его использовать, что бы запустить цикл перезаписи, если изменяется значение в адресе.

Я все правильно понял?

Можно не использовать явно потоки, а создать таймер, например:

tmr = createTimer(nil,true)
function check()
 print('test') --тут свое сравнение и запись байт
end
tmr.setOnTimer(check)
tmr.setInterval(200)

 

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

17 час назад, pachela сказал:

1. Можно на русском, что делает openProcess()? Он создает процесс или переключается на него?

Подключается к процессу, если тот уже запущен. 

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

Скрытый текст

GameName = "notepad++.exe"
GameID = getProcessIDFromProcessName(GameName)

if(GemeID == nil) then
   showMessage("Процесс не запущен!Нажмите ОК! - ЗАПУЩУ :)")
   shellExecute('D://Notepad++/notepad++.exe/')   -- здесь поменяй путь к икзешнику на свой.
   sleep '1000'

   openProcess(GameName)
   showMessage("Процесс подключен! Работайте.")
end

 

 

17 час назад, pachela сказал:

2. Сигнатура на 100% нужная.

Если твоя сигнатура рабочая, то должен работать простейший АА-скрипт:

Скрытый текст

[ENABLE]
aobscanmodule(INJECT,notepad++.exe,A0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 86 01 00 00)
registersymbol(INJECT)
INJECT:
  db 60 E3 16 00 00 00 00 00

[DISABLE]
INJECT:
  db A0 86 01 00 00 00 00 00

unregistersymbol(INJECT)

 

который будет делать, то что ты хотел:

Скрытый текст
В 06.02.2017в13:43, pachela сказал:

4. Детальное описание работы:
Программа должна по нажатию на кнопку находить уникальный массив байт (A0 86 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 A0 86 01 00 00) в приложении NotePad++ и внести изменения в начало найденого массива на (60 E3 16 00 00 00 00 00) Последние нули обязательны!!! Изменение должно быть заморожено, с частотой обновления заморозки 50-100мс.

 

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

3 hours ago, Vlad2 said:

Насколько я помню нужно везде ставить два слэша


shellExecute('D://Notepad++/notepad++.exe/')

 

Если я правильно понимаю про что вы, два слеша требуются только в случае обратного слеша - "\" дабы экранировать символ экранирования:

shellExecute('D:\\Notepad++\\notepad++.exe')

В случае прямого слеша он требуется только один:

shellExecute('D://Notepad++/notepad++.exe')

Плюс можно использовать двойные квадратные скобки:

shellExecute([[D:\Notepad++\notepad++.exe]])

 

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

На сегодня для меня самый подходящий код вышел вот такой вот:

Скрытый текст

function CEButton1Click(sender)
if (getProcessIDFromProcessName('notepad++.exe')==nil) then
messageDialog("Запустите игру...",-1,0)
return end
openProcess('notepad++.exe')
potok = createNativeThread(potokF)
end

function potokF(senderThread)
results=AOBScan("0000000050C30000000000000000000000000000000000000000000050C300000000000000000000002F4375"  ,"*W*C*X")
  if (results==nil) then
  messageDialog("Сигнатура не найдена...",-1,0)
  return end
count=stringlist_getCount(results)
for i = 0, (count-1), 1 do
address =stringlist_getString(results,i)
writeBytes(address,0xC0,0x5C,0x15,0x00,0x80,0xC3,0xC9,0x01)
end
   while true do
			writeBytes(address,0xC0,0x5C,0x15,0x00,0x80,0xC3,0xC9,0x01)
            sleep(250)
	end
end

 

Одна проблема у него. Когда я генерирую трейнер и закрываю СЕ, то он не может найти сигнатуру! Хотя во время проверки в СЕ все идеально работает.

Я предполагаю следующее: В СЕ включены инструменты ядра. В трейнере же я не включаю их. Может из-за этого быть косяк?

// Читаем правила (особенно пункт 1.3 ) Garik66

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

6 минут назад, SnedS91 сказал:

Не думаю что в этом проблема, попробуй убрать следующее


  ,"*W*C*X"

не. Не в этом дело. Оно как то сразу после нажатия на кнопку пишет что сигнатура не та. Даже не ищет, просто клац на кнопку, а он говорит фига! Попробовал вписать dbk_initialize(true). Но наверно эт не правильно. Хотя драйвер загрузило. Так же вместо OpenProcess использовал dbk_useKernelmodeOpenProcess(). Но походу тоже не правильно использовал. И я думаю что для полного набора инструментов нужно еще и dbk_useKernelmodeProcessMemoryAccess() использовать.

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

Раз говоришь, что обычный поиск дает результат, тогда скажи какая память сканируется? Т.е. каким образом выставлены флаги CgI6YQ_qBEY.jpg

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

2 минуты назад, SnedS91 сказал:

Раз говоришь, что обычный поиск дает результат, тогда скажи какая память сканируется? Т.е. каким образом выставлены флаги CgI6YQ_qBEY.jpg

Точно так как у тебя. Если зайти в настройки СЕ, "Дополнительно" и выключить нижние 3 галочки (первая у меня не включена, почему то включение этой галочки приводит к BSOD), то поиск вообще ничего не даст. Он не находит никаких значений вообще!!! Когда я пишу трейнер, то использую СЕ с включенными инструментами ядра и потому когда тестирую трейнер все пашет, а когда компилю, то инструменты ядра я не использую. Вот почему я думаю что из-за этого косяк.

Но опыта у меня в этом маловато, потому прислушиваюсь к вашим словам.

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

Попробуй убрать в настройках те галочки, перезапустить СЕ, потом убрать галку в главном окне с Writable (это для того чтобы не использовать CE Kernel). Найдется ли в таком случае сигнатура?

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

14 минуты назад, SnedS91 сказал:

Попробуй убрать в настройках те галочки, перезапустить СЕ, потом убрать галку в главном окне с Writable (это для того чтобы не использовать CE Kernel). Найдется ли в таком случае сигнатура?

Поиск сразу заканчивается и ничего не находит.

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

папробуй вставить этот скрипт

Скрытый текст

local FLAGS_OFFSET=0x450


dbk_initialize() 
dbk_useKernelmodeOpenProcess() 
dbk_useKernelmodeProcessMemoryAccess() 


openProcess(getOpenedProcessID())

local list=createStringlist() 
getThreadlist(list)

local i 
for i=0, list.count-1 do 
  local tid=tonumber('0x'..list[i]) 
 
  local PEThread=dbk_getPEThread(tid) 
  local PEThread_Flags=PEThread+FLAGS_OFFSET 

 
  local flags=readBytes(PEThread_Flags,1) 
  if bAnd(flags,4)==4 then

    flags=bAnd(flags,0xfb)
    writeBytes(PEThread_Flags, flags) 
  end 

end 

list.destroy() 

 

// Читаем правила (особенно пункт 1.3 ) Garik66

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

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

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

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