Ошибка выполнения lua скрипта cheat engine

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. Пока устное предупреждение.

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

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

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

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

pachela

  • Автор
    • Поделиться

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 поставил бы «?», т.к. эти байты при определенных условиях могут изменяться. Но для начала нужно разобраться с «топорной» сигнатурой и не допускать изменения наличной сигнатуры. Т.е. пока я не захочу, эта сигнатура будет иметь именно такой вид.

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

SnedS91

    • Поделиться

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

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

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

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

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

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

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


Изменено 7 февраля, 2017 пользователем SnedS91


  • Плюс


    2

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

pachela

  • Автор
    • Поделиться

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

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

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

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

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

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

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

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

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

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

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

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

Vlad2

    • Поделиться

Можно поробовать так openProcess(GameID)

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

Vlad2

    • Поделиться
if(GemeID == nul) then

if (GameID == nil) then

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

SnedS91

    • Поделиться

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

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

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

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

SnedS91

    • Поделиться

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

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

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


Изменено 7 февраля, 2017 пользователем SnedS91

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

MasterGH

    • Поделиться

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')

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

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

pachela

  • Автор
    • Поделиться

В 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

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

pachela

  • Автор
    • Поделиться

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

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

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

horror113

    • Поделиться

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

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

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

SnedS91

    • Поделиться

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

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

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

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

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

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

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

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

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

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

Garik66

    • Поделиться

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мс.

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

Vlad2

    • Поделиться

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

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

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

srg91

    • Поделиться

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]])


Изменено 8 февраля, 2017 пользователем srg91

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

pachela

  • Автор
    • Поделиться

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

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

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

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

SnedS91

    • Поделиться

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

  ,"*W*C*X"

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

pachela

  • Автор
    • Поделиться

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

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

  ,"*W*C*X"

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

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

SnedS91

    • Поделиться

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

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

pachela

  • Автор
    • Поделиться

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

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

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

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

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

SnedS91

    • Поделиться

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

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

pachela

  • Автор
    • Поделиться

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

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

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

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

horror113

    • Поделиться

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

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

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

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

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. Пока устное предупреждение.

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

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

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

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

pachela

  • Автор
    • Поделиться

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 поставил бы «?», т.к. эти байты при определенных условиях могут изменяться. Но для начала нужно разобраться с «топорной» сигнатурой и не допускать изменения наличной сигнатуры. Т.е. пока я не захочу, эта сигнатура будет иметь именно такой вид.

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

SnedS91

    • Поделиться

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

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

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

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

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

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

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


Изменено 7 февраля, 2017 пользователем SnedS91


  • Плюс


    2

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

pachela

  • Автор
    • Поделиться

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

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

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

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

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

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

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

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

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

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

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

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

Vlad2

    • Поделиться

Можно поробовать так openProcess(GameID)

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

Vlad2

    • Поделиться
if(GemeID == nul) then

if (GameID == nil) then

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

SnedS91

    • Поделиться

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

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

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

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

SnedS91

    • Поделиться

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

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

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


Изменено 7 февраля, 2017 пользователем SnedS91

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

MasterGH

    • Поделиться

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')

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

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

pachela

  • Автор
    • Поделиться

В 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

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

pachela

  • Автор
    • Поделиться

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

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

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

horror113

    • Поделиться

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

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

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

SnedS91

    • Поделиться

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

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

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

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

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

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

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

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

tmr = createTimer(nil,true)
function check()
 print('test') --тут свое сравнение и запись байт
end
tmr.setOnTimer(check)
tmr.setInterval(200)
Ссылка на комментарий
Поделиться на другие сайты

Garik66

    • Поделиться

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мс.

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

Vlad2

    • Поделиться

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

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

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

srg91

    • Поделиться

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]])


Изменено 8 февраля, 2017 пользователем srg91

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

pachela

  • Автор
    • Поделиться

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

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

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

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

SnedS91

    • Поделиться

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

  ,"*W*C*X"

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

pachela

  • Автор
    • Поделиться

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

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

  ,"*W*C*X"

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

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

SnedS91

    • Поделиться

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

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

pachela

  • Автор
    • Поделиться

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

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

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

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

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

SnedS91

    • Поделиться

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

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

pachela

  • Автор
    • Поделиться

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

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

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

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

horror113

    • Поделиться

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

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

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

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

I’m getting this error at this point in the code…
But I don’t think there’s something wrong…

function readAll(file)
  local f = io.open(file, "rb")
  local content = f:read("*all"); f:close()
  return content
end

I get this error attempt to index a nil value (local ‘f’) in this specific line:

local content = f:read("*all"); f:close()

Any help is appreciated
Thank you

I just tried to execute the script, but I got this error…
It was supposed to work without any errors…

I already tried to look around the internet, but nothing seems to be wrong with the code…

aynber's user avatar

aynber

21.9k8 gold badges51 silver badges61 bronze badges

asked Oct 25, 2022 at 17:32

Haruna Higurashi Taishou GKL's user avatar

4

first solution:

function readAll(file)
  local f = io.open(file, "ab+") -- create if it not exist
  local content = f:read("*all"); f:close()
  return content
end

second solution:

function readAll(file)
  local f = io.open(file, "rb+")
  if not f then return "" end -- check file
  local content = f:read("*all"); f:close()
  return content
end

answered Oct 25, 2022 at 18:34

Mike V.'s user avatar

Mike V.Mike V.

2,0027 silver badges19 bronze badges

Today I finished the episode 45 (hardes tasks: collect cards 100.000 from 100.000 / Upgade toys 140/140) but there is NO button to get to episode 46 like in the priveous episodes. :? Please refer to the attached picture.
Image

I see that there are more episodes [planed to be in future?] «JACUZZI», «WARD», «SCHOOL».
For me this is the end with this «GAME». I agree to HolyShit memberlist.php?mode=viewprofile&u=46578, the game is boring.
Before 1 month I played «HERO WARS» but it is also boring even if you have more options.
Spring is comming so I’ll spend more time outside. :)

CU!

P.S.: I use Firefox 87.0 (64-Bit) and with CE only the room-script (Numpad2,3,4) is working (Num 1 and 0 not).
How to work with CheatEngine72 (is installed with the installer) and the script4 (26KB) by using Windows (7-10) and firefox:

1. Close all tasks.
2. Open Firefox and login to [Link] (only one tab!!!!)
3. Open script cuntempire_script4.ct or cuntempire.ct (on the desctop or from filebrowser) from «Cake-san»
download/file.php?id=26812
4. «File» —> «Open Process» or Button «Select a process to open»
5. On the «Process List» select «00xxxxxx-Cunt Empire — Mozilla Firefox» and click the «Open» button
6. Confirmation «Keep the current adress list/code list?» —> Click the «Yes» button
7. In the lower part of CheatEngine (7.2) you have several options

Box
Active Description Adress Type Value
[ ] Room <script>
[ ] Card <script>

[ ] Quest allways colle… <script>

Click in the empty box infront of the word «Room» to «Activate» the room-script. Wait…. more than 10 secounds. Be patient and leave your mouse and keybord untouched. If the box is with a red cross all is fine and you can go on otherwise you have to start new again with step 1

8. The box has a red cross, so the room-script is activated… Go back to firefox and here to the «Game».
9. Check if the notepad is active and play with the (Numpad2,3,4) to raise your income.

Hints:
a. Use AutoClicker30 (freeware to automate the mouse-clicks) and FreeCountdownTimer (plan your time to collect time based items or wait for eventstart and -end) !!!!
b. Don’t uses CE at the beginning of an episode, only if generated income talkes longer than 5 minutes to level up a business and don´t max the level of the businesses to fast otherwise you may not can get to the next episode.
c. In the EVENT (tournament/challange) first finish your tasks without CE! If it takes more than 5 minutes to level up an business use CE. DON’T automate Your businesses at the beginning because the game addapt the income of the «other fake players/bots». Open all businesses, so that you have more chances to get better GIRLS & TOYS in the castings.
10-15minutes before the EVENT ends:
— automate all businesses and
— level them up with the money by using CE but
— only use beer/champaine/absint/…. on GIRLS & TOYS in the AUTOMATED!!! businesse(s) where the income per secound has the highest value.
— If you level up girls, than first level up only one (single) girl, than the other girl(s) and than the toys in order to maximize the income

