Вопросы по CLEO-скриптингу

woksonal

Известный
Проверенный
268
154
Не обязательно. Достаточно просто любой опкод поставить в начале.
тогда мы ведь прыгнем не в самое начало скрипта

крч если скомпилировать код

CLEO:
{$CLEO .cs}
0000:
:Start
wait 0 // тут я добавил wait 0, тк у нас бесконечный цикл
//code
31@ = @start
jump @Jmp

:Jmp           
0A9F: 32@ = current_thread_pointer
32@ += 16 // BaseIP
0A8D: 33@ = read_memory 32@ size 4 virtual_protect 1 //получаем начало скрипта
if 31@ < 0 //т.к. метки это отрицательные числа, а нам нужно положительное, то умножаем на -1
    then 31@ *= -1
end
005A: 33@ += 31@  // Устанавливаем смещение от начала скрипта
32@ += 4 // IP
0A8C: write_memory 32@ size 4 value 33@ virtual_protect 1
и потом hex редактором подтереть первые 4 байта, игра начинает крашиться при старте, вывод - нельзя прыгать в самое начало скрипта
 
Последнее редактирование:

san0

Известный
Друг
411
268
ScxrUuV.png
 

SR_team

like pancake
BH Team
4,807
6,491
не компилируется без 0000
Потому что метка явно указана, это для более понятного примера. Да я что-то забылся, думал люди поумнели, хуй же там.
CLEO:
{$CLEO .cs}

//code
31@ = 0
jump @Jmp

:Jmp              
0A9F: 32@ = current_thread_pointer
32@ += 16 // BaseIP
0A8D: 33@ = read_memory 32@ size 4 virtual_protect 1 //получаем начало скрипта
if 31@ < 0 //т.к. метки это отрицательные числа, а нам нужно положительное, то умножаем на -1
    then 31@ *= -1
end
005A: 33@ += 31@  // Устанавливаем смещение от начала скрипта
32@ += 4 // IP
0A8C: write_memory 32@ size 4 value 33@ virtual_protect 1 //Пишем игре откуда надо выполнять скрипт
//Тут ничего не надо, т.к. скрипт тут уже не будет выполняться
вот тебе с переходом и без ошибок
 

unInstance

Новичок
Проверенный
311
224
это значит переход в самое начало скрипта (jump 0), но игра так не умеет и из-за этого могут возникнуть ошибки (хз какие, не тестил). Если очень надо прыгнуть в самое начало файла, то вот тебе сниплет
CLEO:
{$CLEO .cs}
:Start

//code
31@ = @start
jump @Jmp

:Jmp              
0A9F: 32@ = current_thread_pointer
32@ += 16 // BaseIP
0A8D: 33@ = read_memory 32@ size 4 virtual_protect 1 //получаем начало скрипта
if 31@ < 0 //т.к. метки это отрицательные числа, а нам нужно положительное, то умножаем на -1
    then 31@ *= -1
end
005A: 33@ += 31@  // Устанавливаем смещение от начала скрипта
32@ += 4 // IP
0A8C: write_memory 32@ size 4 value 33@ virtual_protect 1 //Пишем игре откуда надо выполнять скрипт
//Тут ничего не надо, т.к. скрипт тут уже не будет выполняться
call (0AB1) тут использовать нельзя, т.к. без ret (0AB2) будет переполнение буфера, а ret добавить нельзя, потому что он не выполнится из-за того что скрипт после записи в память (0A8C) станет выполняться в другом месте
Хм... А wait 0 может заменить 0000: NOP?
 

Gabriel__

Известный
Проверенный
411
184
Как создать глобальную переменную именно в самом скрипте ? Чтобы call scm и потоки могли исрользовать их.
 

Perojek)0

Известный
205
3
Если я через 0AD4 или sscanf начинаю сканировать строчку, а она например может быть "1 1 1" или "1 1", то есть
я не знаю сколько там пробелов и цифр, то если я указываю "%d %d", тогда получается, что последнее цифра не сканируется или стоит "%s", тогда в переменную записывается первая буква/слово. Как эт можно исправить?)
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,696
1,469
Если я через 0AD4 или sscanf начинаю сканировать строчку, а она например может быть "1 1 1" или "1 1", то есть
я не знаю сколько там пробелов и цифр, то если я указываю "%d %d", тогда получается, что последнее цифра не сканируется или стоит "%s", тогда в переменную записывается первая буква/слово. Как эт можно исправить?)
Разделяй с помощью strtok
 
  • Нравится
Реакции: Perojek)0

RedBoxWhite

Известный
337
27
Как удалить часть строки в скрипте? В конце строки почему-то ставится лишний пробел(
 

BlackKnigga

Известный
BH Team
922
447
Как удалить часть строки в скрипте? В конце строки почему-то ставится лишний пробел(
Удаляет указанное количество символов со строки из конца.
CLEO:
:delete_last_chars_from_string
// call @delete_last_chars_from_string call  2 0@ 5
var
0@: int
1@: int
2@: int
end
0C17: 2@ = strlen 0@
2@ -= 1@
0@ += 2@
0C11: memset 0@ 0 1@
ret 0
 

RedBoxWhite

Известный
337
27

А что если надо удалить не прямо в конце строки, а рядом (пример: 222 123 228 АЛО) и вот перед "Ало" стоит лишний пробел. Как его там удалить?