📄 parse.c
字号:
} break; case 0x8E: if(sharedEmm) { unsigned char tmp[len+sharedLen]; unsigned char *ass=(unsigned char *)cParseViaccess::NanoStart(data); len-=(ass-data); if((data[6]&2)==0) { const int addrlen=len-8; len=0; tmp[len++]=0x9e; tmp[len++]=addrlen; memcpy(&tmp[len],&ass[0],addrlen); len+=addrlen; tmp[len++]=0xf0; tmp[len++]=0x08; memcpy(&tmp[len],&ass[addrlen],8); len+=8; } else { memcpy(tmp,ass,len); } ass=(unsigned char *)cParseViaccess::NanoStart(sharedEmm); int l=sharedLen-(ass-sharedEmm); memcpy(&tmp[len],ass,l); len+=l; ass=(unsigned char *)malloc(len+7); if(ass) { memcpy(ass,data,7); SortNanos(ass+7,tmp,len); SetSctLen(ass,len+4); ad->SetAssembled(ass); return 1; // assembled } } break; } return -1; // ignore}// -- cCardViaccess ------------------------------------------------------------cCardViaccess::cCardViaccess(const unsigned char *u){ memcpy(ua,u,sizeof(ua));}bool cCardViaccess::MatchEMM(const unsigned char *data){ return data[0]==0x88 && !memcmp(&data[3],ua,sizeof(ua));}// -- cParseViaccess -----------------------------------------------------------const unsigned char *cParseViaccess::NanoStart(const unsigned char *data){ switch(data[0]) { case 0x88: return &data[8]; case 0x8e: return &data[7]; case 0x8c: case 0x8d: return &data[3]; case 0x80: case 0x81: return &data[4]; } return 0;}const unsigned char *cParseViaccess::CheckNano90(const unsigned char *data){ return CheckNano90FromNano(NanoStart(data));}const unsigned char *cParseViaccess::CheckNano90FromNano(const unsigned char *data){ if(data && data[0]==0x90 && data[1]==0x03) return data; return 0;}int cParseViaccess::KeyNr(const unsigned char *data){ return KeyNrFromNano(CheckNano90(data));}int cParseViaccess::KeyNrFromNano(const unsigned char *data){ return data ? data[4]&0x0f : -1;}const unsigned char *cParseViaccess::ProvIdPtr(const unsigned char *data){ data=CheckNano90(data); return data ? &data[2] : 0;}int cParseViaccess::ProvId(const unsigned char *data){ const unsigned char *id=cParseViaccess::ProvIdPtr(data); return id ? (id[0]<<16)+(id[1]<<8)+(id[2]&0xf0) : -1;}// -- cCardNagra2 --------------------------------------------------------------cCardNagra2::cCardNagra2(const unsigned char *a){ addr[0]=a[2]; addr[1]=a[1]; addr[2]=a[0]; addr[3]=a[3];}bool cCardNagra2::MatchEMM(const unsigned char *data){ return data[0]==0x82 || (data[0]==0x83 && !memcmp(&data[3],addr,(data[7]==0x10)?3:4));}int cCardNagra2::UpdateType(const unsigned char *data){ if(data[0]==0x83) return (data[7]==0x10) ? 2:3; return 0;}// -- cProviderConax -----------------------------------------------------------cProviderConax::cProviderConax(const unsigned char *a){ memcpy(addr,a,sizeof(addr));}bool cProviderConax::MatchID(const unsigned char *data){ return MatchEMM(data);}bool cProviderConax::MatchEMM(const unsigned char *data){ return !memcmp(&data[3],addr,sizeof(addr));}unsigned long long cProviderConax::ProvId(void){ return Bin2LongLong(addr,sizeof(addr));}// -- cCardConax ---------------------------------------------------------------cCardConax::cCardConax(const unsigned char *a){ memcpy(addr,a,sizeof(addr));}bool cCardConax::MatchEMM(const unsigned char *data){ return !memcmp(&data[3],addr,sizeof(addr));}// -- cProviderCryptoworks -----------------------------------------------------cProviderCryptoworks::cProviderCryptoworks(const unsigned char *a){ memcpy(addr,a,sizeof(addr));}bool cProviderCryptoworks::MatchID(const unsigned char *data){ return MatchEMM(data);}bool cProviderCryptoworks::MatchEMM(const unsigned char *data){ return false;}unsigned long long cProviderCryptoworks::ProvId(void){ return Bin2LongLong(addr,sizeof(addr));}// -- cCardCryptoworks----------------------------------------------------------cCardCryptoworks::cCardCryptoworks(const unsigned char *a){ memcpy(addr,a,sizeof(addr)); sharedEmm=0; sharedLen=globalToggle=0; globalCrc=0;}cCardCryptoworks::~cCardCryptoworks(){ free(sharedEmm);}bool cCardCryptoworks::MatchEMM(const unsigned char *data){ if((data[1]&0xF0)==0x70 && data[3]==0xA9 && data[4]==0xff) { switch(data[0]) { case 0x82: return !memcmp(&data[5],addr,sizeof(addr)); case 0x84: return !memcmp(&data[5],addr,sizeof(addr)-1); case 0x86: case 0x88: case 0x89: return true; } } return false;}int cCardCryptoworks::UpdateType(const unsigned char *data){ switch(data[0]) { case 0x82: return 3; // unique case 0x84: case 0x86: return 2; // shared default: return 0; // global }}int cCardCryptoworks::Assemble(cAssembleData *ad){ const unsigned char *data=ad->Data(); int len=SCT_LEN(data); switch(data[0]) { case 0x82: return 0; // no assemble needed case 0x84: free(sharedEmm); sharedEmm=(unsigned char *)malloc(len); if(sharedEmm) { memcpy(sharedEmm,data,len); sharedLen=len; } break; case 0x86: if(sharedEmm) { int alen=len-5 + sharedLen-12; unsigned char tmp[alen]; memcpy(tmp,&data[5],len-5); memcpy(tmp+len-5,&sharedEmm[12],sharedLen-12); unsigned char *ass=(unsigned char *)malloc(alen+12); if(!ass) return -1; // ignore memcpy(ass,sharedEmm,12); SortNanos(ass+12,tmp,alen); SetSctLen(ass,alen+9); free(sharedEmm); sharedEmm=0; if(ass[11]==alen) { // sanity check ad->SetAssembled(ass); return 1; // assembled } } break; case 0x88: case 0x89: if(data[0]!=globalToggle) { globalToggle=data[0]; unsigned int crc=crc32_le(0,data+1,len-1); if(crc!=globalCrc) { globalCrc=crc; return 0; // no assemble needed } } break; } return -1; // ignore}// -- cProviderNDS -------------------------------------------------------------cProviderNDS::cProviderNDS(const unsigned char *s){ memcpy(sa,s,sizeof(sa));}bool cProviderNDS::MatchID(const unsigned char *data){ return MatchEMM(data);}bool cProviderNDS::MatchEMM(const unsigned char *data){ return cParseNDS::HasAddr(data,sa);}unsigned long long cProviderNDS::ProvId(void){ return Bin2LongLong(sa,sizeof(sa));}int cProviderNDS::Assemble(cAssembleData *ad){ return cParseNDS::Assemble(ad,sa);}// -- cCardNDS -----------------------------------------------------------------cCardNDS::cCardNDS(const unsigned char *u){ memcpy(ua,u,sizeof(ua));}bool cCardNDS::MatchEMM(const unsigned char *data){ return cParseNDS::HasAddr(data,ua);}int cCardNDS::Assemble(cAssembleData *ad){ return cParseNDS::Assemble(ad,ua);}// -- cParseNDS ----------------------------------------------------------------unsigned int cParseNDS::NumAddr(const unsigned char *data){ return ((data[3]&0x30)>>4)+1;}int cParseNDS::AddrMode(const unsigned char *data){ switch(data[3]&0xC0) { case 0x40: return 3; case 0x80: return 2; default: return 0; }}bool cParseNDS::HasAddr(const unsigned char *data, const unsigned char *a){ int s; switch(AddrMode(data)) { case 2: s=3; break; case 3: s=4; break; default: return true; } for(int l=NumAddr(data)-1; l>=0; l--) { if(!memcmp(&data[l*4+4],a,s)) return true; } return false;}const unsigned char *cParseNDS::PayloadStart(const unsigned char *data){ //return &data[4 + NumAddr(data)*4 + 2]; if(AddrMode(data)==0) return &data[4 + 2]; else return &data[4 + NumAddr(data)*4];}int cParseNDS::PayloadSize(const unsigned char *data){ //return emm[2]+emm[3]+4-1+5; int l=SCT_LEN(data); if(AddrMode(data)==0) return l-(4 + 2); else return l-(4 + NumAddr(data)*4);}int cParseNDS::Assemble(cAssembleData *ad, const unsigned char *a){ const unsigned char *data=ad->Data(); int len=cParseNDS::PayloadSize(data); const unsigned char *pl=cParseNDS::PayloadStart(data); switch(cParseNDS::AddrMode(data)) { case 0: { int n=*(pl-1) & 0x01; for(int i=cParseNDS::NumAddr(data); i>0 && len>0; i--) { int l; if(n) { l=(((*pl & 0x3F)<<8) + *(pl+1)) << 1; pl+=2; len-=2; } else { l=(*pl & 0x3F) << 1; pl++; len--; } if(l>0 && l<=len) { unsigned char *ass=(unsigned char *)malloc(len+4); if(!ass) return -1; // ignore ass[0]=data[0]; ass[3]=data[3]&0x0F; memcpy(&ass[4],pl,l); SetSctLen(ass,l+1); ad->SetAssembled(ass); pl+=l; len-=l; } } return 1; // assembled } case 2: case 3: { unsigned char *ass=(unsigned char *)malloc(len+8); if(!ass) return -1; // ignore ass[0]=data[0]; ass[3]=data[3]&0x0F; memcpy(&ass[4],a,4); memcpy(&ass[8],pl,len); SetSctLen(ass,len+5); ad->SetAssembled(ass); return 1; // assembled } } return -1; // ignore}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -