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

Выполнение логики в таймере(потоке)


DarkPower2

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

Доброго времени суток.

 

Вступление

Хочу написать некий телепорт.
Игра CoD: AW. 

Когда-то делал Grab скрипт для SAMP'a, вот решил провернуть что-то такое в CoD средствами CE (AA).

Есть вектор игрока и вектор камеры (2 координаты).

 

Сами проблемы

  1. Столкнулся с проблемой обычного изменения координаты в АА
    Спойлер
    
    [ENABLE]
    loadlibrary(luaclient-x86_64.dll)
    globalalloc(newmem,4096)
    createthread(newmem)
    label(end)
    registersymbol(end)
    
    newmem:
     push eax
     push ecx
    
     //Помещаем 15 патронов
     mov eax, ["s1_sp64_ship.exe"+03C19040]
     mov [eax+5B8], 15
    
     luacall(speakEnglish("It Work", true))
     //luacall(showMessage(eax))
    
    
     pop ecx
     pop eax
    
     push 0x000003e8
     call kernel32.Sleep //Игнорит
    
     luacall(speakEnglish("It Work 2", true))
    
     cmp [end], 1
     jne newmem
     //jmp newmem //Все равно не срабатывает
    
     luacall(speakEnglish("It Work 3", true))
     ret
    
    end:
     dd 0
    
    [disable]
    end:
     dd 1

     


    Посмотрел примеры, как делали в интернете. Создают поток. Создал - и ничего.
    Т.е. luacall(speakEnglish("It Work", true)) работает.
    Патроны не меняются, пробовал на прямой адрес (без указателей) - результат тот же.
     
    143F10708 = 30 //Патроны
    5B8 -> 143F10150+5B8 = 143F10708
    "s1_sp64_ship.exe"+03C19040 -> 143F10150 //Игрок

     

  2. В коде выше просто игнорятся:
    call kernel32.Sleep //Игнорит

    и
    cmp [end], 1
     jne newmem
     //jmp newmem //Все равно не срабатывает
    Почему такое происходит?
    И как мне сделать Таймер?
     
  3. Как вывести значение из регистра в МеседжБокс?
    luacall(showMessage(eax))

    Что-то типа такого

 

Сокращения и аббревиатуры:

CoD: AW - Call of Duty: Advanced Warfare

Grab - Перетаскивание(изменениее координат) чего-либо с помощью обзора мышки. Установка координат объекту с помощью направления камеры, растояния и позиции.

SAMP - San Andreas Multiplayer

AA - Auto Assembler

 

