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

[CE Auto-Assembler]Как воспользоваться адресом, который записан в сигнатуре?


Desmos

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

Есть у меня сигнатура, например

F2 0F 10 05 XX XX XX XX 8B 4D D0 89 45 C4 89 45 A4

Она означает вот этот код:

440E1864 - F2 0F10 05 2890D706   - movsd xmm0,[06D79028] { [2000.00] }
440E186C - 8B 4D D0              - mov ecx,[ebp-30]
440E186F - 89 45 C4              - mov [ebp-3C],eax
440E1872 - 89 45 A4              - mov [ebp-5C],eax

Но меня интересует конкретно адрес, который в сигнатуре записан как XX XX XX XX.

Инструкция, работающая с этим адресом (в качестве адреса взят 06D79028, естественно вместо XX XX XX XX будет адрес):

F2 0F10 05 2890D706   - movsd xmm0,[06D79028]

Он при перезапуске игры меняется. Вопрос, можно ли в Аuto-Аssembler использовать этот адрес для того, чтобы изменить значение, хранящееся в нём? И ещё, как сделать спойлер у вас на форуме?

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

23 минуты назад, Desmos сказал:

Вопрос, можно ли в Аuto-Аssembler использовать этот адрес для того, чтобы изменить значение, хранящееся в нём?

Можно - пишешь скрипт.

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

И ещё, как сделать спойлер у вас на форуме?

Тык

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

А как это делать, не подскажите, если не сложно. Я попробую сам порассуждать, а вы поправите меня пожалуйста, если что не так?

Адрес мы можем достать через aobscan. То есть есть у нас вот это:

[spoiler="Часть кода Auto-Assembler"]
aobscan(INJECT,F2 0F 10 05 XX XX XX XX 8B 4D D0 89 45 C4 89 45 A4)

[/spoiler]

И я хочу обратиться к XX XX XX XX:

[spoiler="Часть кода Auto-Assembler"]
newmem:
fld qword ptr [myDoubleValue]
fstp qword ptr [INJECT+04]
jmp code:
[/spoiler]

Так не получается, компилятор ругается. Как быть? И ещё, как после подмены кода в секции DISABLE вернуть код на место тогда? Там же надо сигнатуру с адресом возвращать, то есть не виде F2 0F 10 05 XX XX XX XX, а в виде скажем F2 0F 10 05 45 23 53 06. У меня же просто будет на прыжок заменяться + 3 нопа = 8 байт, то есть F2 0F 10 05 XX XX XX XX заменится на

jmp newmem
nop
nop
nop

. А обратно же замену надо делать? Ну там в конце после DISABLE есть

INJECT:
 db (сигнатура оригинального кода)

Помогите пожалуйста! Не знаю, как быть.

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

Спойлер