Certainly, something like this should do it (you can copy and paste into CE)

<?xml version="1.0" encoding="utf-8"?>
<CheatTable>
  <CheatEntries>
    <CheatEntry>
      <ID>16</ID>
      <Description>"Scan"</Description>
      <Options moHideChildren="1"/>
      <LastState/>
      <VariableType>Auto Assembler Script</VariableType>
      <AssemblerScript>[ENABLE]
{$lua}
local function group_scan(group)
  local ms=createMemScan()
  ms.OnlyOneResult=true
  ms.FirstScan(soExactValue, vtGrouped, rtRounded, group, "",
  0, targetIs64Bit() and 0x00007fffffffffff or 0x00000000ffffffff, -- start stop addresses
  --0x07D00000, 0x07E00000, -- faster testing
  "", fsmNotAligned,"1", false, false, false, false)
  ms.waitTillDone()
  local res = ms.Result
  ms.destroy()
  return res
end

local function specific_scan(a,b,c,d)
  return group_scan(('4p:%d 4:* 4:* 4:%d 4:%d 4:* 4:* 4:* 4p:%d 4:* 4:%d'):format(a,b,b,c,d))
end

local function named_scan(values)
  -- interp from http://lua-users.org/wiki/StringInterpolation
  function interp(s, tab)
    return (s:gsub('($%b{})', function(w) return tab[w:sub(3, -2)] or w end))
  end
  return group_scan(interp('4p:${a} 4:* 4:* 4:${b} 4:${b} 4:* 4:* 4:* 4p:${c} 4:* 4:${d}',values))
end

if not syntaxcheck then
  --local result = specific_scan(5000,9000,3000,10000) -- commented to avoid two scans
  local result = named_scan({a=5000,b=9000,c=3000,d=10000}) -- alternative example
  if not result then error('not found') end
  -- unfortunately the scan seems to only return the first address even with a FoundList...
  local a_offset = 0x00
  local c_offset = 0x20
  memrec.Child[0].Address = result+a_offset
  memrec.Child[0].Active = true
  memrec.Child[0].Value = 500000
  memrec.Child[1].Address = result+c_offset
  memrec.Child[1].Active = true
  memrec.Child[1].Value = 500000
end
 
[DISABLE]
{$lua}
if not syntaxcheck then
  memrec.Child[0].Active = false
  memrec.Child[0].Value = 5000
  memrec.Child[1].Active = false
  memrec.Child[1].Value = 3000
end
</AssemblerScript>
      <CheatEntries>
        <CheatEntry>
          <ID>17</ID>
          <Description>"a"</Description>
          <LastState Value="5000" RealAddress="07DE0000"/>
          <VariableType>4 Bytes</VariableType>
          <Address>07DE0000</Address>
        </CheatEntry>
        <CheatEntry>
          <ID>18</ID>
          <Description>"b"</Description>
          <LastState Value="3000" RealAddress="07DE0020"/>
          <VariableType>4 Bytes</VariableType>
          <Address>07DE0020</Address>
        </CheatEntry>
      </CheatEntries>
    </CheatEntry>
  </CheatEntries>
</CheatTable>

This freezes both, but I wasn’t sure which you wanted to freeze so… just comment out/remove the .Active = lines for the one you don’t want to freeze

I’m trying to hack a game. I’m a bit of a white hat hacker — only for this specific game, and only because I enjoy it. There has recently been a spate of players getting away with much more than they should in game by (if the grapevine is to be believed) injecting lua scripts into the loaded game in cheat engine.

I use cheat engine sometimes, I know how to find a value, change it, lock it, find out what writes to it, etc. I wasn’t aware that a user can call an external lua file and have it run as if it had been called by the game in question (the copy of the file I’ve managed to beg/borrow/steal calls function from the game). I am way out of my depth here, I’m not even 100% sure this is seriously what’s been going on. Can anyone shed some light on whether or not this is possible (even a feeling of likelihood would help) and more importantly if it is possible, how I can go about replicating it.

