⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nagra2.cpp

📁 DVB-S的softcam源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			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 + -