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

Помогите найти многоуровневый указатель через Auto Assembler


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

В общем, есть игра(Plants vs Zombies) и я хочу найти указатели на солнышки, но не все так просто если просто искать многоуровневый указатель типа game.exe+F+256+B8 то можно сказать это сделать невозможно %)   их там УЙМА! Делал я как-то очень давно скрипт для игры Starbound и находил там указатели через этот самый AA скрипт, но с этой игрой что-то не катит хотя схема везде одинаковая.

 

Вот кусочек кода для Starbound:

alloc(newmem,1024)registersymbol(newmem)aobscan(money, 8B 01 89 E5 8B 51 04 5D C3 8D B6 00 00 00 00 55 89 E5 8B 45 08 8B 55 0C 5D 01 01 11 51 04 C2 08)label(_money)registersymbol(_money)label(money_addr)label(money_exit) newmem:dd 0 money_addr:mov [newmem],ecxmov eax,[ecx]mov ebp,espmov edx,[ecx+04]jmp money_exit money:_money:jmp money_addrdb 90 90money_exit:
После этого добавляем адрес в CE и вводим newmem со смещением 0, вот мы и нашли указатель, он работает после включения скрипта, как я понял он перемещает значение ecx в переменную newmem.

 

Но с PvZ такое не прокатило просто не видит никакой адрес, хотя сделал все аналогично.

 

Подскажите в чем проблема, заранее спасибо!

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

У меня есть 2 подобных, пробовал по разному:

1)

2)

NullAlex: настоятельно рекомендую прочитать про тег кода, в соответствующем FAQ

[ENABLE]aobscan(addmoneyaob, 01 88 ?? ?? ?? ?? 8B 88 ?? ?? ?? ?? 83 EC 0C 81 F9)  //0041E6E0label(_addmoney)registersymbol(_addmoney)label(addmoney_addr)label(return1)alloc(newmem,2048)registersymbol(newmem)aobscan(movmoneyaob, 89 B7 ?? ?? ?? ?? B0 01 5E C3 8B 8F ?? ?? ?? ??)  //0041E846label(_movmoney)registersymbol(_movmoney)label(movmoney_addr)label(return2) newmem:dd 0 0 addmoney_addr:mov [newmem+8],eaxadd [eax+00005578],ecxjmp return1 movmoney_addr:mov [newmem+11],esimov [edi+00005578],esijmp return2 addmoneyaob:_addmoney:jmp addmoney_addrnopreturn1: movmoneyaob:_movmoney:jmp movmoney_addrnopreturn2: [DISABLE]_addmoney:add [eax+00005578],ecx _movmoney:mov [edi+00005578],esi dealloc(newmem)dealloc(newmem)unregistersymbol(_addmoney)unregistersymbol(_movmoney)unregistersymbol(newmem)
[ENABLE]aobscan(addmoneyaob, 01 88 ?? ?? ?? ?? 8B 88 ?? ?? ?? ?? 83 EC 0C 81 F9)  //0041E6E0label(_addmoney)registersymbol(_addmoney)label(return1)alloc(newmem,1024)registersymbol(newmem)aobscan(movmoneyaob, 89 B7 ?? ?? ?? ?? B0 01 5E C3 8B 8F ?? ?? ?? ??)  //0041E846label(_movmoney)registersymbol(_movmoney)label(return2)  addmoneyaob:_addmoney:jmp newmemnopreturn1: newmem:mov [newmem],ecxadd [eax+00005578],ecxjmp return1 movmoneyaob:_movmoney:jmp newmem+11nopreturn2: newmem+11:mov [newmem+11],edimov [edi+00005578],esijmp return2  [DISABLE]_addmoney:add [eax+00005578],ecx _movmoney:mov [edi+00005578],esi dealloc(newmem)unregistersymbol(_addmoney)unregistersymbol(_movmoney)unregistersymbol(newmem)
Изменено пользователем NullAlex
Ссылка на комментарий
Поделиться на другие сайты

Если ты хочешь читать нужное значение, то попробуй так и добавь указатель с адресом pMoney и оффсет 5578.

[ENABLE]alloc(newmem,256)label(returnhere)label(originalcode)aobscan(addmoneyaob, 01 88 ?? ?? ?? ?? 8B 88 ?? ?? ?? ?? 83 EC 0C 81 F9)  //0041E6E0label(_addmoney)registersymbol(_addmoney)globalalloc(pMoney,8)newmem:mov [pMoney],eaxoriginalcode:add [eax+00005578],ecxjmp returnherepMoney:dd 0addmoneyaob:_addmoney:jmp newmemnopreturnhere:[DISABLE]_addmoney:add [eax+00005578],ecxdealloc(newmem)dealloc(pMoney)unregistersymbol(_addmoney)//Alt: db 48 8D 64 24 D8
  • Плюс 1