I don’t want to mention the game specifically as (although it has a small user base) I don’t want to give others tips on how to hack it!). That being said, I realise I haven’t given much info, so please tell me what would be helpful to include!

P.S. I have no idea how to tag this — suggestions welcome!

Cheat engine does not work with nat (nats is long integer, which muck bigger longint interval) ( **://www.polarhome.com:793/~franco/bigint.zip )
I have uploaded project :
**://www.mediafire.com/?olygw13or4oiyd9
When you click on Button3 appears strange SIGSEG error . I think , problem is because of huge asm insertions in Bigint18 unit. How to solve problem?

So problem is in how assembler code compiled. So in cheat engine with nat unit added n_muls1 procedure is

CPU Disasm
Address   Hex dump          Command                                  Comments
005F44B0  /$  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]             ; ASCII "4294967296"
005F44B3  |.  8B7D 0C       MOV EDI,DWORD PTR SS:[EBP+0C]
005F44B6  |.  83FF 00       CMP EDI,0
005F44B9  |.  75 0F         JNE SHORT 005F44CA
005F44BB  |.  C706 01000000 MOV DWORD PTR DS:[ESI],1
005F44C1  |.  C746 04 00000 MOV DWORD PTR DS:[ESI+4],0
005F44C8  |.  EB 2B         JMP SHORT 005F44F5
005F44CA  |>  8B0E          MOV ECX,DWORD PTR DS:[ESI]
005F44CC  |.  31DB          XOR EBX,EBX
005F44CE  |.  8D748E 04     LEA ESI,[ECX*4+ESI+4]
005F44D2  |.  F7D9          NEG ECX
005F44D4  |>  8B048E        /MOV EAX,DWORD PTR DS:[ECX*4+ESI]
005F44D7  |.  F7E7          |MUL EDI
005F44D9  |.  01D8          |ADD EAX,EBX
005F44DB  |.  83D2 00       |ADC EDX,0
005F44DE  |.  89048E        |MOV DWORD PTR DS:[ECX*4+ESI],EAX
005F44E1  |.  89D3          |MOV EBX,EDX
005F44E3  |.  41            |INC ECX
005F44E4  |.^ 75 EE         JNZ SHORT 005F44D4
005F44E6  |.  83FB 00       CMP EBX,0
005F44E9  |.  74 0A         JE SHORT 005F44F5
005F44EB  |.  8B75 08       MOV ESI,DWORD PTR SS:[EBP+8]
005F44EE  |.  FF06          INC DWORD PTR DS:[ESI]
005F44F0  |.  8B0E          MOV ECX,DWORD PTR DS:[ESI]
005F44F2  |.  891C8E        MOV DWORD PTR DS:[ECX*4+ESI],EBX
005F44F5  >  C3            RETN

And in project just with nat unit:

CPU Disasm
Address   Hex dump          Command                                  Comments
0053D440  /$  55            PUSH EBP                                 ; project1.0053D440(guessed Arg1,Arg2)
0053D441  |.  89E5          MOV EBP,ESP
0053D443  |.  8B75 08       MOV ESI,DWORD PTR SS:[ARG.1]
0053D446  |.  8B7D 0C       MOV EDI,DWORD PTR SS:[ARG.2]
0053D449  |.  83FF 00       CMP EDI,0
0053D44C  |.  75 0F         JNE SHORT 0053D45D
0053D44E  |.  C706 01000000 MOV DWORD PTR DS:[ESI],1
0053D454  |.  C746 04 00000 MOV DWORD PTR DS:[ESI+4],0
0053D45B  |.  EB 2B         JMP SHORT 0053D488
0053D45D  |>  8B0E          MOV ECX,DWORD PTR DS:[ESI]
0053D45F  |.  31DB          XOR EBX,EBX
0053D461  |.  8D748E 04     LEA ESI,[ECX*4+ESI+4]
0053D465  |.  F7D9          NEG ECX
0053D467  |>  8B048E        /MOV EAX,DWORD PTR DS:[ECX*4+ESI]
0053D46A  |.  F7E7          |MUL EDI
0053D46C  |.  01D8          |ADD EAX,EBX
0053D46E  |.  83D2 00       |ADC EDX,0
0053D471  |.  89048E        |MOV DWORD PTR DS:[ECX*4+ESI],EAX
0053D474  |.  89D3          |MOV EBX,EDX
0053D476  |.  41            |INC ECX
0053D477  |.^ 75 EE         JNZ SHORT 0053D467
0053D479  |.  83FB 00       CMP EBX,0
0053D47C  |.  74 0A         JE SHORT 0053D488
0053D47E  |.  8B75 08       MOV ESI,DWORD PTR SS:[ARG.1]
0053D481  |.  FF06          INC DWORD PTR DS:[ESI]
0053D483  |.  8B0E          MOV ECX,DWORD PTR DS:[ESI]
0053D485  |.  891C8E        MOV DWORD PTR DS:[ECX*4+ESI],EBX
0053D488  |>  C9            LEAVE
0053D489  .  C2 0800       RETN 8

