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

как правильно соединять два скрипта или несколько в один скрипт ?


Alex2411

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

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

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

20 часов назад, Alex2411 сказал:

думаю наверно я путаю метки  или прыжки

Да хотя бы так... 

Спойлер

[ENABLE]

aobscanmodule(baseplayer_1,opera.exe,00 8B C3 48 8B 5C 24 40)
aobscanmodule(baseplayer_2,opera.exe,41 8D 50 02 33 C9)

alloc(newmem,$1000)

label(exit_1) 
label(function_1)
label(baseplayer_1back)
label(exit_2) 
label(function_2)
label(baseplayer_2back) 

newmem:

function_1:

  exit_1:
  mov rbx,[rsp+40]
  jmp baseplayer_1back

function_2:

  exit_2:
  lea edx,[r8+02]
  xor ecx,ecx
  jmp baseplayer_2back

baseplayer_1:
  jmp function_1
baseplayer_1back:

baseplayer_2:
  jmp function_2
  db 90
baseplayer_2back:

registersymbol(baseplayer_1)
registersymbol(baseplayer_2)

[DISABLE]

baseplayer_1:
  db 48 8B 5C 24 40
baseplayer_2:
  db 41 8D 50 02 33 C9

unregistersymbol(baseplayer_1)
unregistersymbol(baseplayer_2)

dealloc(newmem)

 

 

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

12 часов назад, Xipho сказал:

Вроде у @Garik66 есть урок на эту тему. Если нет - скажи, я сниму.

 

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

 

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

 

 

9 часов назад, LIRW сказал:

Да хотя бы так... 

 

спасибо . не большие скрипты я тоже  примерно так  делаю , но не все понятно .  объясни пожалуйта
почему  ты прыгаешь baseplayer_1 на function_1 , а не newmem ?
 почему нет label на function_1 ?
baseplayer_1back надо  обязательно ставить  после  прыжка baseplayer_1 , а не в самом низу ?
можно  сделать один  return в низу для всех или  делать так  нельзя  нужно  отдельный return  каждому скрипту ?
почему registersymbol  у тебя  стоят в конце , а не после label ?
 в  каком месте  правильно поставить  метки от  разных  скриптов  типа
aaa:
 dd 0
bbb:
 dd 0
?
важно в  каком порядке  записать  разные скрипты ? у тебя  с начала baseplayer_1 потом baseplayer_2 , а если  все наоброт будет работать ?

 

заодно  хотел спросить . инструкция  типа [eax+14]  и [eax+00000014] они всегда  одинаковые ? видел в играх так  и так , а чем  отличается не понятно .

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

15 минут назад, Alex2411 сказал:

почему  ты прыгаешь baseplayer_1 на function_1 , а не newmem ?

Потому что кусок выделенной памяти один, а не два...  Прыгаю на начало каждой функции. 

 

24 минуты назад, Alex2411 сказал:

важно в  каком порядке  записать  разные скрипты ?

Нет.. Это просто различие такое _1 _2 все функции одинаковые, писать быстрее меняя всего лишь цифру.  Можешь хоть с 0 начинать :) выше писать baseplayer_5 а ниже baseplayer_1 этого всего лишь отличия.

15 минут назад, Alex2411 сказал:

почему нет label на function_1 ?

Потому что забыл в спешке  :rolleyes: 

 

16 минут назад, Alex2411 сказал:

в  каком месте  правильно поставить  метки от  разных  скриптов  типа

смотря что туда загружаешь по размеру... Хотя мне кажется СЕ само размер выставит и в dd засунет даже qw 

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

37 минут назад, LIRW сказал:

Потому что кусок выделенной памяти один, а не два...  Прыгаю на начало каждой функции.

 

а когда скрипт  один  почему тогда  можно  прыгать  jmp newmem , а не делать отдельную метку function после newmem  что бы прыгать на function? мне не  очень понятно .

 

38 минут назад, LIRW сказал:

смотря что туда загружаешь по размеру..

 

не , я про другое . попробую объяснить. допустим  есть скрипт поиск  фильтра игрока. нашел число игрока  записал в метку  filter . есть другой скрипт умножение  скорости игрока . умножает на метку  speed , а свой чужой фильтрует через метку filter  из первого  срипта. я хочу  эти скрипты соединить . мне нужно  записать где то в новом скрипте
filter:
 dd 0 //с начала ноль в фильтр
speed:
 dd 1 //с начала умножать скорость на 1
в каком  месте скрипта  эти метки из  разных скриптов нужно  записать что бы скрипт правильно  работал?  когда скрипт один я записываю перед  прыжком на newmem , а если  скриптов несколько ?

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

17 минут назад, Alex2411 сказал:

а когда скрипт  один  почему тогда  можно  прыгать  jmp newmem

Наверное потому, что и function_1 vs function_2 писать не надо. Делить то не чего.. 

31 минуту назад, Alex2411 сказал:

опустим  есть скрипт поиск  фильтра игрока. нашел число игрока  записал в метку  filter

Если я правильно понял, то как то так наверное делается..  

Спойлер

newmem: 

qwe_1: 
mov eax,[ecx+4] 
mov [filter],eax
jmp ret_1

qwe_2:  
mov ebx,[ecx+4] 
cmp [filter],ebx 
jne exit 
imul ebx,[speed]

exit: 
jmp ret_2 

speed: 
dd 4 <---------- множ как угодно.

конечно такое на вряд ли будет, так как данные скорее всего с (.) тут зависит от ситуации и везде по разному делается...  
Но опять же, можно и почитать в интернете о множении тех же xmm... Способов реализовать подобное много. Это всего лишь пример.

 

 

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

51 минуту назад, LIRW сказал:

Если я правильно понял, то как то так наверное делается.

 

спсибо  что помогаешь. форум  не дает плюсик поставить. 

умножать я вроде умею . тут мне не понятно  другое .  куда в твоем  примере скрипта будет правильно вписать метку
filter:
 dd 0
из первого  скрипта ?  сразу после jmp ret_1 или после jmp ret_2  рядом с меткой speed или  где то в другом месте ?
просто мне не понятно  в каком  месте скрипта записывать  такие метки из  разных скриптов, если  несколько скриптов надо объединить  в один.. то ли все метки  рядом  то ли  каждую рядом  с частью от ее скрипта

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

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

просто мне не понятно  в каком  месте скрипта записывать  такие метки из  разных скриптов,

Всё можно писать в самом конце последней функции.  

Или там же так же..   

Спойлер

qwe_1: 
mov eax,[ecx+4] 
mov [filter],eax
jmp ret_1
filter: 
dd 0 

qwe_2:  
mov ebx,[ecx+4] 
cmp [filter],ebx 
jne exit 
imul ebx,[speed]

 

Спойлер

originalcode: 
xxxxxxxx 
jmp return 

metka_1: // пиши сколько хочешь.. 
dd 
metka_2: 
dd  

function_1: 
jmp // нужная функция 
return:

 

 

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

3 часа назад, Alex2411 сказал:

не нашел . моежт плохо  поискал не знаю

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

Ну к примеру взял вот первое попавшееся видос: 

 

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

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

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

 

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

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

5 минут назад, Alex2411 сказал:

посоветуй еще пожалуйста  что посмотреть твоего видео по  моему вопросу

шутишь что-ли..:D

У меня где-то 300 видео - ты думаешь я помню, где в каком о чем говорил.

 

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

В 09.01.2019 в 22:22, Alex2411 сказал:

отдельно  скрипты работают , а  когда  соединю вместе , то  игра зависает иногда крашится

 

Просто покажи как ты объединяешь скрипты. Может быть там ошибка от простой до той, с которой надо сидеть и разбираться в отладке. CE иногда может с багами скрипты компилировать

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

собираю  скрипт и столкнулся  проблемой . помогите  решить пожалуйста
в игре  участок кода

call xxx1
fld qword ptr [eax+40]
call xxx2


