Поиск бессмертия в ConterStrike

Тема в разделе "WASM.RESEARCH", создана пользователем je0n, 12 май 2006.

  1. je0n

    je0n Maximus Cesar

    Публикаций:
    0
    Регистрация:
    12 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    Привет, я прочитал статью Мыщъх-а «вечная жизнь в играх своими руками» ну и решил проделать проделанное, только не на Doom legacy, а на ConterStrike. Кто не читал статью расскажу, что там делается. Правда, боюсь, коротко не получиться.

    Я собираюсь увеличить жизни. Включаю игру. Делаю дамп памяти игры с определенным количеством жизней, потом бегаю стреляю, но жизни не теряю. Делаю еще один дапм памяти. Потом теряю некоторое количество жизней и делаю еще один дамп. Потом еще теряю еще чуть-чуть жизней и делаю четвертый дамп памяти.

    В итоге у меня получается 4 дампа. Два дампа с одинаковым количеством жизней и два с другим кол-вом жизней. Далее мне нужно анализировать полученные дампы. То есть я побайтово ищу значения, которые совпадают в первых двух дампах, но отличаются от них в следующих двух. Так я сокращаю работу над поиском нужных значений. Мыщъх написал для этой цели проргамму. Вот её код:


    Код (Text):
    1.  
    2. /*-------------------------------------------------------------------- --------
    3.  *
    4.  *                              сравниватель дампов
    5.  *                              ===================
    6.  * usage:
    7.  *      fck.exe dump_1 dump_2 dump_3 ... dump_n
    8.  *
    9.  * sense:
    10.  *      сравниватель сравнивает дампы и печатает ячейки, которые совпадают
    11.  *      в dump_1 и dump_2, но не совпадают во всех остальных
    12. ---------------------------------------------------------------------- ------*/
    13. #include <stdio.h>
    14.  
    15. #define MAX_DUMPS   0x10            // макс. кол-во поддержиаемых дампов
    16. main(int c, char **v)
    17. {
    18.     int pos=0;
    19.     int a,b,flag;
    20.     FILE* f[MAX_DUMPS];
    21.     unsigned char ch[MAX_DUMPS];
    22.  
    23.     // проверка аргументов
    24.     if (c-- < 4) return printf("-err: need more files\n");
    25.  
    26.     // открываем все файлы
    27.     for (a=0;a<c;a++)
    28.         if (!(f[a]=fopen(v[a+1],"rb"))) return printf("-err: cant open %s\n",v[a+1]);
    29.  
    30.     // печать имен файлов
    31.     printf("raw offset");for (a=1;a<c;a++) printf("\t%s",v[a+1]);
    32.  
    33.     while(1)
    34.     {
    35.         // чтение очередной ячейки из каждого файла
    36.         for(a=0;a<c;a++) if (!fread(&ch[a],1,1,f[a])) return 0; pos++;
    37.  
    38.         // если ячейки двух первых дампов совпадают они отбрасываются
    39.         if (ch[0] - ch[1]) continue;
    40.  
    41.         // поиск совпадающих ячеек во втором и всех последущих дампах
    42.         // (такие ячеки отбрасываются как "левые" и на фиг не нужные)
    43.         for(a=flag=1;a<c;a++) for(b=a;b<c;b++) if ((a-b) && (ch[a]==ch[b])) flag=0;
    44.  
    45.         // печать "правильных" ячеек
    46.         if (flag) for (printf("\n%08Xh:",pos-1),a=1;a<c;a++) printf("\t%02Xh",ch[a]);
    47.     } printf("\n");
    48.  
    49. }
    50.  
    51.  




    Она просто выводит нужные мне значения, а я уже их анализирую. Чтобы сократить поиск я добавляю в эту программу две строчки своего кода, которые ищут разницу между значениями жизней 2,3 и 4 дампов. Ведь сколько же жизней у меня было перед каждым дампом я знаю. Вот, что получается:


    Код (Text):
    1.  
    2. /*-------------------------------------------------------------------- --------
    3.  *
    4.  *                              сравниватель дампов
    5.  *                              ===================
    6.  * usage:
    7.  *      fck.exe dump_1 dump_2 dump_3 ... dump_n
    8.  *
    9.  * sense:
    10.  *      сравниватель сравнивает дампы и печатает ячейки, которые совпадают
    11.  *      в dump_1 и dump_2, но не совпадают во всех остальных
    12. ---------------------------------------------------------------------- ------*/
    13. #include <stdio.h>
    14.  
    15. #define MAX_DUMPS   0x10            // макс. кол-во поддержиаемых дампов
    16. main(int c, char **v)
    17. {
    18.     int pos=0;
    19.     int a,b,flag;
    20.     FILE* f[MAX_DUMPS];
    21.     unsigned char ch[MAX_DUMPS];
    22.  
    23.     // проверка аргументов
    24.     if (c-- < 4) return printf("-err: need more files\n");
    25.  
    26.     // открываем все файлы
    27.     for (a=0;a<c;a++)
    28.         if (!(f[a]=fopen(v[a+1],"rb"))) return printf("-err: cant open %s\n",v[a+1]);
    29.  
    30.     // печать имен файлов
    31.     printf("raw offset");for (a=1;a<c;a++) printf("\t%s",v[a+1]);
    32.  
    33.     while(1)
    34.     {
    35.         // чтение очередной ячейки из каждого файла
    36.         for(a=0;a<c;a++) if (!fread(&ch[a],1,1,f[a])) return 0; pos++;
    37.  
    38.         // если ячейки двух первых дампов совпадают они отбрасываются
    39.         if (ch[0] - ch[1]) continue;
    40.                               if ((ch[1]-ch[2])!=13) continue;
    41.                               if ((ch[2]-ch[3])!=14) continue;
    42.  
    43.         // поиск совпадающих ячеек во втором и всех последущих дампах
    44.         // (такие ячеки отбрасываются как "левые" и на фиг не нужные)
    45.         for(a=flag=1;a<c;a++) for(b=a;b<c;b++) if ((a-b) && (ch[a]==ch[b])) flag=0;
    46.  
    47.         // печать "правильных" ячеек
    48.         if (flag) for (printf("\n%08Xh:",pos-1),a=1;a<c;a++) printf("\t%02Xh",ch[a]);
    49.     } printf("\n");
    50.  
    51. }
    52.  
    53.  




    мои две строчки кода идут после вот этой if (ch[0] - ch[1]) continue;

    13 и 14 это разницы между жизнями между 2 и 3, 3 и 4 дампами. То есть я должен получить смешения тех байтов, которые отвечают за жизни. Я получаю четыре таких смещения. И софтайсом меняю все эти значения прямо в игре, визуально жизни увеличиваются. НО когда я падаю или в меня стреляют то у меня становится, кол-во жизней которое было до изменения этих байтов минус урон, который мне пренесли. Короче, в игре меняются только циферки, которые показывают кол-во жизней, а не сами жизни. Получается, что все эти четыре байта всего лишь тени.



    Вопрос: как же отыскать тот байт, который мне так нужен? По какому закону ещё может изменяться значение этих жизней?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    ArtMoney не пробовал?
     
  3. iamlamer

    iamlamer New Member

    Публикаций:
    0
    Регистрация:
    20 июн 2005
    Сообщения:
    273
    Адрес:
    Russia
    Помнится, в ДОСовские времена был такой замечательный пакет FreeGame, в который входил дампер и сравниватель дампов. В том сравнивателе можно было задавать сложные условия поиска, типа: все ячейки, в которых значение уменьшается на 2, а при этом в соседней ячейке увеличивается на 3. Такой сравниватель и сейчас был бы полезен, ы? :)
     
  4. execoma

    execoma New Member

    Публикаций:
    0
    Регистрация:
    27 май 2005
    Сообщения:
    57
    Насколько я помню в CS защита от АртМани и подобных действий. CS ориентированна по большей части на сетевую игру, поэтому имеет защиту от мухлевательства. Но тем не менее плуги-читы типа виденья сквозь стены есть %).
     
  5. je0n

    je0n Maximus Cesar

    Публикаций:
    0
    Регистрация:
    12 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    ArtMoney я не пробовал, но пробовали мои друзья, у них CS тима. Говорят такая же фигня получается. Только цифры меняются, а сами жизни нет.

    Мне в другом форуме сказали, что тк CS это онлайн игра, то и значения жизней хранятся на сервере.

    Есть какие идеи как добраться до тех значений? Допустим если я сервер.
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    je0n

    Нехорошо в онлайновых играх мухлевать :) Хоть я и сам разрабатываю взломщик игр, но в игровых отношениях с живыми противниками стараюсь быть честным. По идее, если нужен взлом жизней, стоит поискать код отвечающий за "ранение", и попробывать его забить nop'ами. На уровне автомата это кажись реализованно в CheatEngine и TSearch.
     
  7. je0n

    je0n Maximus Cesar

    Публикаций:
    0
    Регистрация:
    12 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    alpet

    ок, поробую поискать код. А что за CheatEngine и TSearch?
     
  8. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Так, мысли вслух: а нельзя ли найти команды, которые непосредственно уменьшают количество жизней, и запатчить их вусмерть, чтобы они больше такого не делали?
     
  9. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    je0n

    Взломщики игр, родом из буржуинии. Содержат (отличительный момент) достаточно функциональные отладчики. Причем CheatEngine может производить поиск по физической памяти (из нулевого кольца). У меня тоже какое-то время был намек на отладчик (в версиях до 2.72 включительно) - позволял находить команды изменяющие найденное число, но никакого дизассемблера и автоматического патча небыло. В будущем возможно и реализую...



    З.Ы. Кстати не перестарайся с патчем - может так получиться, что и опыт (в некоторых играх) не будет расти, и лечиться будет нереально. Хотя как правило, когда я делаю обратную команду (например вместо вычитания, добавление), получается неплохое лечение вместо повреждений.
     
  10. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    В CS (HL) жизни уменьшаются с замедлением

    Там не 100 о где то около 13000 и чем меньше

    с 100 до 70 1 еденица ровна 10

    с 70 до 45 1 еденица равна 20 и тД

    Короче чем меньше жизней тем больше повреждений надо чтоб уменьшить на 1



    Я пользуюсь TSearch в нем есть отладчик и свой скриптовой язык можно код проги править по ходкею а не замораживать значение.

    ищет с помощью DLL инжектную в процесс

    короче лучше и удобней её я невидел



    искать надо на сервере как неизвестное значение

    и давать комманды как изменилось и не изменилось но неизвестно на сколько
     
  11. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    je0n



    А вот такой вопрос: дампер делает дампы стека, стека потоков и выделенной памяти?
     
  12. je0n

    je0n Maximus Cesar

    Публикаций:
    0
    Регистрация:
    12 май 2006
    Сообщения:
    7
    Адрес:
    Russia
    Chingachguk

    Отвечаю, я не понимаю о чем ты. Если ты меня проверяешь, то я бы и так тебе сказал, что я тугой как дуб. :)
     
  13. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Для этого как раз и существует ArtMoney. В версии 7.13 есть возможность искать кодированное значение: то есть вначале делается дамп памяти процесса, затем тебе стреляют в голову, ты сворачиваешь игрульку и отсеиваешь в ArtMoney значения, которые не изменились. И так раз 20 :) Потом по идее ты должен найти закодированное значение жизней.
     
  14. Chingachguk

    Chingachguk New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    340
    je0n



    Да не проверяю я :) И ни в коем разе не хотел глумицца!! Извини если что!



    Смотри: если программа размещает счетчики жизни в стеке или в специально выделенной памяти - дампит ли стек и такую память твой дампер? Ведь это так естественно - при подсоединении игрока выделить под описывающие его структуры кусок памяти (malloc или VirtualAlloc и т.п.).



    А если нет, то получается, что дампится не вся память (=переменные) программы.
     
  15. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    В TSearch находиш адрес потом в отладчике адрес инструкции которая обращается к этой ячейке и правиш её

    В итоге взлом независит от адреса (только этот код может использоватся и для компа)
     
  16. cmd_prompt

    cmd_prompt New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Donetsk
  17. cmd_prompt

    cmd_prompt New Member

    Публикаций:
    0
    Регистрация:
    19 июн 2006
    Сообщения:
    28
    Адрес:
    Ukraine, Donetsk
    Реально можно сделать бессмертие только на серваке, я давненько писал небольшой патчик для 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)

    [​IMG] 1241583628__Tables.zip