So in first code (copied from ollyDBG) there are no

PUSH EBP 
MOV EBP,ESP
LEAVE 

 instructions.

Writing a Script

You need to have the Memory Viewer window open and go to «Tools->Auto Assemble» or hit CTRL+A to open the Auto assemble window. When you click «Execute» the code is not actually executed, but assembled into machine code. The code is actually executed when you overwrite existing game code and the game executes it in the normal course of playing or when you call CREATETHREAD.

Writing an address or label followed by a colon will do one of two opposite things. If the label is known, i.e. it is an address or if there is a defined symbol or memory has been allocated with that name, the assembler will move to that address for assembling the following code. If the label is unknown, it must have been passed to LABEL(name) (or you will get an error) and the value of that label will be set to the current position where code is set to be assembled.

Simple Example — Example showing ALLOC, LABEL, REGISTERSYMBOL and CREATETHREAD.

Assigning a Script to a CheatTable

Scripts assigned to cheat tables usually have two sections, «[ENABLE]» and «[DISABLE]». Code before «[ENABLE]» will be assembled every time the script is enabled OR disabled. The code in the «[ENABLE]» section will be assembled (not executed) when the entry is checked and the code in the «[DISABLE]» section will be assembled when the entry is unchecked.

You will generally alloc memory in [ENABLE] and overwrite existing instructions inside the process you have opened to jump to your code where you can modify values and jump back. You will then dealloc the memory and put the original instructions back when disabling.

To assign it to your cheat table, click on «File->Assign to current cheat table» and close the window because to edit the table script you have to double-click on the «<script>» value in your table.

Serious Sam 3 BFE Example — Example showing ENABLE and DISABLE

Injecting a DLL

loadlibrary(name) can be used to load a dll and register it’s symbols for
use by your assembly code. Note that you should not put quotes around the DLL name. Here’s an example:

LoadLibrary Example

General Information

Auto assemble allows you to write assembler code at different locations using a script. It can be found in the memory view part of cheat engine under extra.

See Auto Assembler Commands for a full list of all Auto Assembler commands.

Auto Assembler Commands

Command Description
AOBSCAN(name, xx xx xx xx xx) Scans the memory for the given array of byte and sets the result to the symbol named «name»
AOBSCANMODULE(name, moduleName, xx xx xx xx xx) Scans the memory of a specific module for the given array of byte and sets the result to the symbol names «name»
AOBSCANREGION(name, Sadd$, Fadd$, xx xx xx) Will scan the specific range from start address to finish addressfor the given AOB and labels it with the given name
ALLOC(allocName, sizeInBytes, Optional: AllocateNearThisAddress) Allocates a certain amount of memory and defines the specified name in the script. If AllocateNearThisAddress is specified CE will try to allocate the memory near that address. This is useful for 64-bit targets where the jump distance could be bigger than 2GB otherwise
DEALLOC(allocName) Deallocates a block of memory allocated with Alloc. It always gets executed last, no matter where it is positioned in the code, and only actually frees the memory when all allocations have been freed. Only usable in a script designed as a cheat table. (e.g used for the disable cheat)
CREATETHREAD(address) Will spawn a thread in the process at the specified address
DEFINE(name,whatever) Creates a token with the specified name that will be replaced with the text of whatever
FULLACCESS(address,size,preferedsize) Makes a memory region at the specified address and at least «size» bytes readable, writable and executable
GLOBALALLOC(name,size) Allocates a certain amount of memory and registers the specified name. Using GlobalAlloc in other scripts will then not allocate the memory again, but reuse the already existing memory. (Or allocate it anyhow if found it wasn’t allocated yet)
INCLUDE(filename) Includes another auto assembler file at that spot
LABEL(labelName) Enables the word labelName to be used as an address
LOADBINARY(address,filename) Loads a binary file at the specified address
LOADLIBRARY(filename) Injects the specified DLL into the target process
READMEM(address,size) Writes the memory at the specified address with the specified size to the current location
REGISTERSYMBOL(symbolName) Adds a symbol to the user-defined symbol list so cheat tables and the memory browser can use that name instead of a address (The symbol has to be declared in the script when using it)
UNREGISTERSYMBOL(symbolName) Removes a symbol from the user-defined symbol list. No error will occur if the symbol doesn’t exist.

