📄 nagra2.cpp
字号:
pk->Get(vKey);
hasVerifyKey=true;
}
else if(id!=lastEmmId) {
sprintf(txt,"Your missing: %04x NN %.02X signature key (non-fatal)\n",id,0x03+sigsel);
m_DLLInstance.PushMessage(MSG_EMM_DATA,txt);
dl(printf("system-nagra2: missing %04x NN %.02X signature key (non-fatal)\n",id,0x03+sigsel));
}
}
if(!(pk=keys.FindKey('N',provider,MBC(keyPTR,keyset),24,0))) {
if(!(pk=keys.FindKey('N',provider,MBC(keyPTR,keyset+sel),16))) {
if (buffer[0] == 0x83) {
sprintf(text,"[%s] EMM-S {%06X%02X} Missing: %04x S %.06X %.02X IDEA key",time_str,CamID,buffer[6],id,CamID,keyset);
m_DLLInstance.PushMessage(MSG_MESSAGE,text);
sprintf(txt,"Your missing: %04x S %.06X %.02X IDEA key (24 bytes)",id,CamID,keyset);
} else {
sprintf(txt,"Your missing: %04x NN %.02x IDEA key (24 or 16 bytes)\n",id,keyset);
}
m_DLLInstance.PushMessage(MSG_EMM_DATA,txt);
dl(printf("logger-nagra2: missing %04x NN %.02x IDEA key (24 or 16 bytes)\n",id,keyset));
return;
}
memset(ideaKey+16,0,8);
}
pk->Get(ideaKey);
unsigned char emmdata[256];
if(!DecryptEMM(buffer+14,emmdata,ideaKey,cmdLen,hasVerifyKey?vKey:0,n)) {
sprintf(txt,"[%s] nagra2: decrypt of EMM failed (%04x)", time_str, id);
dl(printf("logger-nagra2: decrypt of EMM failed (%04x)\n",id))
if (buffer[0] == 0x82 && m_DLLInstance.m_hide_bad_data == false) {
m_DLLInstance.PushMessage(MSG_EMM_STATUS,txt);
m_DLLInstance.PushMessage(MSG_EMM_DATA,"Bad EMM-G Packet (Idea Hash failed! -> RSA decryption failed!)");
} else if (buffer[0] == 0x83 && m_DLLInstance.m_hide_bad_data == false) {
m_DLLInstance.PushMessage(MSG_EMM_STATUS,txt);
m_DLLInstance.PushMessage(MSG_EMM_DATA,"Bad EMM-S Packet (Idea Hash failed! -> RSA decryption failed!)");
sprintf(text,"[%s] EMM-S {%06X%02X} (Idea Hash failed! -> RSA decryption failed!)",time_str,CamID,buffer[6]);
m_DLLInstance.PushMessage(MSG_MESSAGE,text);
}
return;
} else {
if (buffer[0] == 0x82) {
sprintf(txt,"[%s] nagra2: decrypt of EMM Succeeded (%04x)", time_str, id);
dl(printf("%s\n", txt));
m_DLLInstance.PushMessage(MSG_EMM_STATUS,txt);
m_DLLInstance.WriteEMM(emmdata);
char *str2 = new char [51]; // 4AFFB6B0C6C52F7C0801144F8C9F18717787E3
sprintf(&str2[0],"%02X ",emmdata[18]);
for(int it=1; it<20; it++) sprintf(&str2[(it*2)+1],"%02X",emmdata[it+18]);
sprintf(txt,"[%s] EMM-G %.39s (%04X)\n",time_str,str2,id);
m_DLLInstance.PushMessage(MSG_MESSAGE,txt);
if (m_DLLInstance.m_log_emm_g == true) {
sprintf(text," EMM-G ");
for(int it=0 ; it<15 ; it++) sprintf(&text[(it*2)+7],"%02X",buffer[it]);
sprintf(filename,"EMM-G.log");
m_DLLInstance.logCamID(filename,emmdata,96,false,text);
}
} else if (buffer[0] == 0x83 &&
emmdata[19] == buffer[5] &&
emmdata[20] == buffer[4] &&
emmdata[21] == buffer[3]) {
sprintf(txt,"[%s] nagra2: decrypt of EMM Succeeded (%04x)", time_str, id);
dl(printf("%s\n", txt));
m_DLLInstance.PushMessage(MSG_EMM_STATUS,txt);
m_DLLInstance.WriteEMM(emmdata);
sprintf(txt,"[%s] EMM-S {%06X%02X} %02X # # # Decrypted # # # (%04X)\n",time_str,CamID,buffer[6],emmdata[18],id);
m_DLLInstance.PushMessage(MSG_MESSAGE,txt);
if (LogType > 0) { //0=no logging
sprintf(text," Decrypted: ");
m_DLLInstance.logCamID(EMM_filename,emmdata,96,false,text);
}
} else if (buffer[0] == 0x83 && m_DLLInstance.m_hide_bad_data == false) {
m_DLLInstance.WriteEMM(emmdata);
sprintf(txt,"[%s] EMM-S {%06X%02X} ** Bad Decrypted Data ** (%04X)\n",time_str,CamID,buffer[6],id);
m_DLLInstance.PushMessage(MSG_MESSAGE,txt);
return;
} else if (buffer[0] == 0x83 && m_DLLInstance.m_hide_bad_data == true) {
return;
}
}
lastEmmId=id;
if (buffer[0] == 0x82) {
id=(emmdata[8]<<8)+emmdata[9];
}
#ifdef DEBUG_LOG
bool contFail=false;
#endif
for(int i=8+2+4+4; i<cmdLen-22; ) {
#ifdef DEBUG_LOG
printf("{%02X}",emmdata[i]);
#endif
switch(emmdata[i]) {
//End of processing
case 0x00:
i=cmdLen;
break;
//Write bb at dd
case 0x01:
i+=3; //0x03
break;
//spending limit tier create
case 0x10:
i+=18; //0x12
break;
//?????????????
case 0x12: //tier update/create
case 0x13:
case 0x14:
case 0x15:
//Skip these nano's for now
i=cmdLen;
break;
//date & time update
case 0x20:
i+=34; //0x22
break;
//Plain Key update
case 0x42:
if(emmdata[i+2]==0x10 && (emmdata[i+3]&0xBF)==0x06 &&
(emmdata[i+4]&0xF8)==0x08 && emmdata[i+5]==0x00 && emmdata[i+6]==0x10) {
cSoftCAM::FoundKey();
if(keys.NewKey('N',id,(emmdata[i+3]&0x40)>>6,&emmdata[i+7],16)) {
if(g_BeepOnNewKey)
{
Beep(300,500);
Sleep(50);
Beep(300,500);
}
cSoftCAM::NewKey();
if (m_DLLInstance.m_use_ca_cache) {
cSoftCAM::Save();
} else {
m_DLLInstance.SaveKey('N',id,(emmdata[i+3]&0x40)>>6,&emmdata[i+7],32);
}
} else {
for(int it=7 ; it<23 ; it++) sprintf(&text[(it-7)*2],"%02X",emmdata[i+it]);
sprintf(txt,"[%s] Key %02X: %s (%04X)\n",time_str,(emmdata[i+3]&0x40)>>6,text,id);
m_DLLInstance.PushMessage(MSG_MESSAGE,txt);
}
if (m_DLLInstance.m_StopEmm_OnChange){
m_DLLInstance.StopEMMFilter();
m_DLLInstance.ClearAllData();
}
}
i+=(emmdata[i+6]+7);
break;
//Change data prov. id
case 0x83:
id=(emmdata[i+1]<<8)|emmdata[i+2];
i+=3;
break;
//?????????????
case 0x85:
//Skip this nano for now
i=cmdLen;
break;
//CamID target update
case 0xA0:
i+=5;
break;
//?????????????
case 0xA2:
//Skip this nano for now
i=cmdLen;
break;
//Cam group target update
case 0xA3:
i+=4;
break;
//conditional (always no match assumed for now)
case 0xA4:
//Skip this nano for now
i=cmdLen;
break;
//generally updates tier/blackout
case 0xA6:
if (emmdata[i+4] == 0xFD && emmdata[i+5] == 0x98) {
i+=(emmdata[i+1]+emmdata[i+3]+4);
} else {
i=cmdLen;
}
break;
//?????????????
case 0xAA:
case 0xAE:
//Skip these nano's for now
i=cmdLen;
break;
//Update with ROM101 CPU code
case 0xB0:
//Skip this nano for now
i=cmdLen;
break;
//ROM102 Morph Coding
case 0xB1:
{
if(!emmP || !emmP->CanHandle(id)) {
delete emmP;
emmP=cN2Providers::GetProv(id,2);
if(!emmP) {
dl(printf("system-nagra2: B1 for provider %04x not supported\n",id))
i=cmdLen;
break;
}
}
//if (buffer[0] == 0x83) return;
int B1Start = i;
int dataLen2 = 103;
char *str2 = new char [dataLen2*2+17];
for(int it=0 ; it<15 ; it++) sprintf(&str2[it*2],"%02X",buffer[it]);
d(printf("\n[%s] decrypted: %s", time_str, str2));
for(int it=0 ; it<dataLen2 ; it++) sprintf(&str2[it*2],"%02X",emmdata[it]);
d(printf(" %s\n\n", str2));
int rValue;
rValue = emmP->ProcessB1(emmdata,cmdLen,i+1);
if (rValue > 3) { // 0 ??
i += rValue;
} else {
dl(printf("system-nagra2: B1 executing failed for %04x\n",id))
i=cmdLen;
}
break;
}
//DN key update
case 0xE0:
if(emmdata[i+1]==0x25) {
cSoftCAM::FoundKey();
if(keys.NewKey('N',id,(emmdata[i+16]&0x40)>>6,&emmdata[i+23],16)) cSoftCAM::NewKey();
cSoftCAM::Save();
i+=39;
} else {
i=cmdLen;
}
break;
//Eeprom update
case 0xE3:
#if 0
if(g_LogE3)
{
FILE *fh;
if(fopen_s(&fh, "e3.log", "a") == 0) {
printf("system-nagra2: Saving E3\n");
HexDump(emmdata, cmdLen);
for(int ii = 0; ii < cmdLen; ii++) {
if(ii % 16 == 0) {
fprintf(fh, "\n%04x:", ii);
}
fprintf(fh, " %02x", emmdata[ii]);
}
fprintf(fh,"\n");
fclose(fh);
} else {
printf("system-nagra2: Unable to save E3\n");
}
}
#endif
i=cmdLen;
break;
//Unknown EMM cmd's
default:
#ifdef DEBUG_LOG
if(!contFail) printf("logger-nagra2: unknown EMM nano");
printf(" %02x",emmdata[i]);
contFail=true;
#endif
//Skip all other nano's for now
i=cmdLen;
continue;
}
#ifdef DEBUG_LOG
if(contFail) { printf("\n"); contFail=false; }
#endif
}
#ifdef DEBUG_LOG
if(contFail) printf("\n");
#endif
}
// -- cSystemLinkNagra2 --------------------------------------------------------
/*
static const tI18nPhrase Phrases2[] = {
{ "Nagra2: AUXserver hostname",
"Nagra2: AUXserver Hostname",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
},
{ "Nagra2: AUXserver port",
"Nagra2: AUXserver Port",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
},
{ "Nagra2: AUXserver password",
"Nagra2: AUXserver Passwort",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
"",
},
{ NULL }
};
*/
class cSystemLinkNagra2 : public cSystemLink {
public:
cSystemLinkNagra2(void);
virtual bool CanHandle(unsigned short SysId);
virtual cSystem *Create(void) { return new cSystemNagra2; }
};
static cSystemLinkNagra2 staticInitN2;
cSystemLinkNagra2::cSystemLinkNagra2(void)
:cSystemLink(SYSTEM_NAME,SYSTEM_PRI)
{
#ifdef HAS_AUXSRV
static const char allowed_chars[] = "0123456789abcdefghijklmnopqrstuvwxyz-.";
opts=new cOpts(SYSTEM_NAME,3);
opts->Add(new cOptStr("AuxServerAddr","Nagra2: AUXserver hostname",auxAddr,sizeof(auxAddr),allowed_chars));
opts->Add(new cOptInt("AuxServerPort","Nagra2: AUXserver port",&auxPort,0,65535));
opts->Add(new cOptStr("AuxServerPass","Nagra2: AUXserver password",auxPassword,sizeof(auxPassword),allowed_chars));
// Feature.AddPhrases(Phrases2);
#endif
Feature.NeedsKeyFile();
}
bool cSystemLinkNagra2::CanHandle(unsigned short SysId)
{
return ((SysId&SYSTEM_MASK)==SYSTEM_NAGRA && (SysId&0xFF)>0) ||
SysId==SYSTEM_NAGRA_BEV;
}
#endif //TESTER
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -