#include <unistd.h>
#include <sys/socket.h>
#include <stdio.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>
#include <stdlib.h>
#include <fcntl.h>
#include <netdb.h>
#include <time.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/signal.h>
#include <dirent.h>
#include <ctype.h>
#include <netdb.h>
void strip (char *s)
{
while (*s && ((s [strlen (s)-1] == '\n') || (s [strlen (s)-1] == '\r')))
s [strlen (s)-1] = 0 ;
}
char getbin (char *hexstr)
{
unsigned char c1,c2 ;
unsigned char x ;
c1 = (unsigned char) *hexstr ;
if ((c1 >= '0') && (c1 <= '9'))
{
c1 -= '0' ;
x = c1 * 16 ;
}
else
{
c1 = tolower (c1) ;
c1 -= 'a' ;
x = (c1+10) * 16 ;
}
hexstr++ ;
c2 = (unsigned char) *hexstr ;
if ((c2 >= '0') && (c2 <= '9'))
{
c2 -= '0' ;
x += c2 ;
}
else
{
c2 = tolower (c2) ;
c2 -= 'a' ;
x += (c2+10) ;
}
return ((char) x) ;
}
char *getbinstr (char *buf,int *len,char *b)
{
char *ptr ;
int i ;
*len = strlen (buf) / 2 ;
ptr = buf ;
for (i = 0 ; i < *len ; i++)
{
b [i] = getbin (ptr) ;
ptr += 2 ;
}
return (b) ;
}
void oscamstyle (char *emm,char *serial,char *buf)
{
unsigned char b ;
b = (unsigned char) getbin (emm+4) ;
b += 4 ;
sprintf (buf,"8270%2.2x%2.2s%s%s",b,emm+6,serial,emm+8) ;
}
unsigned char uc (char b)
{
return ((unsigned char) b) ;
}
unsigned char *gethex (unsigned char c,char *buf)
{
unsigned char i1,i2 ;
char *b ;
b = buf ;
i1 = c / 16 ;
i2 = c - (i1 * 16) ;
if (i1 < 10)
*buf = '0' + i1 ;
else
*buf = 'a' + (i1-10) ;
buf++ ;
if (i2 < 10)
*buf = '0' + i2 ;
else
*buf = 'a' + (i2-10) ;
return ((unsigned char *) b) ;
}
char *gethexstr (unsigned char *data,int len,char *buf)
{
char *ptr ;
ptr = buf ;
while (len)
{
gethex (*data,ptr) ;
data++ ;
len-- ;
ptr += 2 ;
}
*ptr = '\n' ;
*(ptr+1) = 0 ;
return (buf) ;
}
void subemm (char *bin,int geslen,int subnum,char *ser)
{
int sublen,nextsubnum ;
char *thissub,emm [1000],hexbuf [1000],nextboxid [1000],ebuf [1000] ;
emm [0] = (8*16)+2 ;
emm [1] = 7*16 ;
emm [3] = (4*16)+1 ;
memcpy (emm+4,ser,4) ;
emm [8] = 2 ;
emm [9] = 0 ;
emm [11] = 9*16 ;
printf ("subemms :\n") ;
while ((geslen > 0) && ((geslen - (uc (*bin)+1)) >= 0))
{
sublen = uc (*bin) ;
geslen -= sublen + 8 ;
thissub = bin + 1 ;
nextsubnum = *(bin+sublen+1) ;
memcpy (hexbuf,bin+sublen+2,4) ;
gethexstr ((unsigned char *) hexbuf,4,nextboxid) ;
nextboxid [strlen (nextboxid)-1] = 0 ;
bin += sublen + 8 ;
emm [12] = sublen ;
emm [10] = sublen+2 ;
emm [2] = sublen+10 ;
memcpy (emm+13,thissub,sublen) ;
gethexstr ((unsigned char *) emm,sublen+13,hexbuf) ;
printf ("SUBEMM-%d->UNIQUE : %s\n",subnum,hexbuf) ;
subnum = nextsubnum ;
}
}
void print07 (char *bin,int len)
{
int emmlenges,subnum ;
char boxbin [1000],boxid [1000],bout [10] ;
unsigned char b ;
if (len != uc (bin [2]) + 3)
{
printf ("FEHLER : emm länge falsch\n") ;
return ;
}
if (uc (bin [3]) != (4*16)+1)
{
printf ("FEHLER : falscher emmtyp\n") ;
return ;
}
if (uc (bin [8]) != 7)
{
printf ("FEHLER : unknown emm erwartet.\n") ;
return ;
}
emmlenges = uc (bin [9]) ;
if (memcmp (bin+12,bin+4,4))
memcpy (bin+12,bin+4,4) ;
subnum = uc (bin [19]) ;
memcpy (boxbin,&(bin [20]),4) ;
gethexstr ((unsigned char *) boxbin,4,boxid) ;
boxid [strlen (boxid)-1] = 0 ;
b = (unsigned char) getbin (boxid) ;
b += 8*16 ;
gethex (b,bout) ;
*boxid = *bout ;
printf ("BOXID in unknown emm : %s\n",boxid) ;
subemm (bin+26,emmlenges-(26-9),subnum,bin+4) ;
}
int main (int argc,char **argv)
{
FILE *f ;
int et,fake,len,t2 ;
char buf [1000],*emm,newbuf [1000],serial [20],b ;
unsigned char l,t ;
if (argc != 2)
{
printf ("aufruf : %s <pfad und dateiname vom emmfile>\n",argv [0]) ;
return (0) ;
}
if (!(f = fopen (argv [1],"r")))
{
printf ("fehler : kann file %s nicht öffnen\n",argv [1]) ;
return (0) ;
}
*serial = 0 ;
while (fgets (buf,999,f))
{
strip (buf) ;
if (emm = strstr (buf,"8200"))
{
if (!(*serial))
{
printf ("cccam emm gefunden. serial der karte : ") ;
fflush (stdout) ;
fgets (serial,19,stdin) ;
strip (serial) ;
if (strlen (serial) != 8)
{
printf ("fehler. serial besteht aus 8 zeichen (4 byte)\n") ;
return (0) ;
}
}
oscamstyle (emm,serial,newbuf) ;
}
else
if (!(emm = strstr (buf,"8270")))
*newbuf = 0 ;
else
strcpy (newbuf,emm) ;
emm = newbuf ;
if (*newbuf)
{
b = getbin (emm+16) ;
t = getbin (emm+6) ;
l = (unsigned char) getbin (emm+4) ;
if (l > (4*16))
et = 1 ;
else
et = 0 ;
if (!strncmp (emm+26,"4402",4) || !strncmp (emm+26,"4401",4))
fake = 0 ;
else
fake = 1 ;
if ((t == 1) || (t == 193))
{
if (t == 1)
printf ("GLOBAL EMM : %s\n",emm) ;
else
printf ("BOX EMM : %s\n",emm) ;
}
else
{
if (b == 02)
{
if (fake)
{
if (et)
printf ("FAKE AKTIVIERER : %s\n",emm) ;
else
printf ("FAKE VERLÄNGERER : %s\n",emm) ;
}
else
if (et)
printf ("UNIQUE AKTIVIERER : %s\n",emm) ;
else
printf ("UNIQUE VERLÄNGERER : %s\n",emm) ;
}
if (b == 07)
{
getbinstr (newbuf,&len,buf) ;
printf ("UNKNOWN EMM (07) : %s\n",emm) ;
print07 (buf,len) ;
}
}
}
}
fclose (f) ;
}