Value Notation

Normally everything is written as hexadecimal in auto assembler, but there are ways to override this so you can input decimal values, and even floating point values.
for example, a integer value of 100 can be written in hex as 64, but you can also write it as #100, or as (int)100
for floating point value like 100.1 you can use (float)100.1
and for a double, you could use (double)100.1
NOTE:Use ‘dq (double)100.1’ instead of ‘dd’!

{$lua}

Auto assembler scripts support section written in Lua.You can start such a section using the {$lua} keyword, and end it with {$asm}.

The return value of such a function (if it returns a value at all) will be interpreted as normal auto assembler commands.

When syntax checking, the lua sections get executed. To make sure your lua script behaves properly in those situations, check the «syntaxcheck» boolean. If it’s true, then do not make permanent changes.
e.g:

if syntaxcheck then return end

Of course, if your script is meant to generate code, do make it return code so that it passes the initial syntax check. (e.g label definitions etc…)

Examples

Basic Example

00451029:
jmp 00410000
nop
nop
nop

00410000:
mov [00580120],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031

Example using LABEL

label(mylabel)

00451029:
jmp 00410000
nop
nop
nop
mylabel:

00410000:
mov [00580120],esi
mov [esi+80],ebx
xor eax,eax
jmp mylabel

Example using ALLOC

alloc(alloc1,4)

00451029:
jmp 00410000
nop
nop
nop

00410000:
mov [alloc1],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031

Example using ALLOC and LABEL

alloc(alloc1,4)
label(mylabel)

00451029:
jmp 00410000
nop
nop
nop
mylabel:

00410000:
mov [alloc1],esi
mov [esi+80],ebx
xor eax,eax
jmp mylabel

Example using FULLACCESS

FULLACCESS(00400800,4) //00400800 is usually read only non executable data, this makes it writeable and executable
00451029:
jmp 00410000
nop
nop
nop

00410000:
mov [00400800],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031

Example using DEFINE

DEFINE(clear_eax,xor eax,eax)
00400500:
clear_eax

Example using READMEM

alloc(x,16)
alloc(script,2048)

script:
mov eax,[x]
mov edx,[x+c]
ret

x:
readmem(00410000,16) //place the contents of address 00410000 at the address of X

See also

  • Assembler
  • Tutorials

Writing a Script

You need to have the Memory Viewer window open and go to «Tools->Auto Assemble» or hit CTRL+A to open the Auto assemble window. When you click «Execute» the code is not actually executed, but assembled into machine code. The code is actually executed when you overwrite existing game code and the game executes it in the normal course of playing or when you call CREATETHREAD.

Writing an address or label followed by a colon will do one of two opposite things. If the label is known, i.e. it is an address or if there is a defined symbol or memory has been allocated with that name, the assembler will move to that address for assembling the following code. If the label is unknown, it must have been passed to LABEL(name) (or you will get an error) and the value of that label will be set to the current position where code is set to be assembled.

Simple Example — Example showing ALLOC, LABEL, REGISTERSYMBOL and CREATETHREAD.

Assigning a Script to a CheatTable