{ Game   : TankiPlayer.exe
  Version: 
  Date   : 2018-07-30
  Author : ????

  This script does blah blah blah
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

 
 
aobscan(INJECT,F2 0F 10 05 18 98 E4 06) // should be unique
alloc(newmem,$1000)

label(code)
label(return)

newmem:

code:
  movsd xmm0,[06E49818]
  jmp return

INJECT:
  jmp newmem
  nop
  nop
  nop
return:
registersymbol(INJECT)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
INJECT:
  db F2 0F 10 05 18 98 E4 06

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 438F5873

438F5852: E8 C9 0A 3C 1B           -  call Flash32_30_0_0_134.ocx+806320
438F5857: 8B 48 10                 -  mov ecx,[eax+10]
438F585A: 85 C9                    -  test ecx,ecx
438F585C: 0F 84 B5 02 00 00        -  je 438F5B17
438F5862: 8B 41 08                 -  mov eax,[ecx+08]
438F5865: 8B 50 10                 -  mov edx,[eax+10]
438F5868: 8B 42 08                 -  mov eax,[edx+08]
438F586B: 89 45 D0                 -  mov [ebp-30],eax
438F586E: 8B 42 18                 -  mov eax,[edx+18]
438F5871: FF D0                    -  call eax
// ---------- INJECTING HERE ----------
438F5873: F2 0F 10 05 18 98 E4 06  -  movsd xmm0,[06E49818]
// ---------- DONE INJECTING  ----------
438F587B: 8B 4D D0                 -  mov ecx,[ebp-30]
438F587E: 89 45 C4                 -  mov [ebp-3C],eax
438F5881: 89 45 A4                 -  mov [ebp-5C],eax
438F5884: 66 0F D6 45 A8           -  movq [ebp-58],xmm0
438F5889: 66 0F D6 45 B0           -  movq [ebp-50],xmm0
438F588E: 66 0F D6 45 B8           -  movq [ebp-48],xmm0
438F5893: 8B 41 04                 -  mov eax,[ecx+04]
438F5896: 8D 55 A4                 -  lea edx,[ebp-5C]
438F5899: 83 EC 04                 -  sub esp,04
438F589C: 52                       -  push edx

 

Адрес 06E49818, который в movsd xmm0,[06E49818] меняется и при перезапуске игры может изменяться. Что делать?

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

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

Что делать?

 

Делать инъекцию ниже где идет xmm0

438F5884: 66 0F D6 45 A8           -  movq [ebp-58],xmm0

так проще. Ну а чтобы до того адреса добраться, то на АА разные варианты подбирать либо быстрее на Lua через поиск сигнатуры и + смещение. Либо через поиск сигнатуры и дизассемблирование

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

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

Что делать?

Какое тебе значение нужно в искомом адресе? 

Извини - только приехал.

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

Что делать?

Скрипт не тестил (сам потетсь, нет времени):

Спойлер

{ Game   : TankiPlayer.exe
  Version:
  Date   : 2018-07-30
  Author : ????
  Редакция: Garik66

  This script does blah blah blah
}

[ENABLE]
aobscan(INJECT,F2 0F 10 05 XX XX XX XX 8B 4D D0 89 45 C4 89 45 A4) // should be unique
alloc(newmem,$1000)
label(return)
label(code)
registersymbol(code)
registersymbol(INJECT)

newmem:
  mov [[code+4]],(float)2000  // В [code+4] по идее наш адрес. запиши в него
                              // то что тебе нужно.

code:
  readmem(INJECT,8)           // Если меняется адрес, то делаем так 1
  jmp return

INJECT:
  jmp newmem
  db 90 90 90
return:

[DISABLE]
INJECT:
  readmem(code,8)            // и так 2

unregistersymbol(code)       // также 3 регистрируем/дерегистр. метку code
unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 438F5873

438F5852: E8 C9 0A 3C 1B           -  call Flash32_30_0_0_134.ocx+806320
438F5857: 8B 48 10                 -  mov ecx,[eax+10]
438F585A: 85 C9                    -  test ecx,ecx
438F585C: 0F 84 B5 02 00 00        -  je 438F5B17
438F5862: 8B 41 08                 -  mov eax,[ecx+08]
438F5865: 8B 50 10                 -  mov edx,[eax+10]
438F5868: 8B 42 08                 -  mov eax,[edx+08]
438F586B: 89 45 D0                 -  mov [ebp-30],eax
438F586E: 8B 42 18                 -  mov eax,[edx+18]
438F5871: FF D0                    -  call eax
// ---------- INJECTING HERE ----------
438F5873: F2 0F 10 05 18 98 E4 06  -  movsd xmm0,[06E49818]
// ---------- DONE INJECTING  ----------
438F587B: 8B 4D D0                 -  mov ecx,[ebp-30]
438F587E: 89 45 C4                 -  mov [ebp-3C],eax
438F5881: 89 45 A4                 -  mov [ebp-5C],eax
438F5884: 66 0F D6 45 A8           -  movq [ebp-58],xmm0
438F5889: 66 0F D6 45 B0           -  movq [ebp-50],xmm0
438F588E: 66 0F D6 45 B8           -  movq [ebp-48],xmm0
438F5893: 8B 41 04                 -  mov eax,[ecx+04]
438F5896: 8D 55 A4                 -  lea edx,[ebp-5C]
438F5899: 83 EC 04                 -  sub esp,04
438F589C: 52                       -  push edx
}

 

 

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

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

