Перейти к публикации
  • Сейчас на странице   Всего пользователей: 3   (0 пользователей, 3 гостя)

Rooster

Программирование, т. 7

  

536 пользователей проголосовало

У вас нет прав на голосование в этом опросе, или на просмотр результатов опроса. Пожалуйста, войдите или зарегистрируйтесь для голосования в опросе.

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

 

Мб кому интересно будет, код для зощиты жава классов от читэнженов и прочей модификации констант извне

 

import sun.reflect.ConstantPool;
 
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
 
public class PoolChecker extends Thread {
    private static final Map<Class, Integer> map = new HashMap<Class, Integer>();
 
    static {
        addClass(PoolChecker.class);
        //и так далее все классы для защиты
    }
 
    public void run() {
        System.out.println("PoolChecker started");
        for (;;) {
            try {
                recheck();
                Thread.sleep(10000L);
            } catch (RuntimeException e) {
                System.exit(0);
            } catch (InterruptedException ignored) {
                //e.printStackTrace();
            }
        }
    }
 
    private static void addClass(Class cl) {
        map.put(cl, getHash(cl));
    }
 
    public static void recheck() {
        for (Class key : map.keySet()) {
            if (map.get(key) != getHash(key)) {
                System.exit(0);
            }
        }
    }
 
 
    private static int getHash(Class cl) {
        Method getConstantPool;
        try {
            getConstantPool = Class.class.getDeclaredMethod("getConstantPool");
            getConstantPool.setAccessible(true);
        } catch (NoSuchMethodException e) {
            throw new RuntimeException(e);
        }
        int result = 0;
        try {
            ConstantPool constantPool = (ConstantPool) getConstantPool.invoke(cl);
            for (int i = 0; i < constantPool.getSize(); i++) {
                try {
                    int l = Long.valueOf(constantPool.getLongAt(i)).hashCode();
                    result += l;
                } catch (IllegalArgumentException e) {
                    try {
                        int d = Double.valueOf(constantPool.getDoubleAt(i)).hashCode();
                        result += d;
                    } catch (IllegalArgumentException ee) {
                        try {
                            int f = Float.valueOf(constantPool.getFloatAt(i)).hashCode();
                            result += f;
                        } catch (IllegalArgumentException eee) {
                            try {
                                int ii = Integer.valueOf(constantPool.getIntAt(i)).hashCode();
                                result += ii;
                            } catch (IllegalArgumentException eeee) {
 
                            }
                        }
                    }
                }
            }
        } catch (Exception e) {
        }
        return result;
    }
}

 

 

 

Идея не моя, но я её допилил чуток.  :pisubudew:

Поделиться сообщением


Ссылка на сообщение

объясни мне, пожалуйста, кейс когда это может пригодиться?


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение

защитил себя, всю семью и друзей кто программирует на джаве от читенджина

моя жизнь стала чуточку спокойнее

 

но срсли, зачем это нужно, из всех возможных вариантов, в джаве?

Поделиться сообщением


Ссылка на сообщение

защиты много не бывает ежжи


Shaman.png.0cdd33d48561cd068bb3c5ee78289381.png Anna.jpeg.03c9b49363298ceec256500a5d522f7d.jpeg Nigga.jpg.f807f2556bdbf68452292a9301494591.jpg

 

Поделиться сообщением


Ссылка на сообщение

Для этого ты петухом назвался? защита от хейтеров?) Всегда интересно было почему ник такой, не было повода спросить

Поделиться сообщением


Ссылка на сообщение

он забияка или задира


ASCFR.gif

Поделиться сообщением


Ссылка на сообщение

а в джаве константы не константы что ли?

как их вообще можно менять, если их компилятор должен захардкодить везде? Норм кек.

 

или под константами имеются в виду любые числа из типа конфигов?

 

 

 

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