Scripts assigned to cheat tables usually have two sections, «[ENABLE]» and «[DISABLE]». Code before «[ENABLE]» will be assembled every time the script is enabled OR disabled. The code in the «[ENABLE]» section will be assembled (not executed) when the entry is checked and the code in the «[DISABLE]» section will be assembled when the entry is unchecked.

You will generally alloc memory in [ENABLE] and overwrite existing instructions inside the process you have opened to jump to your code where you can modify values and jump back. You will then dealloc the memory and put the original instructions back when disabling.

To assign it to your cheat table, click on «File->Assign to current cheat table» and close the window because to edit the table script you have to double-click on the «<script>» value in your table.

Serious Sam 3 BFE Example — Example showing ENABLE and DISABLE

Injecting a DLL

loadlibrary(name) can be used to load a dll and register it’s symbols for
use by your assembly code. Note that you should not put quotes around the DLL name. Here’s an example:

LoadLibrary Example

General Information

Auto assemble allows you to write assembler code at different locations using a script. It can be found in the memory view part of cheat engine under extra.

See Auto Assembler Commands for a full list of all Auto Assembler commands.

Auto Assembler Commands

Command Description
AOBSCAN(name, xx xx xx xx xx) Scans the memory for the given array of byte and sets the result to the symbol named «name»
AOBSCANMODULE(name, moduleName, xx xx xx xx xx) Scans the memory of a specific module for the given array of byte and sets the result to the symbol names «name»
AOBSCANREGION(name, Sadd$, Fadd$, xx xx xx) Will scan the specific range from start address to finish addressfor the given AOB and labels it with the given name
ALLOC(allocName, sizeInBytes, Optional: AllocateNearThisAddress) Allocates a certain amount of memory and defines the specified name in the script. If AllocateNearThisAddress is specified CE will try to allocate the memory near that address. This is useful for 64-bit targets where the jump distance could be bigger than 2GB otherwise
DEALLOC(allocName) Deallocates a block of memory allocated with Alloc. It always gets executed last, no matter where it is positioned in the code, and only actually frees the memory when all allocations have been freed. Only usable in a script designed as a cheat table. (e.g used for the disable cheat)
CREATETHREAD(address) Will spawn a thread in the process at the specified address
DEFINE(name,whatever) Creates a token with the specified name that will be replaced with the text of whatever
FULLACCESS(address,size,preferedsize) Makes a memory region at the specified address and at least «size» bytes readable, writable and executable
GLOBALALLOC(name,size) Allocates a certain amount of memory and registers the specified name. Using GlobalAlloc in other scripts will then not allocate the memory again, but reuse the already existing memory. (Or allocate it anyhow if found it wasn’t allocated yet)
INCLUDE(filename) Includes another auto assembler file at that spot
LABEL(labelName) Enables the word labelName to be used as an address
LOADBINARY(address,filename) Loads a binary file at the specified address
LOADLIBRARY(filename) Injects the specified DLL into the target process
READMEM(address,size) Writes the memory at the specified address with the specified size to the current location
REGISTERSYMBOL(symbolName) Adds a symbol to the user-defined symbol list so cheat tables and the memory browser can use that name instead of a address (The symbol has to be declared in the script when using it)
UNREGISTERSYMBOL(symbolName) Removes a symbol from the user-defined symbol list. No error will occur if the symbol doesn’t exist.

Value Notation

Normally everything is written as hexadecimal in auto assembler, but there are ways to override this so you can input decimal values, and even floating point values.
for example, a integer value of 100 can be written in hex as 64, but you can also write it as #100, or as (int)100
for floating point value like 100.1 you can use (float)100.1
and for a double, you could use (double)100.1
NOTE:Use ‘dq (double)100.1’ instead of ‘dd’!

{$lua}

Auto assembler scripts support section written in Lua.You can start such a section using the {$lua} keyword, and end it with {$asm}.

The return value of such a function (if it returns a value at all) will be interpreted as normal auto assembler commands.

When syntax checking, the lua sections get executed. To make sure your lua script behaves properly in those situations, check the «syntaxcheck» boolean. If it’s true, then do not make permanent changes.
e.g:

if syntaxcheck then return end