Какое тебе значение нужно в искомом адресе? 

Извини - только приехал.

Скрипт не тестил (сам потетсь, нет времени):

  Показать контент


{ Game   : TankiPlayer.exe
  Version:
  Date   : 2018-07-30
  Author : ????
  Редакция: Garik66

  This script does blah blah blah
}

[ENABLE]
aobscan(INJECT,F2 0F 10 05 XX XX XX XX 8B 4D D0 89 45 C4 89 45 A4) // should be unique
alloc(newmem,$1000)
label(return)
label(code)
registersymbol(code)
registersymbol(INJECT)

newmem:
  mov [[code+4]],(float)2000  // В [code+4] по идее наш адрес. запиши в него
                              // то что тебе нужно.

code:
  readmem(INJECT,8)           // Если меняется адрес, то делаем так 1
  jmp return

INJECT:
  jmp newmem
  db 90 90 90
return:

[DISABLE]
INJECT:
  readmem(code,8)            // и так 2

unregistersymbol(code)       // также 3 регистрируем/дерегистр. метку code
unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: 438F5873

438F5852: E8 C9 0A 3C 1B           -  call Flash32_30_0_0_134.ocx+806320
438F5857: 8B 48 10                 -  mov ecx,[eax+10]
438F585A: 85 C9                    -  test ecx,ecx
438F585C: 0F 84 B5 02 00 00        -  je 438F5B17
438F5862: 8B 41 08                 -  mov eax,[ecx+08]
438F5865: 8B 50 10                 -  mov edx,[eax+10]
438F5868: 8B 42 08                 -  mov eax,[edx+08]
438F586B: 89 45 D0                 -  mov [ebp-30],eax
438F586E: 8B 42 18                 -  mov eax,[edx+18]
438F5871: FF D0                    -  call eax
// ---------- INJECTING HERE ----------
438F5873: F2 0F 10 05 18 98 E4 06  -  movsd xmm0,[06E49818]
// ---------- DONE INJECTING  ----------
438F587B: 8B 4D D0                 -  mov ecx,[ebp-30]
438F587E: 89 45 C4                 -  mov [ebp-3C],eax
438F5881: 89 45 A4                 -  mov [ebp-5C],eax
438F5884: 66 0F D6 45 A8           -  movq [ebp-58],xmm0
438F5889: 66 0F D6 45 B0           -  movq [ebp-50],xmm0
438F588E: 66 0F D6 45 B8           -  movq [ebp-48],xmm0
438F5893: 8B 41 04                 -  mov eax,[ecx+04]
438F5896: 8D 55 A4                 -  lea edx,[ebp-5C]
438F5899: 83 EC 04                 -  sub esp,04
438F589C: 52                       -  push edx
}

 

 

Не компилит, пишет ошибку в этом месте 

mov [[code+4]],(float)2000

Вот идея MasterGH мне понравилась, адрес выдернуть как строку из сигнатуры через средства lua. Ответь только на C++ такое можно сделать? Просто я с ним больше знаком.

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

Через АА примерно так делать можно, где в originalbytes будет адрес

Спойлер

image.png

Спойлер

{ Game   : Tutorial-i386.exe
  Version: 
  Date   : 2018-07-31
  Author : Andrew

  This script does blah blah blah
}