плюс страшно даже подумать, как эта штука медленно будет работать из-за  генерации тысяч эксепшенов при попытке подобрать нужный тип числа  :trollpalm:


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение
(изменено)
как их вообще можно менять, если их компилятор должен захардкодить везде? Норм кек.

Как меняются константы любой проги/игры через читэнжины, артмани, и доступ к памяти.  :hmpalm:  :hmpalm:

Ты что тупой?

85k4oxP.jpg

Ты что про тренеры не слышал, не читерил в играх? В дремучем лесу рос?

 

Для тебя const сразу означает выбивание константы в атомах железа без возможностей изменить её?

 

 

плюс страшно даже подумать, как эта штука медленно будет работать из-за  генерации тысяч эксепшенов при попытке подобрать нужный тип числа  :trollpalm:

Работает в параллельном потоке, асинхронно и  с минимальным приоритетом.

 

 

или изменением данных на нужные до первого запуска чекера

Есть такое, но учитывая что чекер сам может вызывать загрузку классов ты физически не успеешь подменить. 

 

 

удалением тела твоего чекера нахер из файла

Опять же, обфускация + в паре мест проверяется жив ли тред на всякий случай. 

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


Изменено пользователем Index

Поделиться сообщением


Ссылка на сообщение

Для тебя const сразу означает выбивание константы в атомах железа без возможностей изменить её?

ващето зависимо от языка/компилятора у тебя может особо не быть возможности легко поменять const

если её будут хранить в исполняемой памяти (text) а не в куче (куда обычно влезают всякие читенджины) то хуй ты там их так легко поменяешь, особенно если это int-ы

Поделиться сообщением


Ссылка на сообщение
(изменено)
то хуй ты там их так легко поменяешь, особенно если это int-ы

В любом случае мне надо было защитить Майнкрафт от читэнжена  :trollface:  

 

Так что свое дело я сделал.


Изменено пользователем Index

Поделиться сообщением


Ссылка на сообщение

 

за такое дно могут платить х10 от обычных вакансий просто потому, что никто им не хочет заниматься, а надо
 

^this

в одной конторе, человеку, который бы согласился работать и переписывать абап платили как тим лиду фронтэндщику, при том, что язык довольно таки простой, но КРАЙНЕ уебанский

 

 

 

fxd

 

 

REPORT zalv_grid_events.     CLASS lcl_event_handler DEFINITION DEFERRED. " Just to declare the variable 'go_event_handler' before the real class definition   " Declaration of the global variables DATA: gt_sflight TYPE STANDARD TABLE OF sflight, " Table used into ALV to show data gv_error_message TYPE string, " Variable used to get the error message go_alv TYPE REF TO cl_salv_table, " ALV object go_events TYPE REF TO cl_salv_events_table, go_event_handler TYPE REF TO lcl_event_handler, gx_salv_msg TYPE REF TO cx_salv_msg, gx_salv_not_found TYPE REF TO cx_salv_not_found.   *----------------------------------------------------------------------* * CLASS lcl_handle_events DEFINITION *----------------------------------------------------------------------* CLASS lcl_event_handler DEFINITION FINAL. PUBLIC SECTION. METHODS : on_double_click FOR EVENT double_click OF cl_salv_events_table IMPORTING row column. METHODS : on_link_click FOR EVENT link_click OF cl_salv_events_table IMPORTING row column. ENDCLASS. "lcl_handle_events DEFINITION *----------------------------------------------------------------------* * CLASS lcl_handle_events IMPLEMENTATION *----------------------------------------------------------------------* CLASS lcl_event_handler IMPLEMENTATION. METHOD on_double_click. MESSAGE i001(00) WITH 'Double click: column- ' column ' / line- ' row. ENDMETHOD. "on_double_click METHOD on_link_click. MESSAGE i001(00) WITH 'Click on link: column- ' column ' / line- ' row. ENDMETHOD. "on_link_click ENDCLASS. "lcl_handle_events IMPLEMENTATION       START-OF-SELECTION. PERFORM select_data.   END-OF-SELECTION. PERFORM create_alv_object. PERFORM format_columns. PERFORM set_events. PERFORM show_alv.           *&---------------------------------------------------------------------* *& Form SELECT_DATA *&---------------------------------------------------------------------* * Select data to use and show into the ALV *----------------------------------------------------------------------* FORM select_data .   " Select data from DB SELECT * FROM sflight INTO TABLE gt_sflight.  