Ссылка на комментарий
Поделиться на другие сайты

Если ты хочешь читать нужное значение, то попробуй так и добавь указатель с адресом pMoney и оффсет 5578.

Спасибо большое! Заработало! Получается дело всего лишь в globalalloc ? А чем она вообще отличается от alloc ? Изменено пользователем NullAlex
Ссылка на комментарий
Поделиться на другие сайты

Такс, возникла точно такая же проблема в Assassins Creed Revelations

Опять же сделал аналогичный скрипт

[ENABLE]globalalloc(pMoneysell,8)alloc(newmem,256)aobscan(moneyaob,89 4E 0C 5E 5D C2 ?? ?? CC CC CC CC CC CC CC CC CC 55 8B EC 8B 41 0C)  //01F3D9FFlabel(exit1)label(_money)registersymbol(_money) newmem:mov [pMoneysell],esimov [esi+0C],ecxpop esipop ebpjmp exit1 moneyaob:_money:jmp newmemexit1: pMoneysell:dd 0 [DISABLE]_money:mov [esi+0C],ecxpop esipop ebp  dealloc(newmem)dealloc(pMoneysell)unregistersymbol(_money)

Например значение денег = 1200, а pMoneysell + 0C = 10000.

Вроде записываю в pMoneysell ту переменную.

Например если записать :

mov [esi+0C],#5000

То значение денег станет 5000. Подскажите как быть  O-=

 

Вот снимок отладчика если нужно может там где-нибудь защита:

SnimokJPG_6023657_16475950.jpg

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

Попробуй так.

[ENABLE]globalalloc(pMoneysell,8)alloc(newmem,256)aobscan(moneyaob,89 4E 0C 5E 5D C2 ?? ?? CC CC CC CC CC CC CC CC CC 55 8B EC 8B 41 0C)  //01F3D9FFlabel(exit1)label(_money)registersymbol(_money) newmem:mov [pMoneysell],esimov [esi+0C],ecxpop esipop ebpjmp exit1 pMoneysell:dd 0moneyaob:_money:jmp newmemexit1: [DISABLE]_money:mov [esi+0C],ecxpop esipop ebp dealloc(newmem)dealloc(pMoneysell)unregistersymbol(_money)
Ссылка на комментарий
Поделиться на другие сайты

Попробуй так.

Хорошо, как попробую отпишусь. А разница то какая?

Местами просто поменял, от этого что-то зависит? o_0

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

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

Если сделать как ты, то будет краш игры.

Ну я так уже делал, и никакого краша небыло, просто находился неправильный адрес.

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

 А разница то какая?

Разница есть. У тебя объявление переменной находится на выходе из кода, у ARM4ND0 переменная объявляется вне кода, как и метки.

Ты кстати попробовал код  ARM4ND0?

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

Проверил скрипт, все то же самое, находится адрес(esi+0C) и он = 10000.

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

 

Так что может и тебе нужно поискать фильтр.

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

Может быть, я не совсем правильно понял вопрос. Есть игра, в ней есть некоторое значение, адрес которого нужно найти скриптом, а не указателем. Сначала я удивился, что не ищутся указатели. Ищутся, пусть их и много. Это еще не самый крутой пример и уровней вложенности, если я правильно помню, всего три. Потом я написал скрипт, который приведу чуть ниже. Взял адрес, поставил на него брейкпоинт на чтение, отладчик выдал мне две инструкции. Выбрал первую. Дальше скрипт:
 
[ENABLE]aobscanmodule(INJECT,PlantsVsZombies.exe,03 82 * * * * 39 44 24 * 0F 9E C0 C2 04 00)alloc(newmem,$1000)registersymbol(INJECT)globalalloc(addr_suns,4)newmem:    ADD  EAX,[EDX+00005578] // Оригинальная инструкция    PUSH EAX                // Сохраняем регистр EAX в стеке    LEA  EAX,[EDX+5578]     // Загружаем в него адрес нужного нам значения    MOV  [addr_suns],EAX    // Кладем его в переменную    POP  EAX                // Восстанавливаем регистр EAX    RET                     // И выходимINJECT:    CALL newmem    NOP[DISABLE]INJECT:    db 03 82 78 55 00 00    unregistersymbol(INJECT)    dealloc(newmem)    dealloc(addr_suns)

Остается только включить скрипт и добавить в список адресов адрес addr_suns.

 
Xipho: название спойлера теперь обязательно, иначе он "поломается"
Ссылка на комментарий
Поделиться на другие сайты

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

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

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