[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat

 
 
aobscanmodule(INJECT,Tutorial-i386.exe,64 FF FF 89 F1 B8 88 4A 5A 00) // should be unique
alloc(newmem,$1000)
alloc(originalbytes, 7)
registersymbol(originalbytes)

label(code)
label(return)

originalbytes:
readmem(INJECT+05+01,5)  //store the original bytes

newmem:
  //readmem(INJECT+05,5)
code:
  reassemble(INJECT+05)
  jmp return

INJECT+05:
  jmp newmem
return:
registersymbol(INJECT)

[DISABLE]
//code from here till the end of the code will be used to disable the cheat
INJECT+05:
  db B8 88 4A 5A 00

unregistersymbol(INJECT)
dealloc(newmem)

{
// ORIGINAL CODE - INJECTION POINT: "Tutorial-i386.exe"+2402B

"Tutorial-i386.exe"+2400D: 8B 8B 78 04 00 00              -  mov ecx,[ebx+00000478]
"Tutorial-i386.exe"+24013: 8B 09                          -  mov ecx,[ecx]
"Tutorial-i386.exe"+24015: FF 91 D8 00 00 00              -  call dword ptr [ecx+000000D8]
"Tutorial-i386.exe"+2401B: 5B                             -  pop ebx
"Tutorial-i386.exe"+2401C: C3                             -  ret 
"Tutorial-i386.exe"+2401D: 00 00                          -  add [eax],al
"Tutorial-i386.exe"+2401F: 00 53 56                       -  add [ebx+56],dl
"Tutorial-i386.exe"+24022: 89 C6                          -  mov esi,eax
"Tutorial-i386.exe"+24024: E8 87 64 FF FF                 -  call Tutorial-i386.exe+1A4B0
"Tutorial-i386.exe"+24029: 89 F1                          -  mov ecx,esi
// ---------- INJECTING HERE ----------
"Tutorial-i386.exe"+2402B: B8 88 4A 5A 00                 -  mov eax,Tutorial-i386.exe+1A4A88
// ---------- DONE INJECTING  ----------
"Tutorial-i386.exe"+24030: BA 01 00 00 00                 -  mov edx,00000001
"Tutorial-i386.exe"+24035: BB 88 4A 5A 00                 -  mov ebx,Tutorial-i386.exe+1A4A88
"Tutorial-i386.exe"+2403A: FF 93 C4 00 00 00              -  call dword ptr [ebx+000000C4]
"Tutorial-i386.exe"+24040: A3 E0 15 60 00                 -  mov [Tutorial-i386.exe+2015E0],eax
"Tutorial-i386.exe"+24045: 8B 96 3C 02 00 00              -  mov edx,[esi+0000023C]
"Tutorial-i386.exe"+2404B: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
"Tutorial-i386.exe"+24050: E8 CB EE 06 00                 -  call Tutorial-i386.exe+92F20
"Tutorial-i386.exe"+24055: 8B 96 E8 00 00 00              -  mov edx,[esi+000000E8]
"Tutorial-i386.exe"+2405B: A1 E0 15 60 00                 -  mov eax,[Tutorial-i386.exe+2015E0]
"Tutorial-i386.exe"+24060: E8 4B F1 06 00                 -  call Tutorial-i386.exe+931B0
}

 

 

Через Lua:

Спойлер

local signature = '64 FF FF 89 F1 B8 88 4A 5A 00'
local results = AOBScan(signature, "+X-C*W")
if results ~= nil then
  local address = getNameFromAddress(results[0]..'+5')
  --local targetAddress = disassemble(address):match("%[(.+)%]")  если адрес в скобках
  -- для извлечения адреса -- 0042402B - B8 884A5A00           - mov eax,005A4A88 { [00000488] }  если адрес после зяпятой не в скобках
  local targetAddress = disassemble(address):match(",(.+)")
        --> 0x005A4A88
  print(targetAddress)
end

 

Спойлер

image.png

 

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

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

Не компилит, пишет ошибку в этом месте 

Жаль, что не написал, что за ошибка.

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

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

15 часов назад, Desmos сказал:

Не компилит, пишет ошибку в этом месте 

Скобки то лишние убрать надо... Да и адрес загрузит всё равно не тот... 

А вот так если писать, что не канает ?  

Спойлер

[ENABLE]
aobscan(baseplayeraddress,8B 42 18 FF * F2 0F 10 05 * * * * 8B * * 98 45 * 89 45 * * * * * * * * * * * * * * * * 8B 41 04)
alloc(hackmem,$1000)
label(baseplayeraddressret)
label(copycode)
label(newaddress)
hackmem:
movsd xmm0,[newaddress]
jmp baseplayeraddressret
newaddress:
dd (float)2000
copycode:
readmem(baseplayeraddress+5,8)
baseplayeraddress+05:
jmp hackmem
db 90 90 90
baseplayeraddressret:
registersymbol(copycode)
registersymbol(baseplayeraddress)
[DISABLE]
baseplayeraddress+05:
readmem(copycode,8)
unregistersymbol(copycode)
unregistersymbol(baseplayeraddress)
dealloc(hackmem)

 

Если его что то перезаписывает (другой инструкцией) ставь тогда именно на неё. В общем на конечную нужно, что бы адрес следом не перезаписывал её. А значение сам регулируй какой надо.. Но опять же - это только вариант и не более.

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

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

Скобки то лишние убрать надо...

Скобки не лишние. Скрипт доделаю (и потестю в воскресенье) .

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

movsd xmm0,[newaddress]

Скорее всего это на прокатит, т.к. ТС пишет:

 

В 29.07.2018 в 19:59, Desmos сказал:

Но меня интересует конкретно адрес, который в сигнатуре записан как XX XX XX XX.

 

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

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

Скобки не лишние.

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

Оно загружает адрес уже внутри самое функции, который идет после jmp - тоже самое если если загрузить. 

aobscan(baseplayeraddress,8B 42 18 FF * F2 0F 10 05 * * * * 8B * * 98 45 * 89 45 * * * * * * * * * * * * * * * * 8B 41 04) 

newmem: 
mov ecx,baseplayeraddress+9,4  
mov ecx,[ecx]
mov [xxxxxxx],ecx

И опять загрузит адрес внутри функции уже - ну пустого участка. В воскресение попробуешь :)  А я всегда сразу в xmm пишу в подобных делах и всё работает как надо. 

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

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

