Thread: Discussion DSMX Hacking
View Single Post
Old Dec 13, 2012, 07:22 AM
RW9UAO is offline
Find More Posts by RW9UAO
Registered User
RW9UAO's Avatar
Russian Federation, Kemerovskaya oblast, Kemerovo
Joined Dec 2012
61 Posts
at now, i think, dsmX frequency hopping question is finish.
Code:
#include <stdio.h>
/*
  DSMX channels list for Frequency Shift Hopping
  math by Alexandr Alexandrov
  code by Sergey Gimaev
  some function (like RadioSetFrequency) from Cypress old assember lib for CYRF transivers
  they used in OrangeRX DSM2 6 channel and AR6110 clone receiver
*/
int main(void){
unsigned int manufacturerID = 0x92C65809;//inverted 0x6D39A7F6;
//manufacturerID - это то, что видим в первых 4-х байтах BIND пакета
unsigned int calc;
unsigned int channel;
int c = 0, k, part1 = 8, part2 = 7, part3 = 8, flag = 0;
unsigned char channel_list[23];

    for(k = 0; k < 23; k++){
        channel_list[k] = 0xFF;//init channel list
    }

    calc = manufacturerID;//init randomize function
    do{
        calc *= 0x0019660D;//randomize function
        calc += 0x3C6EF35F;//from wiki, liniux, gcc, etc

        channel = calc >> 8;
        channel = channel % 0x49;

/*1.Если 4-й байт ManID - чётный ( "0" в младшем бите ), то и channel
должен быть таким же чётным ( или нечётным для нечётного 4-го байта ManID ).
Если он не такой - continue  ( генерируем в calc следующее число ).*/
//i need to compare last bit in manufacturerID and last bit in channel for both even/odd
        if((unsigned char)(channel & 1) == (unsigned char)(manufacturerID & 1)){
/*2. Если channel совпадает с каким-либо из уже полученных ранее номеров
каналов в массиве, то continue */
            for(k = 0; k < 23; k++){
                if(channel_list[k] == (channel + 3)){flag = 1; k = 0xFF;}
                else    flag = 0;
            }
            if(flag == 0){
                flag = 1;
/*3. Проверяем, к какому поддиапазону channel относится ( 0..24, 25..48 или 49..72 ).
В начале работы - завести 3 счётчика ( для каждого поддиапазона ) и задать в них 8, 7 и 8
( 7 - в счётчике для поддиапазона 25..48 ).  В каком поддиапазоне channel - проверяем, не 0 ли
уже в соответствующем счётчике. Если 0 - continue*/
                if(channel < 25){
                    if(part1){
                        part1--;
                        flag = 0;
                    }
                }else{
                    if(channel < 49){
                        if(part2){
                            part2--;
                            flag = 0;
                        }
                    }else {
                        if(part3){
                            part3--;
                            flag = 0;
                        }
                    }
                }
                if(flag == 0){
/*Процедура вернёт, потом к этому ещё прибавится 4 ( в отличие от 2 для DSM2 ),
и с этим вызовет RadioSetFrequency, в которой отнимет ещё 1 и запишет в трансивер.*/
//i don`t use Cypress lib, write my self to CYRF. coz i need +3
                    channel_list[c] = channel + 3;//поэтому +3
                    printf ("0x%.2x ", channel + 3);
                    c++;
                }
            }
        }

    }while(c < 23);
    return 7;
}
sorry, coments in code in russian
RW9UAO is offline Find More Posts by RW9UAO
Reply With Quote