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

[Anno 2070] проблема с отображением адреса


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

Всем привет.

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

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

Спойлер
Спойлер

Регистры

В регистр RAX - записывается ID предмета (значение в Hex), а в регистр RCX - базовый адрес (к которому нужно прибавить смещение 0с).

 

В дисассемблере жмакнув на ней (пкм) и выбрав опцию "показать адреса к которым обращается эта инструкция", я без труда (зная ИД предмета) нахожу нужный мне адрес. Поэтому решил автоматизировать этот процес с помощью скрипта. Но допустил какую-то ошибку и указатель созданный моим скриптом не отображает никаких адресов.

Спойлер

spacer.png


Собственно в этом и есть моя просьба о помощи.
Вот мой код, подскажите пожалуйста, что в нём не так:

Спойлер
[ENABLE]

aobscanmodule(_Items,Game.exe,CB CC CC CC CC CC CC 8B 41 0C C3 CC) // should be unique
alloc(newmem,$1000,_Items)
alloc(_pitem,8)
label(returnhere)
label(originalcode)
label(exit)

registersymbol(_Items)
registersymbol(_pitem)

newmem:
  cmp rax,0
  jne originalcode
  mov [_pitem],rcx
  add [_pitem],0c

originalcode:
  mov eax,[rcx+0C]
  ret 
  int 3

exit:
  jmp returnhere

_Items+07:
  jmp newmem
returnhere:
registersymbol(_Items)

[DISABLE]

_Items+07:
  db 8B 41 0C C3 CC

unregistersymbol(_Items)
unregistersymbol(_pitem)
dealloc(newmem)

 

 

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

У тебя в скрипте 2 раза прописано 

registersymbol(_Items)

Есть alloc(_pitem,8) но нету delloc(_pitem,8)

И как по мне метка exit: мусор

Я переделал твой скрипт так как привык делать я.

Спойлер
[ENABLE]
aobscanmodule(Items,Anno5.exe,CC CC CC CC CC CC 8B 41 ? C3 CC CC CC CC CC CC CC CC CC CC CC CC 48 89 ? ? ? 53 48 83 EC ? 48 8B ? 48 8D)
alloc(newmem,$1000,Items)
label(return)
label(_item)
registersymbol(_item)
registersymbol(Items)

newmem:
  mov [_item],rcx
  mov eax,[rcx+0C]
  ret 
  int 3 
  jmp return

_item:
db 00

Items+06:
  jmp newmem
return:

[DISABLE]
Items+06:
db 8B 41 0C C3 CC
unregistersymbol(*)
dealloc(newmem)
{
// ORIGINAL CODE - INJECTION POINT: Anno5.CGUIEventScriptingSlot::GetContext+9780
Anno5.CGUIEventScriptingSlot::GetContext+976D: E8 8E 6E 6E 00  - call Anno5.exe+76F4A0
Anno5.CGUIEventScriptingSlot::GetContext+9772: 48 89 73 20     - mov [rbx+20],rsi
Anno5.CGUIEventScriptingSlot::GetContext+9776: B0 01           - mov al,01
Anno5.CGUIEventScriptingSlot::GetContext+9778: EB CB           - jmp Anno5.CGUIEventScriptingSlot::GetContext+9745
Anno5.CGUIEventScriptingSlot::GetContext+977A: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+977B: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+977C: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+977D: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+977E: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+977F: CC              - int 3 
// ---------- INJECTING HERE ----------
Anno5.CGUIEventScriptingSlot::GetContext+9780: 8B 41 0C        - mov eax,[rcx+0C]
// ---------- DONE INJECTING  ----------
Anno5.CGUIEventScriptingSlot::GetContext+9783: C3              - ret 
Anno5.CGUIEventScriptingSlot::GetContext+9784: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+9785: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+9786: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+9787: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+9788: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+9789: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+978A: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+978B: CC              - int 3 
Anno5.CGUIEventScriptingSlot::GetContext+978C: CC              - int 3 
}

 

В таблицу добавляешь адрес [_item]+0C

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

Цитата

А что ты пишешь в таблице в указатель Item?

Версия игры 3.00.8045

А в указатель , хочу чтоб скрипт писал адрес из регистра rcx, со смещением 0с.

 

Спасибо за быстрый ответ. Сейчас попробую твой вариант.

 

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

Я переделал твой скрипт так как привык делать я.

Ваш вариант, у меня почему-то, тоже не работает.

Спойлер

spacer.png

 

 

 

Partizan,

Всё-таки ваш вариант сработал.

Снова моя ошибка была. Я записывал адрес как указатель, а нужно было записать простым адресом.

Благодарю за помощь.

 

Ещё хотел узнать, вы в конце скрипта, в колонке [DISABLE] прописали команду unregistersymbol(*), таким образом вы удалили два ранее созданных registersymbol(_item) и registersymbol(Items)?

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

7 часов назад, Partizan сказал:

Я переделал твой скрипт так как привык делать я.

В данном случае int3 и jmp return в секции newmem не имеют смысла, поскольку выход из инъекции произойдет по ret. Их можно даже не прописывать в newmem.

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

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

Ещё хотел узнать, вы в конце скрипта, в колонке [DISABLE] прописали команду unregistersymbol(*), таким образом вы удалили два ранее созданных registersymbol(_item) и registersymbol(Items)?

Да. Также можно и delloc(*) и всё остальное.

 

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

В данном случае int3 и jmp return в секции newmem не имеют смысла, поскольку выход из инъекции произойдет по ret. Их можно даже не прописывать в newmem.

Это СЕ так создал скрипт а я не обратил внимание. 

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

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

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

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