#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
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,*ptr ;
int i,mlen ;
*len = strlen (buf) / 2 ;
if (*len < 4)
mlen = 4 ;
else
mlen = *len ;
if (!(b = (char *) malloc (mlen)))
{
*len = 0 ;
return (NULL) ;
}
ptr = buf ;
for (i = 0 ; i < *len ; i++)
{
b [i] = getbin (ptr) ;
ptr += 2 ;
}
return (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 ur (char *in,char *out)
{
char t2 [1000],t3 [1000],t4 [1000],emm [1000],ser [1000],*tmp ;
int i,elen ;
unsigned char subnum,c,xc ;
printf ("1\n") ;
if (!strncmp (in,"827038c1",8))
{
memcpy (t2,in+26,32) ;
t2 [32] = 0 ;
strcat (t2,"00010202030002020203") ;
sprintf (out,"ins7e : %s\n",t2) ;
}
else
if (!strncmp (in,"8270",4) && !strncmp (in+6,"41",2) && !strncmp (in+16,"07",2))
{
memset (emm,0,1000) ;
c = getbin (in+4) ;
i = ((int)c) * 2 ;
printf ("2 (in=\n") ;
memcpy (t2,in,i+6) ;
t2 [i+6] = 0 ;
i = 0 ;
tmp = t2+38 ;
*t4 = 0 ;
memcpy (ser,t2+8,8) ;
ser [8] = 0 ;
printf ("3\n") ;
while (strlen (tmp) > 12)
{
subnum = getbin (tmp) ;
tmp += 2 ;
memcpy (t3,tmp,8) ;
t3 [8] = 0 ;
i++ ;
sprintf (out,"boxid(%d) : %s, subemm(%d) : ",i,t3,subnum) ;
out += strlen (out) ;
tmp += 8 ;
c = getbin (tmp) ;
strcpy (emm,"82704f4100aabbcc0200479045") ;
memcpy (emm+24,tmp+4,2) ;
memcpy (emm+20,tmp,2) ;
memcpy (emm+8,ser,8) ;
elen = strlen (emm) ;
xc = getbin (tmp+4) ;
gethex (xc+10,emm+4) ;
memcpy (emm+elen,tmp+6,((int) xc) * 2) ;
emm [elen+(((int) xc)*2)] = 0 ;
strcat (out,emm) ;
strcat (out,"\n") ;
out += strlen (out) ;
tmp += 2+(((int)c)*2) ;
}
in += strlen (t2) ;
}
else
{
*out = *in ;
out++ ;
}
}
void strip (char *buf)
{
while ((strlen (buf) > 0) && ((buf [strlen (buf)-1] == '\n') || (buf [strlen (buf)-1] == '\r') || (buf [strlen (buf)-1] == ' ')))
buf [strlen (buf)-1] = 0 ;
}
int main (void)
{
char buf [10000],out [10000] ;
printf ("\nunknown-zerleger by name007\n\nkomplettes unknown emm oder kompletten 38c1 einfuegen : \n") ;
*buf = 0 ;
fgets (buf,1000,stdin) ;
strip (buf) ;
if (!strncmp (buf,"8200",4))
{
printf ("nur 8270 emm erlaubt. bitte nicht mit cccam loggen.\n") ;
return (0) ;
}
if (strncmp (buf,"8270",4))
{
printf ("emmheader nicht erkannt. emms beginnen mit 8270.\n") ;
return (0) ;
}
ur (buf,out) ;
printf ("%s",out) ;
}