Привет, я прочитал статью Мыщъх-а «вечная жизнь в играх своими руками» ну и решил проделать проделанное, только не на Doom legacy, а на ConterStrike. Кто не читал статью расскажу, что там делается. Правда, боюсь, коротко не получиться. Я собираюсь увеличить жизни. Включаю игру. Делаю дамп памяти игры с определенным количеством жизней, потом бегаю стреляю, но жизни не теряю. Делаю еще один дапм памяти. Потом теряю некоторое количество жизней и делаю еще один дамп. Потом еще теряю еще чуть-чуть жизней и делаю четвертый дамп памяти. В итоге у меня получается 4 дампа. Два дампа с одинаковым количеством жизней и два с другим кол-вом жизней. Далее мне нужно анализировать полученные дампы. То есть я побайтово ищу значения, которые совпадают в первых двух дампах, но отличаются от них в следующих двух. Так я сокращаю работу над поиском нужных значений. Мыщъх написал для этой цели проргамму. Вот её код: Код (Text): /*-------------------------------------------------------------------- -------- * * сравниватель дампов * =================== * usage: * fck.exe dump_1 dump_2 dump_3 ... dump_n * * sense: * сравниватель сравнивает дампы и печатает ячейки, которые совпадают * в dump_1 и dump_2, но не совпадают во всех остальных ---------------------------------------------------------------------- ------*/ #include <stdio.h> #define MAX_DUMPS 0x10 // макс. кол-во поддержиаемых дампов main(int c, char **v) { int pos=0; int a,b,flag; FILE* f[MAX_DUMPS]; unsigned char ch[MAX_DUMPS]; // проверка аргументов if (c-- < 4) return printf("-err: need more files\n"); // открываем все файлы for (a=0;a<c;a++) if (!(f[a]=fopen(v[a+1],"rb"))) return printf("-err: cant open %s\n",v[a+1]); // печать имен файлов printf("raw offset");for (a=1;a<c;a++) printf("\t%s",v[a+1]); while(1) { // чтение очередной ячейки из каждого файла for(a=0;a<c;a++) if (!fread(&ch[a],1,1,f[a])) return 0; pos++; // если ячейки двух первых дампов совпадают они отбрасываются if (ch[0] - ch[1]) continue; // поиск совпадающих ячеек во втором и всех последущих дампах // (такие ячеки отбрасываются как "левые" и на фиг не нужные) for(a=flag=1;a<c;a++) for(b=a;b<c;b++) if ((a-b) && (ch[a]==ch[b])) flag=0; // печать "правильных" ячеек if (flag) for (printf("\n%08Xh:",pos-1),a=1;a<c;a++) printf("\t%02Xh",ch[a]); } printf("\n"); } Она просто выводит нужные мне значения, а я уже их анализирую. Чтобы сократить поиск я добавляю в эту программу две строчки своего кода, которые ищут разницу между значениями жизней 2,3 и 4 дампов. Ведь сколько же жизней у меня было перед каждым дампом я знаю. Вот, что получается: Код (Text): /*-------------------------------------------------------------------- -------- * * сравниватель дампов * =================== * usage: * fck.exe dump_1 dump_2 dump_3 ... dump_n * * sense: * сравниватель сравнивает дампы и печатает ячейки, которые совпадают * в dump_1 и dump_2, но не совпадают во всех остальных ---------------------------------------------------------------------- ------*/ #include <stdio.h> #define MAX_DUMPS 0x10 // макс. кол-во поддержиаемых дампов main(int c, char **v) { int pos=0; int a,b,flag; FILE* f[MAX_DUMPS]; unsigned char ch[MAX_DUMPS]; // проверка аргументов if (c-- < 4) return printf("-err: need more files\n"); // открываем все файлы for (a=0;a<c;a++) if (!(f[a]=fopen(v[a+1],"rb"))) return printf("-err: cant open %s\n",v[a+1]); // печать имен файлов printf("raw offset");for (a=1;a<c;a++) printf("\t%s",v[a+1]); while(1) { // чтение очередной ячейки из каждого файла for(a=0;a<c;a++) if (!fread(&ch[a],1,1,f[a])) return 0; pos++; // если ячейки двух первых дампов совпадают они отбрасываются if (ch[0] - ch[1]) continue; if ((ch[1]-ch[2])!=13) continue; if ((ch[2]-ch[3])!=14) continue; // поиск совпадающих ячеек во втором и всех последущих дампах // (такие ячеки отбрасываются как "левые" и на фиг не нужные) for(a=flag=1;a<c;a++) for(b=a;b<c;b++) if ((a-b) && (ch[a]==ch[b])) flag=0; // печать "правильных" ячеек if (flag) for (printf("\n%08Xh:",pos-1),a=1;a<c;a++) printf("\t%02Xh",ch[a]); } printf("\n"); } мои две строчки кода идут после вот этой if (ch[0] - ch[1]) continue; 13 и 14 это разницы между жизнями между 2 и 3, 3 и 4 дампами. То есть я должен получить смешения тех байтов, которые отвечают за жизни. Я получаю четыре таких смещения. И софтайсом меняю все эти значения прямо в игре, визуально жизни увеличиваются. НО когда я падаю или в меня стреляют то у меня становится, кол-во жизней которое было до изменения этих байтов минус урон, который мне пренесли. Короче, в игре меняются только циферки, которые показывают кол-во жизней, а не сами жизни. Получается, что все эти четыре байта всего лишь тени. Вопрос: как же отыскать тот байт, который мне так нужен? По какому закону ещё может изменяться значение этих жизней?
Помнится, в ДОСовские времена был такой замечательный пакет FreeGame, в который входил дампер и сравниватель дампов. В том сравнивателе можно было задавать сложные условия поиска, типа: все ячейки, в которых значение уменьшается на 2, а при этом в соседней ячейке увеличивается на 3. Такой сравниватель и сейчас был бы полезен, ы?
Насколько я помню в CS защита от АртМани и подобных действий. CS ориентированна по большей части на сетевую игру, поэтому имеет защиту от мухлевательства. Но тем не менее плуги-читы типа виденья сквозь стены есть %).
ArtMoney я не пробовал, но пробовали мои друзья, у них CS тима. Говорят такая же фигня получается. Только цифры меняются, а сами жизни нет. Мне в другом форуме сказали, что тк CS это онлайн игра, то и значения жизней хранятся на сервере. Есть какие идеи как добраться до тех значений? Допустим если я сервер.
je0n Нехорошо в онлайновых играх мухлевать Хоть я и сам разрабатываю взломщик игр, но в игровых отношениях с живыми противниками стараюсь быть честным. По идее, если нужен взлом жизней, стоит поискать код отвечающий за "ранение", и попробывать его забить nop'ами. На уровне автомата это кажись реализованно в CheatEngine и TSearch.
Так, мысли вслух: а нельзя ли найти команды, которые непосредственно уменьшают количество жизней, и запатчить их вусмерть, чтобы они больше такого не делали?
je0n Взломщики игр, родом из буржуинии. Содержат (отличительный момент) достаточно функциональные отладчики. Причем CheatEngine может производить поиск по физической памяти (из нулевого кольца). У меня тоже какое-то время был намек на отладчик (в версиях до 2.72 включительно) - позволял находить команды изменяющие найденное число, но никакого дизассемблера и автоматического патча небыло. В будущем возможно и реализую... З.Ы. Кстати не перестарайся с патчем - может так получиться, что и опыт (в некоторых играх) не будет расти, и лечиться будет нереально. Хотя как правило, когда я делаю обратную команду (например вместо вычитания, добавление), получается неплохое лечение вместо повреждений.
В CS (HL) жизни уменьшаются с замедлением Там не 100 о где то около 13000 и чем меньше с 100 до 70 1 еденица ровна 10 с 70 до 45 1 еденица равна 20 и тД Короче чем меньше жизней тем больше повреждений надо чтоб уменьшить на 1 Я пользуюсь TSearch в нем есть отладчик и свой скриптовой язык можно код проги править по ходкею а не замораживать значение. ищет с помощью DLL инжектную в процесс короче лучше и удобней её я невидел искать надо на сервере как неизвестное значение и давать комманды как изменилось и не изменилось но неизвестно на сколько
Chingachguk Отвечаю, я не понимаю о чем ты. Если ты меня проверяешь, то я бы и так тебе сказал, что я тугой как дуб.
Для этого как раз и существует ArtMoney. В версии 7.13 есть возможность искать кодированное значение: то есть вначале делается дамп памяти процесса, затем тебе стреляют в голову, ты сворачиваешь игрульку и отсеиваешь в ArtMoney значения, которые не изменились. И так раз 20 Потом по идее ты должен найти закодированное значение жизней.
je0n Да не проверяю я И ни в коем разе не хотел глумицца!! Извини если что! Смотри: если программа размещает счетчики жизни в стеке или в специально выделенной памяти - дампит ли стек и такую память твой дампер? Ведь это так естественно - при подсоединении игрока выделить под описывающие его структуры кусок памяти (malloc или VirtualAlloc и т.п.). А если нет, то получается, что дампится не вся память (=переменные) программы.
В TSearch находиш адрес потом в отладчике адрес инструкции которая обращается к этой ячейке и правиш её В итоге взлом независит от адреса (только этот код может использоватся и для компа)
Реально можно сделать бессмертие только на серваке, я давненько писал небольшой патчик для CS 1.6, который перехватывал процедуру уменьшения жизни, по адресу переменной жизни вычислял номер игрока, проверял его ник, и если он совпадал с требуемым, просто перепрыгивал пару строчек кода (эта процедура находится в библиотеке mp.dll). Жизни там в формате Real4, ищется ArtMoney элементарно, просто выбираем тип искомого значения "с точкой 4 байта", если у нас 100% жизней, ищем точное значение 100, если меньше ищем диапазон значений от life-1 до life+1. Находим адрес жизни, потом в Soft Ice ставим bpm <addr> w на него и nop'им найденную строчку в итоге - все бессмертные. Я вместо nop'ов делал дальний jump в конец dll'ки и там добавлял код проверки ника. Если ещё будут вопросы, пишите на мыло. Вот вам таблички для ArtMoney 6.26 на жизни для CS 1.1, 1.5 (PODBot), 1.6 (Z-Bot) 1241583628__Tables.zip