ENDFORM. " SELECT_DATA


Публикация отключена

Поделиться сообщением


Ссылка на сообщение

 

удалением тела твоего чекера нахер из файла

Опять же, обфускация + в паре мест проверяется жив ли тред на всякий случай. 

 

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

 

Подменой всех getConstantPool на возврат пустой колекции и твоя защита продолжает работать. Как по мне, это всё лишнее.

Поделиться сообщением


Ссылка на сообщение

Для тебя const сразу означает выбивание константы в атомах железа без возможностей изменить её?

в "нормальных" (тм) языках констант НЕ СУЩЕСТВУЕТ после компиляции, они просто хардкодятся в бинарнике, а не помню, чтобы винда просто так давала тебе возможность менять память в сегменте кода

 

хотя учитывая, что это не изначально реальный бинарник, может и возможно

 

но ничто в таком случае не мешает заменить твои константы еще до запуска программы прямо в жарке

 

 

 

 

ну и постоянный выброс исключений это тебе не шутки даже в плюсах, не то что в управляемых языках

пока он сгенерит стектрейс, который еще и никому не нужен, даже твой отдельный поток с минимальным приоритетом сожрет цпу просто нещадно

надо сначала узнавать, что за тип, а потом только тащить, иначе ггвп

или вообще не узнавать тип, в джаве же все числа упакованы, гетхешкод можно вызвать на чем угодно


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

хотя учитывая, что это не изначально реальный бинарник, может и возможно

в джаве вообще нет const вроде, как минимум в 7 и ниже вроде нет

там это static final, так что есть вероятность что оно его может в куче хранить

 

как мы недавно видели на примере List-ов в сшарпе/джаве, не стоит ожидать многого от имплементации этих языков

 

но ничто в таком случае не мешает заменить твои константы еще до запуска программы прямо в жарке

это раз

два, мне интересно какая от этого польза если при этом переменные в куче всё ещё вроде как можно менять

 

хотя в любом случае в качестве примитивной защиты от основной аудитории майнкрафта это вполне эффективно

Поделиться сообщением


Ссылка на сообщение

 

 

Подменой всех getConstantPool на возврат пустой колекции и твоя защита продолжает работать. Как по мне, это всё лишнее.

Рантайм (jre) изолирован в лаунчере, так что метод не подменишь. Плюс ни ты ни я не знаем, не сломает ли это что-нибудь.

 

Плюс офк идет проверка md5 всех модов, либ и тд.


два, мне интересно какая от этого польза если при этом переменные в куче всё ещё вроде как можно менять

 

Не знаю что там можно менять, но малолетние долбоебы которые пытаются себе убавить отдачу ловят закртие игры +  перезагрузку винды ещё  :trollface:

 

Все работает  :nate:

 

 

или вообще не узнавать тип, в джаве же все числа упакованы, гетхешкод можно вызвать на чем угодно

 

А там нет такого варианта, только примитивы, либо филды, либо классы.

 

 