мне нужно  инжекцию кода  на инструкцию fld qword ptr [eax+40] . она занимает 3 байт .  на  адреса call xxx1  и call xxx2  игра иногда прыгает.  поэтому  когда call  скрипт переносит  в выделеную память игра  не попадает  на call  и вылетает .
 что  можно сделать ?

Изменено пользователем Xipho
Правила публикации и использования тэгов отменили? Нет, не думаю.
Ссылка на комментарий
Поделиться на другие сайты

1 час назад, partoftheworlD сказал:

инжект на другом куске памяти где-нибудь до выполнения этой инструкции.

 

 

я пробовал . у меня  не получаеться .
код игры

00626966 - E8 29D8DDFF           - call 00404194
0062696B - DD 40 40              - fld qword ptr [eax+40]
0062696E - E8 A1C6DDFF           - call 00403014

мне  нужно записать  число  double в   [eax+40]  до срабатывания  инструкции   fld qword ptr [eax+40]
код игры  по  адресу  call 00404194

00404194 - 85 C0                 - test eax,eax
00404196 - 74 16                 - je 004041AE
00404198 - 89 C1                 - mov ecx,eax
0040419A - 8B 09                 - mov ecx,[ecx]
0040419C - 39 D1                 - cmp ecx,edx
0040419E - 74 0E                 - je 004041AE
004041A0 - 8B 49 DC              - mov ecx,[ecx-24]
004041A3 - 85 C9                 - test ecx,ecx
004041A5 - 75 F3                 - jne 0040419A
004041A7 - B0 0A                 - mov al,0A { 10 }
004041A9 - E9 9EEAFFFF           - jmp 00402C4C
004041AE - C3                    - ret 

нужные мне  eax остаються после  cmp ecx,edx если  регистры равны . но инжектить не получаеться потому  что на  инструкцию mov ecx,[ecx]  есть прыжки и  игра вылетает . на mov ecx,[ecx-24] вроде то же есть .
я не знаю что сделать . помогите пожалуйста

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

37 минут назад, Alex2411 сказал:

у меня  не получаеться

Получи адрес который работает с этой инструкцией 

fld qword ptr [eax+40]

А после ставь бряк на доступ по найденному адресу, должны появиться ещё инструкции работающие с этим адресом и пробуй делать инжект на них. Так же, можно найти откуда берется значение в адресе [eax+40] и использовать скрипт для записи в адрес, который будет писать значение в [eax+40].

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

48 минут назад, partoftheworlD сказал:

ставь бряк на доступ по найденному адресу, должны появиться ещё инструкции работающие с этим адресом и пробуй делать инжект на них. Так же, можно найти откуда берется значение в адресе [eax+40] и использовать скрипт для записи в адрес, который будет писать значение в [eax+40].

 

 я  так сразу пробовал сделать.. есть еще 2  инструкции , которые  работают с адресами  [eax+40] . одна  из них на  запись, но  они работают еще с  очень большим  числом адресов . с врагами с союзниками с стеком  потом еще какими то адресами когда  загружаеться другая локация. фильтр  не сделать .  а  в этой инструкции сами  отсеиваються  нужные регистры  eax  всего от 2 до  16 нужных .

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

5 часов назад, Alex2411 сказал:

мне  нужно записать  число  double в   [eax+40]  до срабатывания  инструкции   fld qword ptr [eax+40]

1. нужно посмотреть в самой функции call 00404194 и найти участок игрового кода, где можно сделать инъекцию, после записи указателя в регистр eax.

2. 

5 часов назад, Alex2411 сказал:

до срабатывания  инструкции

не обязательно "до", можно и после (нужно смотреть игровой код), т.е. в функции call 00403014 тоже можно найти участок кода.
нужно будет убрать из стека st(0) записать новое значение в  [eax+40] и по новой записать в стек  fld qword ptr [eax+40]

ЗЫ: если функции не большие сделай скрины их обоих и выложи сюда, чтобы можно было подсказать. Да и прячь их в спойлеры. Вот за этот твой пост уже можно выдавать пред, т.к. не соотвествует правилам форума.

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

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

нужно посмотреть в самой функции call 00404194 и найти участок игрового кода, где можно сделать инъекцию, после записи указателя в регистр eax.

 

