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

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

Игра ещё толком не вышла, а я уже читерю ))))

и застрял на простой с первого взгляда проблеме:

Когда ломал метательные ножи, то на запись у меня выскочила функция xor [ecx+4],eax.

Я помню ролик, который делал МастерСН по игре Локи, там тоже ксор был.

Напомните плз что делать чтобы кинжалов стало 10!

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

Ого! Уже вышла... )))

Ты толком напиши, что в регистрах, где расшифрованное и где зашифрованное значение, какой тип данных :) Мне проще готовый ответ дать чем много писать :)

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

Игра уже в понедельник по торрентам ходила...

По теме помоги плз, ибо не добавляются кинжалики мовом (((

Тип данных byte (1 байт, я сам абалдел оО). Ставлю бряк на запись, и у меня только ксор вылетает. Регистры сам понимаешь меняются при перезапуске.

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

Нашёл подвох с кинжалами: значение можно ставить любое, но как только превышает первое значение, то игра вылетает, даже без ошибки. Т.е. скажем было 10 кинжалов, ты выбросил 3, осталось 7, затем изменил в СЕ на 10, и когда кидаешь по одному, то после 3-х кинжалов вылет случается.

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

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

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

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

Приводи точную и чёткую информацию.

Я просил привести тебя значения регистров на инструкции xor [ecx+4],eax - это мимо твоего внимания проходит (как насквозь), как будто я сам с собой разговариваю. Если листинг не приведёшь, тогда это не ко мне.

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

EAX=6FF30060
EBX=6FF30064
ECX=00000000
EDX=00000000
ESI=00030000
EDI=70D50FA8
EBP=04D5FCD8
ESP=04D5FCD0
EIP=009C93C4

Probable base pointer =70D50FA8

009c93b8 - xor esi,[edi+04]
009c93bb - and esi,3fff0000
009c93c1 - xor [edi+04],esi
009c93c4 - pop edi
009c93c5 - pop esi

009c93c1 - xor [edi+04],esi функция которая на бряк вылетает.

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

Отлично, но этого мало.

1. Приведи все дизаассемблерные инструкции выше и ниже входящие в некоторую функцию.

2. Приведи регистры до выполнения 009c93b8 - xor esi,[edi+04] и вновь на 009c93b8 - xor esi,[edi+04]

Если тебе что-то не понятно, то

1) Перед 009c93b8 в отладчике поставь F5.

2) В игре кинь ножь, игра прервётся. Скопируй все регистры.

3) Выполни один раз инструкцию - F7. Скоприуй все регистры.

4) Выдели блок инструкции в дизассембелере CE в который входит 009c93b8 - xor esi,[edi+04]. Этот блок обычно логически отделён мелкими: нопами, нулями, ret-ми. Ну или просто выдели вверх инструкций 50 и в низ инструкций 20 и скопирую сюда.

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

Что значит "Типа припустил" !? Ты сдался ? o_0

Кстати OllyDbg-ом и тем более IDA необходимо научится пользоваться хотя бы на минимуме и только после этого пользоваться отладчиком CE. Там где шифрование (в случае этой игры) удобнее пользоваться OllyDbg, т.к. по интуиции ты сразу увидишь как всё происходит.

Если Акама решил покупать лицензию, то он пропадёт с форума как минимум на трое суток и будет играть и играть всё это время ))))

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

Ну эт врятли, я всё постепенно делаю...

У меня предчувствие что с адресом не то что-то... потому как например если у меня было 7 ножей, а я исправил на 10, то игра всё равно думает что ножей 7, а если восьмой пытаешься кинуть, но игре краш (((

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

Так может происходит по нескольким причинам.

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

2. Каждый нож - это объект, который входит в список коллекции объектов "Нож". Он представляет собой кусок памяти, который создаётся и разрушается при кидании ножка. Так было с патронами в Сталкерах, так было в игре BloodDarknes что-ли, когда там стрелы были как объекты (кто-то года три назад раскричался, что стрелы не взламываемые, дескать стрелы это сам код игры по воле случая создания игры :D )

Если с ножами также, то наверно ты не разберёшься. Я с патронами в СТАЛКЕРЕ разобрался практически не позволяя им уменьшаться, но боллее глубо копать не стал.

Так же могут быть и другие случаи. А узнать "что и как происходит" поможет только хороший отладчик/дизассемблер.

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

Скину в споилер чтоб не засорять пост

[cod]009CA073 - 81 e6 00 00 ff 3f - and esi,3fff0000

009CA079 - 31 77 04 - xor [edi+04],esi

009CA07C - 5f - pop edi

009CA07D - 5e - pop esi

009CA07E - 5d - pop ebp

009CA07F - c2 08 00 - ret 0008

009CA082 - cc - int 3

009CA083 - cc - int 3

009CA084 - cc - int 3

009CA085 - cc - int 3

009CA086 - cc - int 3

009CA087 - cc - int 3

009CA088 - cc - int 3

009CA089 - cc - int 3

009CA08A - cc - int 3

009CA08B - cc - int 3

009CA08C - cc - int 3

009CA08D - cc - int 3

009CA08E - cc - int 3

009CA08F - cc - int 3

009CA090 - 55 - push ebp

009CA091 - 8b ec - mov ebp,esp

009CA093 - 8b 45 08 - mov eax,[ebp+08]

009CA096 - 56 - push esi

009CA097 - 57 - push edi

009CA098 - 8b f9 - mov edi,ecx

009CA09A - 0f b7 77 06 - movzx esi,word ptr [edi+06]

009CA09E - 81 e6 ff 3f 00 00 - and esi,00003fff

009CA0A4 - 8d 48 01 - lea ecx,[eax+01]

009CA0A7 - 3b ce - cmp ecx,esi

009CA0A9 - 73 27 - jae 009ca0d2

009CA0AB - 53 - push ebx

009CA0AC - 8b 17 - mov edx,[edi]

009CA0AE - 8b de - mov ebx,esi

009CA0B0 - 2b d8 - sub ebx,eax

009CA0B2 - 83 eb 01 - sub ebx,01

009CA0B5 - 0f af 5d 0c - imul ebx,[ebp+0c]

009CA0B9 - 53 - push ebx

009CA0BA - 8b 5d 0c - mov ebx,[ebp+0c]

009CA0BD - 0f af cb - imul ecx,ebx

009CA0C0 - 0f af c3 - imul eax,ebx

009CA0C3 - 03 ca - add ecx,edx

009CA0C5 - 51 - push ecx

009CA0C6 - 03 c2 - add eax,edx

009CA0C8 - 50 - push eax

009CA0C9 - e8 12 ea 24 00 - call 00c18ae0

009CA0CE - 83 c4 0c - add esp,0c

009CA0D1 - 5b - pop ebx

009CA0D2 - 83 c6 ff - add esi,ff

009CA0D5 - c1 e6 10 - shl esi,10

009CA0D8 - 33 77 04 - xor esi,[edi+04]

009CA0DB - 81 e6 00 00 ff 3f - and esi,3fff0000

009CA0E1 - 31 77 04 - xor [edi+04],esi

009CA0E4 - 5f - pop edi

009CA0E5 - 5e - pop esi

009CA0E6 - 5d - pop ebp

009CA0E7 - c2 08 00 - ret 0008

009CA0EA - cc - int 3

009CA0EB - cc - int 3

009CA0EC - cc - int 3

009CA0ED - cc - int 3

009CA0EE - cc - int 3

009CA0EF - cc - int 3

009CA0F0 - 55 - push ebp

009CA0F1 - 8b ec - mov ebp,esp

009CA0F3 - 8b 45 08 - mov eax,[ebp+08]

009CA0F6 - 56 - push esi

009CA0F7 - 8b f1 - mov esi,ecx

009CA0F9 - 57 - push edi

009CA0FA - 8b 7e 04 - mov edi,[esi+04]

009CA0FD - 8d 48 01 - lea ecx,[eax+01]

009CA100 - 3b cf - cmp ecx,edi[/cod]

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

У меня голова сонная, может у кого посветлее и кто-то сможет разобраться. Вот вариант на C переданой функции, которую Акама привёл на асме.

Сама функция

[cod]int __fastcall sub_9CA090(int a1, int a2, int a3, int a4, int a5)

{

int result; // eax@1

int v4; // edi@1

int v5; // esi@1

result = a4;

v4 = a3;

v5 = *(_WORD *)(a3 + 6) & 0x3FFF;

/*

"если у меня было 7 ножей, а я исправил на 10, то игра всё равно думает что ножей 7,

а если восьмой пытаешься кинуть, то игре краш" (Akama ©)

Возможно здесь идёт проверка и будет закрытие игры внутри vС18AE0

*/

if ( a4 + 1 < (unsigned int)v5 )

result = vС18AE0(*(_DWORD *)a3 + a5 * a4, *(_DWORD *)a3 + a5 * (a4 + 1), a5 * (v5 - a4 - 1));

*(_DWORD *)(v4 + 4) ^= (*(_DWORD *)(v4 + 4) ^ ((v5 - 1) << 16)) & 0x3FFF0000;

return result;

}[/cod]

Она же на асме

[cod]009CA090 - 55 - push ebp

009CA091 - 8b ec - mov ebp,esp

009CA093 - 8b 45 08 - mov eax,[ebp+08]

009CA096 - 56 - push esi

009CA097 - 57 - push edi

009CA098 - 8b f9 - mov edi,ecx

009CA09A - 0f b7 77 06 - movzx esi,word ptr [edi+06]

009CA09E - 81 e6 ff 3f 00 00 - and esi,00003fff

009CA0A4 - 8d 48 01 - lea ecx,[eax+01]

009CA0A7 - 3b ce - cmp ecx,esi

009CA0A9 - 73 27 - jae 009ca0d2

009CA0AB - 53 - push ebx

009CA0AC - 8b 17 - mov edx,[edi]

009CA0AE - 8b de - mov ebx,esi

009CA0B0 - 2b d8 - sub ebx,eax

009CA0B2 - 83 eb 01 - sub ebx,01

009CA0B5 - 0f af 5d 0c - imul ebx,[ebp+0c]

009CA0B9 - 53 - push ebx

009CA0BA - 8b 5d 0c - mov ebx,[ebp+0c]

009CA0BD - 0f af cb - imul ecx,ebx

009CA0C0 - 0f af c3 - imul eax,ebx

009CA0C3 - 03 ca - add ecx,edx

009CA0C5 - 51 - push ecx

009CA0C6 - 03 c2 - add eax,edx

009CA0C8 - 50 - push eax

009CA0C9 - e8 12 ea 24 00 - call 00c18ae0

009CA0CE - 83 c4 0c - add esp,0c

009CA0D1 - 5b - pop ebx

009CA0D2 - 83 c6 ff - add esi,ff

009CA0D5 - c1 e6 10 - shl esi,10

009CA0D8 - 33 77 04 - xor esi,[edi+04]

009CA0DB - 81 e6 00 00 ff 3f - and esi,3fff0000

009CA0E1 - 31 77 04 - xor [edi+04],esi << здесь у Акама был бряк

EAX=6FF30060

EBX=6FF30064

ECX=00000000

EDX=00000000

ESI=00030000

EDI=70D50FA8

EBP=04D5FCD8

ESP=04D5FCD0

EIP=009C93C4

009CA0E4 - 5f - pop edi

009CA0E5 - 5e - pop esi

009CA0E6 - 5d - pop ebp

009CA0E7 - c2 08 00 - ret 0008[/cod]

Акама если не лень, приведи ещё инструкции с адреса "00c18ae0", он может быть другим. Можешь сориентироваться по строчке своего кода.

009CA0C9 - e8 12 ea 24 00 - call 00c18ae0

Например, тут нужно прыгнуть на адрес 00c18ae0 и привести от него все инструкции до конца функции. Надеюсь ты понял как визуально определить функцию по тому как я её вытащил из твоего примера.

------------------------------------

Если попытаться всё упростить, добавив лишнюю переменную T

T = ?; // не известно чему равно

M = ((B ^ C) & 0x3FFF0000);

A = T ^ M

A = 0x30000 (зашифрованное кол-во кинжалов)

Пытаемся развернуть:

T = A ^ M = A ^ ( ((B ^ C) & 0x3FFF0000) ) // отсюда можно узнать B зная C и T, или C зная B и T.

B = A ^ T = A ^ "?"

Причём знак вопроса можно углядеть из регистров в отладке.

Короче мне надо знать чему равен знак вопроса и чему равны B и C, что из них константа (сейчас я этого не могу увидеть). В общем я без отладчика как без рук. Надо качать игру :) а мне сейчас не до этого.

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

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

Я кретин ))))

Вместо того чтобы поставить на доступ, я поставил на запись бряк, а на доступ дохрена полезного выскочило. В общем кинжалы я и без ксора сделал. Извени что напряг :-[

Осталось здоровье ломануть и узнаваимость...

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

00C18AE0 - 55 - push ebp

Вот то что ты просил...

Вряд ли, функция состоит из одной инструкции, даже ret-а нет.

Я заметил, что тебе не хватает знаний для самостоятельного анализирования. Вот статьи с примерами как работать с OllyDbg. При обмане игр эти знания всегда будут кстати. Кваз уже прочитал некоторые (наверно), что и всем советую. Мне терпения прочитать хватило только 17 , а остальные - быстро пролистать (надо заставить себя и прочитать всё-таки все, когда будет время). Именно по ним я научился ставить брейкпоинты на сообщения. Например, на сообщения клика мышки по кнопке применения заклинаний, что позволило мне заострить внимание на нужной ветки кода в Дисайплс 3 и помогло мне сделать чит на запрет отмены заклинаний.

Также хороший приём что-то узнать - это в OllyDbg по ветке кода делать условные прыжки безусловными или наоборот - нопить их. Так я сделал относительную невидимость в ManHunt 2, но с ней всё-таки так и не смог разобраться до конца - главному герою нужно отойти пешком сторону, чтобы враги его потеряли (Лив, уже опробовал :) )

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

В общем странно получилось. Как только я ломанул деньги, то всё остальное стало 99, с том числе и ножи оО.

Денег то много, но как-то странно...

Осталось жизни ломануть и всё.

Подскажите плз каким типом данных может быть здоровье?

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

Каким угодно.. там как здоровье отображается - кровь на экране поди и всё?

В других темах уже писали варианты. В игре Operation flashpoint и гонках Flatout 2 (в гонках правда полоска была) это был тип float от 0.0 до 1.0 (1 = смерть). В других играх было целое число

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

Не, там квадратики. Чем лучше броня, тем больше квадратиков. Причём квадратики уменьшаются в размерах при ударе. То есть наверно надо засеч на сколько один квадратик прочнее, а потом помножить на общее число квадратов.

Если найду то скрин предоставлю...

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

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

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

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