public class ConstantPool {

private Object constantPoolOop;



public ConstantPool() {

}



public int getSize() {

return this.getSize0(this.constantPoolOop);

}



public Class<?> getClassAt(int var1) {

return this.getClassAt0(this.constantPoolOop, var1);

}



public Class<?> getClassAtIfLoaded(int var1) {

return this.getClassAtIfLoaded0(this.constantPoolOop, var1);

}



public Member getMethodAt(int var1) {

return this.getMethodAt0(this.constantPoolOop, var1);

}



public Member getMethodAtIfLoaded(int var1) {

return this.getMethodAtIfLoaded0(this.constantPoolOop, var1);

}



public Field getFieldAt(int var1) {

return this.getFieldAt0(this.constantPoolOop, var1);

}



public Field getFieldAtIfLoaded(int var1) {

return this.getFieldAtIfLoaded0(this.constantPoolOop, var1);

}



public String[] getMemberRefInfoAt(int var1) {

return this.getMemberRefInfoAt0(this.constantPoolOop, var1);

}



public int getIntAt(int var1) {

return this.getIntAt0(this.constantPoolOop, var1);

}



public long getLongAt(int var1) {

return this.getLongAt0(this.constantPoolOop, var1);

}



public float getFloatAt(int var1) {

return this.getFloatAt0(this.constantPoolOop, var1);

}



public double getDoubleAt(int var1) {

return this.getDoubleAt0(this.constantPoolOop, var1);

}



public String getStringAt(int var1) {

return this.getStringAt0(this.constantPoolOop, var1);

}



public String getUTF8At(int var1) {

return this.getUTF8At0(this.constantPoolOop, var1);

}



private native int getSize0(Object var1);



private native Class<?> getClassAt0(Object var1, int var2);



private native Class<?> getClassAtIfLoaded0(Object var1, int var2);



private native Member getMethodAt0(Object var1, int var2);



private native Member getMethodAtIfLoaded0(Object var1, int var2);



private native Field getFieldAt0(Object var1, int var2);



private native Field getFieldAtIfLoaded0(Object var1, int var2);



private native String[] getMemberRefInfoAt0(Object var1, int var2);



private native int getIntAt0(Object var1, int var2);



private native long getLongAt0(Object var1, int var2);



private native float getFloatAt0(Object var1, int var2);



private native double getDoubleAt0(Object var1, int var2);



private native String getStringAt0(Object var1, int var2);



private native String getUTF8At0(Object var1, int var2);



static {

Reflection.registerFieldsToFilter(ConstantPool.class, new String[]{"constantPoolOop"});

}

}

 

 

Поделиться сообщением


Ссылка на сообщение

а, констант то и нет, вот оно что :trollface:

 

 

 

а если дернуть getClassAtIfLoaded у него попросить метод гетхешкода и ему скормить  getFieldAtIfLoaded?

не знаю точно как рефлекшн работает в джаве


Торжество разума в том, чтобы уживаться с теми, у кого этого разума нет. Вольтер.
Чтобы хорошо высыпаться, нужно спать 8 часов в день. И еще столько же ночью.

Поделиться сообщением


Ссылка на сообщение

 

 


+  перезагрузку винды ещё  :trollface:

заодно научит их поменьше запускать чужих бинарников

когда ваннакрипт планируешь добавить в качестве наказания за читерство?  :trollsurprise: 

Поделиться сообщением


Ссылка на сообщение

а, констант то и нет, вот оно что :trollface:

 

 

 

а если дернуть getClassAtIfLoaded у него попросить метод гетхешкода и ему скормить  getFieldAtIfLoaded?

не знаю точно как рефлекшн работает в джаве

Думаю в пуле констант константы в примитивах все же. Ибо native методы. А упаковка происходит выше.

Поделиться сообщением


Ссылка на сообщение

Для этого ты петухом назвался? защита от хейтеров?) Всегда интересно было почему ник такой, не было повода спросить

 

Скажи честно ты хочешь чтобы было как на Украине?


Shaman.png.0cdd33d48561cd068bb3c5ee78289381.png Anna.jpeg.03c9b49363298ceec256500a5d522f7d.jpeg Nigga.jpg.f807f2556bdbf68452292a9301494591.jpg

 

Поделиться сообщением


Ссылка на сообщение

я прально понимаю что читерство на клиенте
типа воллхака


 

очень крутые котейки

RqvSzvr.png


Кому-то пизды дал - нужно сделать скрин обязательно. (с) Solo

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации сообщений.

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