P.S. Знаю, что можно реализовать это все не в АА (C#, lua, C++ и другие), но меня интересует именно это направление.

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

Пошаговая отладка в Cheat Engine подскажет что не так. Заранее вручную создаем newMem-память, метку и вручную запускаем поток и там делаем пошаговую отладку. Разбираемся в причинах. Правим. Проверяем и так пока не будет работать.

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

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

Пошаговая отладка в Cheat Engine подскажет что не так. Заранее вручную создаем newMem-память, метку и вручную запускаем поток и там делаем пошаговую отладку. Разбираемся в причинах. Правим. Проверяем и так пока не будет работать.

Так и сделал.

 

Поток - работает.

JMP - работает.

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

 

 mov eax, ["s1_sp64_ship.exe"+03C19040] //Тут я озадачен - получаем в ответ [00000000]

 

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

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

Спойлер

[ENABLE]
globalalloc(newmem,1024)
globalalloc(end, 4)
createthread(newmem)
label(end)
registersymbol(end)

newmem:
 push eax
 push ecx

 //logic start
 mov rax, s1_sp64_ship.exe
 add rax, 03C19040
 mov rax, [rax]
 add rax, 5B8
 mov [rax], 15
 //logic end

 //wait
 mov ecx, 00001388 //5000ms - mov ecx, #5000
 call kernel32.sleep

 pop ecx
 pop eax

 cmp [end], 1
 jne newmem
 //jmp newmem
 ret

end:
 dd 0

[disable]
end:
 dd 1
//dealloc(newmem)

 

 

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

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

Разобрался

А так в СЕ разве не работает?

Спойлер

 mov [["s1_sp64_ship.exe"+03C19040]+5B8], 15

// Вместо:
 mov rax, s1_sp64_ship.exe
 add rax, 03C19040
 mov rax, [rax]
 add rax, 5B8
 mov [rax], 15

 


 

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

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

А так в СЕ разве не работает?

Нет. Флажок не переключается в enable

Разве что так:

Спойлер

 mov rax, s1_sp64_ship.exe
 add rax, 03C19040
 mov rax, [rax]

 mov [rax+5B8], 15 //ammo

 

 

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

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

Нет

Странно.
Я сейчас проверил на Туториале СЕ (2 шаг) (СЕ 6.5) и у меня все работает:

Спойлер

image.thumb.png.3950b5040c10c0eb17dfa03a41802ef0.png

 

Скрипт:
 


{ Game   : Tutorial-i386.exe
  Version: 
  Date   : 2018-08-16
  Author : Garik66

  This script does blah blah blah
}

[ENABLE]
aobscanmodule(INJECT,Tutorial-i386.exe,81 BB 80 04 00 00 E8 03 00 00) // should be unique
alloc(newmem,$1000)
label(code)
label(return)
registersymbol(INJECT)

newmem:
  mov [["Tutorial-i386.exe"+2345D0]+480],000003E8

code:
  cmp [ebx+00000480],000003E8
  jmp return

INJECT:
  jmp newmem
  db 90 90 90 90 90
return:

[DISABLE]
INJECT:
  db 81 BB 80 04 00 00 E8 03 00 00

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+23AC3

"Tutorial-i386.exe"+23AB1: E8 0A 9D FE FF                 -  call Tutorial-i386.exe+D7C0
"Tutorial-i386.exe"+23AB6: 5E                             -  pop esi
"Tutorial-i386.exe"+23AB7: 5B                             -  pop ebx
"Tutorial-i386.exe"+23AB8: C9                             -  leave 
"Tutorial-i386.exe"+23AB9: C3                             -  ret 
"Tutorial-i386.exe"+23ABA: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+23ABC: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+23ABE: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+23AC0: 53                             -  push ebx
"Tutorial-i386.exe"+23AC1: 89 C3                          -  mov ebx,eax
// ---------- INJECTING HERE ----------
"Tutorial-i386.exe"+23AC3: 81 BB 80 04 00 00 E8 03 00 00  -  cmp [ebx+00000480],000003E8
// ---------- DONE INJECTING  ----------
"Tutorial-i386.exe"+23ACD: 75 2C                          -  jne Tutorial-i386.exe+23AFB
"Tutorial-i386.exe"+23ACF: 8B 83 68 04 00 00              -  mov eax,[ebx+00000468]
"Tutorial-i386.exe"+23AD5: B2 01                          -  mov dl,01
"Tutorial-i386.exe"+23AD7: 8B 8B 68 04 00 00              -  mov ecx,[ebx+00000468]
"Tutorial-i386.exe"+23ADD: 8B 09                          -  mov ecx,[ecx]
"Tutorial-i386.exe"+23ADF: FF 91 20 02 00 00              -  call dword ptr [ecx+00000220]
"Tutorial-i386.exe"+23AE5: 8B 83 78 04 00 00              -  mov eax,[ebx+00000478]
"Tutorial-i386.exe"+23AEB: B2 00                          -  mov dl,00
"Tutorial-i386.exe"+23AED: 8B 8B 78 04 00 00              -  mov ecx,[ebx+00000478]
"Tutorial-i386.exe"+23AF3: 8B 09                          -  mov ecx,[ecx]
}

 

 

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

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

Странно.

Снова проверил. Теперь флажок ставится, а игра крашится моментально.

Моим способом все отличо.

 

Суть в чем, я как-то переходил по адресам через CTRL+G на значение от ("s1_sp64_ship.exe"+03C19040) и 143F10150 - итог разные участки памяти и данные  были, хотя сам cheat engine показывает что

["s1_sp64_ship.exe"+03C19040] <=> 143F10150 (В табллице)

 

Ну или может потому что конечное число статическое.

Т.е. сразу зеленое s1_sp64_ship.exe+3F10708

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

Спойлер

2018-08-16_05-54-15.gif

 

Возможно потому что это в потоке отдельном делается.

Попробуйте создать поток.

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

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

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

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