функцию call 00404194 я  раньше  привел целиком . забыл  тег спойлер поставить извини .посмотри там  все от адреса 00404194  до выхода ret .
инжекцю  я не знаю где сделать . не получаеться . до инструкции  cmp ecx,edx  много лишних срабатываний . после  ecx = edx остаються только нужные мне eax , но видишь там  сразу  условный прыжок на выход из call.  посмотри на инструкцию  перед сравнением  регистров mov ecx,[ecx] туда  тоже прыжки . еще  на инструкцию по ниже mov ecx,[ecx-24] откуда то есть прыжок .

 

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

не обязательно "до", можно и после (нужно смотреть игровой код), т.е. в функции call 00403014 тоже можно найти участок кода.

 

я понимаю . то же не нашел как сделать .
код в call 00403014

00403014 - 83 EC 08              - sub esp,08 { 8 }
00403017 - DF 3C 24              - fistp qword ptr [esp]
0040301A - 9B                    - wait 
0040301B - 58                    - pop eax
0040301C - 5A                    - pop edx
0040301D - C3                    - ret 

проблема  как я писал в начале что на call 00403014 игра  откуда то прыгает . в eax появляется много лишних . инжекция  на sub esp,08  крашит игру .

 

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

убрать из стека st(0)

 

хотел  спросить . мне бывает нужно  обнулить st(0) без выталкивание , а бывает  нужно  вытолкнуть как  не нужный . как  лучше это  делать ? я обычно  умножал на  метку = 0 или  выталкивал в не нужный участо памяти , но  так наверно не правильно . объясни пожалуйста

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

5 часов назад, Alex2411 сказал:

функцию call 00404194 я  раньше  привел целиком

ОК.

Не обратил внимание. Так как в том call три прыжка то неизвестно откуда приходит к нам значение твоего eax. (тут уже лучше делать трассировку и смотреть.)

Из второго call (нижнего) может получиться.

Сделай стандартный СЕ-ный скрипт с Логами из инструкции 

00403014 - 83 EC 08              - sub esp,08 { 8 }

и выложи сюда скрипт (не забудь про теги спойлера и кода), попробую написать тебе скрипт. Да и напиши какое число (само собой double) тебе нужно записать в адрес.

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

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

Из второго call (нижнего) может получиться.

 

 

на второй call  игра делает много  прыжков из других мест  поэтому  на интрукции sub esp,08  появляеться очень  много других  срабатываний . на  инструкции  fld qword ptr [eax+40]  срабатывает только  нужные мне  eax , а  на sub esp,08  уже  появляються другие eax . число double 100 .

это  скрипт как ты сказал  на sub esp,08, но с ним  игра  сразу крашится .

Спойлер

[ENABLE]

aobscanmodule(INJECT,Rangers.exe,83 EC 08 DF 3C 24 9B 58 5A C3) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:

code:
  sub esp,08
  fistp qword ptr [esp]
  jmp return

INJECT:
  jmp newmem
  nop
return:
registersymbol(INJECT)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
INJECT:
  db 83 EC 08 DF 3C 24

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Rangers.exe"+3014

"Rangers.exe"+2FF8: D9 7C 24 02           -  fnstcw [esp+02]
"Rangers.exe"+2FFC: 9B                    -  wait 
"Rangers.exe"+2FFD: 66 81 4C 24 02 00 0F  -  or word ptr [esp+02],0F00
"Rangers.exe"+3004: D9 6C 24 02           -  fldcw [esp+02]
"Rangers.exe"+3008: D9 FC                 -  frndint 
"Rangers.exe"+300A: 9B                    -  wait 
"Rangers.exe"+300B: D9 2C 24              -  fldcw [esp]
"Rangers.exe"+300E: 83 C4 04              -  add esp,04
"Rangers.exe"+3011: DE E9                 -  fsubp st(1),st(0)
"Rangers.exe"+3013: C3                    -  ret 
// ---------- INJECTING HERE ----------
"Rangers.exe"+3014: 83 EC 08              -  sub esp,08
"Rangers.exe"+3017: DF 3C 24              -  fistp qword ptr [esp]
// ---------- DONE INJECTING  ----------
"Rangers.exe"+301A: 9B                    -  wait 
"Rangers.exe"+301B: 58                    -  pop eax
"Rangers.exe"+301C: 5A                    -  pop edx
"Rangers.exe"+301D: C3                    -  ret 
"Rangers.exe"+301E: 8B C0                 -  mov eax,eax
"Rangers.exe"+3020: 83 EC 0C              -  sub esp,0C
"Rangers.exe"+3023: D9 3C 24              -  fnstcw [esp]
"Rangers.exe"+3026: D9 7C 24 02           -  fnstcw [esp+02]
"Rangers.exe"+302A: 9B                    -  wait 
"Rangers.exe"+302B: 66 81 4C 24 02 00 0F  -  or word ptr [esp+02],0F00
}

 

 

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