Of course, if your script is meant to generate code, do make it return code so that it passes the initial syntax check. (e.g label definitions etc…)

Examples

Basic Example

00451029:
jmp 00410000
nop
nop
nop

00410000:
mov [00580120],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031

Example using LABEL

label(mylabel)

00451029:
jmp 00410000
nop
nop
nop
mylabel:

00410000:
mov [00580120],esi
mov [esi+80],ebx
xor eax,eax
jmp mylabel

Example using ALLOC

alloc(alloc1,4)

00451029:
jmp 00410000
nop
nop
nop

00410000:
mov [alloc1],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031

Example using ALLOC and LABEL

alloc(alloc1,4)
label(mylabel)

00451029:
jmp 00410000
nop
nop
nop
mylabel:

00410000:
mov [alloc1],esi
mov [esi+80],ebx
xor eax,eax
jmp mylabel

Example using FULLACCESS

FULLACCESS(00400800,4) //00400800 is usually read only non executable data, this makes it writeable and executable
00451029:
jmp 00410000
nop
nop
nop

00410000:
mov [00400800],esi
mov [esi+80],ebx
xor eax,eax
jmp 00451031

Example using DEFINE

DEFINE(clear_eax,xor eax,eax)
00400500:
clear_eax

Example using READMEM

alloc(x,16)
alloc(script,2048)

script:
mov eax,[x]
mov edx,[x+c]
ret

x:
readmem(00410000,16) //place the contents of address 00410000 at the address of X

See also

  • Assembler
  • Tutorials

«You need allow cheat engine to execute lua script at startup.»

I always tick «always allow»

«There is no cheat tabledata only cheat tablecache.»

I can confirm. Unless there is a tip to make it appears, there is no «cheat table» folder in Document/Fifa 19.

Create ‘data’ folder by yourself then. After you run cheat table file should be created. And then edit it.

Nothing appears in this handmade folder after run cheat table.

Maybe you also deleted ‘logs’ folder? It should be in the same directory where FIFA19.CT is.

There is no «logs» folder

capture2

I’m getting this error at this point in the code…
But I don’t think there’s something wrong…

function readAll(file)
  local f = io.open(file, "rb")
  local content = f:read("*all"); f:close()
  return content
end

I get this error attempt to index a nil value (local ‘f’) in this specific line:

local content = f:read("*all"); f:close()

Any help is appreciated
Thank you

I just tried to execute the script, but I got this error…
It was supposed to work without any errors…

I already tried to look around the internet, but nothing seems to be wrong with the code…

aynber's user avatar

aynber

22.3k8 gold badges50 silver badges63 bronze badges

asked Oct 25, 2022 at 17:32

Haruna Higurashi Taishou GKL's user avatar

4

first solution:

function readAll(file)
  local f = io.open(file, "ab+") -- create if it not exist
  local content = f:read("*all"); f:close()
  return content
end

second solution:

function readAll(file)
  local f = io.open(file, "rb+")
  if not f then return "" end -- check file
  local content = f:read("*all"); f:close()
  return content
end

answered Oct 25, 2022 at 18:34

Mike V.'s user avatar

Mike V.Mike V.

2,0578 silver badges19 bronze badges

Recommend Projects

  • React photo

    React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo

    Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo

    Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo

    TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo

    Django

    The Web framework for perfectionists with deadlines.

  • Laravel photo

    Laravel

    A PHP framework for web artisans

  • D3 photo

    D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Visualization

    Some thing interesting about visualization, use data art

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo

    Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo

    Microsoft

    Open source projects and samples from Microsoft.

  • Google photo

    Google

    Google ❤️ Open Source for everyone.

  • Alibaba photo

    Alibaba

    Alibaba Open Source for everyone

  • D3 photo

    D3

    Data-Driven Documents codes.

  • Tencent photo

    Tencent

    China tencent open source team.

  • Ошибка выполнения javascript невозможно сформировать ссылку для загрузки файла
  • Ошибка выполнения javascript невозможно загрузить оригинал страницы
  • Ошибка выполнения javascript здесь должно быть содержание
  • Ошибка выполнения get запроса управление командированием
  • Ошибка выполнения get запроса госуслуги