Жаль, что не написал, что за ошибка.

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

Да, действительно, адрес в сигнатуре перевёрнут вот, например, сигнатура с адресом:

F2 0F 10 05 18 98 E4 06 8B 4D D0 89 45 C4 89 45 A4

XX XX XX XX = 18 98 E4 06

Адрес же 06E49818

А ошибка конкретно такая выскакивает: Невозможно компилировать эту строку mov[ [00000000+4]],(float)2000.0

Скобки пробовал убирать - то же самое. Может я что-то не то делаю?

 

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

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

Может я что-то не то делаю?

Как говорил дядька один... Плохо когда не умеешь, да ещо и забыл :D 

Вот про эти скобки речь была. Но скрипт всё равно не правильно работать будет. До воскресения сам бы уж сделал то... Хотя если не торопишься, жди Игоря. 

Спойлер

[ENABLE]
aobscan(INJECT,F2 0F 10 05 XX XX XX XX 8B 4D D0 89 45 C4 89 45 A4) // should be unique
alloc(newmem,$1000)
label(return)
label(code)
registersymbol(code)
registersymbol(INJECT)

newmem:
  mov [code+4],(float)2000  // В [code+4] по идее наш адрес. запиши в него
                              // то что тебе нужно.

code:
  readmem(INJECT,8)           // Если меняется адрес, то делаем так 1
  jmp return

INJECT:
  jmp newmem
  db 90 90 90
return:

[DISABLE]
INJECT:
  readmem(code,8)            // и так 2

unregistersymbol(code)       // также 3 регистрируем/дерегистр. метку code
unregistersymbol(INJECT)
dealloc(newmem)

 

А выше вариант что дал, не работает ? Если нет, то если уж в скобках не разобрался, то как и на чем сделать  лучше - подавно не поймешь. 

 

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

  • Xipho закрыл тема
В 01.08.2018 в 10:26, Desmos сказал:

Да, действительно, адрес в сигнатуре перевёрнут вот, например, сигнатура с адресом:

 

В 01.08.2018 в 09:54, LIRW сказал:

Игорь,но ошибка то на них именно.

Ответил здесь

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

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

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

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