9 минут назад, Alex2411 сказал:

число double 100 .

Попробуй:

Спойлер

[ENABLE]
aobscanmodule(INJECT,Rangers.exe,83 EC 08 DF 3C 24 9B 58 5A C3)
alloc(newmem,$1000)
label(code)
label(return)
label(value)
registersymbol(INJECT)

newmem:
  fstp qword ptr [eax+40]
  fld qword ptr [value]
  fst qword ptr [eax+40]

code:
  sub esp,08
  fistp qword ptr [esp]
  jmp return

value:
  dq (double)100

INJECT:
  jmp newmem
  db 90
return:

[DISABLE]
INJECT:
  db 83 EC 08 DF 3C 24

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Rangers.exe"+3014

"Rangers.exe"+2FF8: D9 7C 24 02           -  fnstcw [esp+02]
"Rangers.exe"+2FFC: 9B                    -  wait
"Rangers.exe"+2FFD: 66 81 4C 24 02 00 0F  -  or word ptr [esp+02],0F00
"Rangers.exe"+3004: D9 6C 24 02           -  fldcw [esp+02]
"Rangers.exe"+3008: D9 FC                 -  frndint
"Rangers.exe"+300A: 9B                    -  wait
"Rangers.exe"+300B: D9 2C 24              -  fldcw [esp]
"Rangers.exe"+300E: 83 C4 04              -  add esp,04
"Rangers.exe"+3011: DE E9                 -  fsubp st(1),st(0)
"Rangers.exe"+3013: C3                    -  ret
// ---------- INJECTING HERE ----------
"Rangers.exe"+3014: 83 EC 08              -  sub esp,08
"Rangers.exe"+3017: DF 3C 24              -  fistp qword ptr [esp]
// ---------- DONE INJECTING  ----------
"Rangers.exe"+301A: 9B                    -  wait
"Rangers.exe"+301B: 58                    -  pop eax
"Rangers.exe"+301C: 5A                    -  pop edx
"Rangers.exe"+301D: C3                    -  ret
"Rangers.exe"+301E: 8B C0                 -  mov eax,eax
"Rangers.exe"+3020: 83 EC 0C              -  sub esp,0C
"Rangers.exe"+3023: D9 3C 24              -  fnstcw [esp]
"Rangers.exe"+3026: D9 7C 24 02           -  fnstcw [esp+02]
"Rangers.exe"+302A: 9B                    -  wait
"Rangers.exe"+302B: 66 81 4C 24 02 00 0F  -  or word ptr [esp+02],0F00
}

 

Отпишись о результатах.

ЗЫ: хотя это

13 минут назад, Alex2411 сказал:

на второй call  игра делает много  прыжков из других мест

может помешать - нужен будет фильтровать, как-то по адресу.

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

17 минут назад, Garik66 сказал:

Попробуй

 

включил . сразу краш игры.
 не получиться . там куча  других срабатываний . нельзя  писать в [eax+40] на втором call .

 

18 минут назад, Garik66 сказал:

нужен будет фильтровать, как-то по адресу

 

я пробовал. не  получаеться сделать фильтр . обращений  из разных  мест игры больше  50 .

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

  • Xipho закрыл тема
Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...

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

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