コード例 #1
0
ファイル: module4.cpp プロジェクト: nyetwurk/IronFelix
int FixChkSum(ECU_info* dllECUinfo)
{
    unsigned int FindOffset, HexCount ;
    unsigned char HexBytes1[]= {0x00, 0x00, 0x80, 0x00, 0xFD, 0x5E, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0xFB, 0x80, 0x00};
    unsigned char HexBytes2[]= {0x00, 0x00, 0x80, 0x00, 0xFF, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0xFB, 0x80, 0x00};
    HexCount=16;

    DWORD Buffer= (DWORD)dllECUinfo->EcuBuffer;

    //Распознаем ECU
    if (dllECUinfo->EcuFileSize!=ECUFILESIZE)
    {
        return 0;
    }

    FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes1, HexCount);
    if (FindOffset==0xFFFFFFFF)
    {
        FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes2, HexCount);
        if (FindOffset==0xFFFFFFFF)
        {
            return 0;
        }
    }
    if (!FindFixCRC(dllECUinfo, 1))
    {
        return 0;
    }
    return dllECUinfo->BadChkSumNumber;

}
コード例 #2
0
ファイル: module4.cpp プロジェクト: nyetwurk/IronFelix
int RecogniseECU (ECU_info* dllECUinfo)
{
    unsigned int i, s_crc, FindOffset, HexCount ;
    char* FileDescr="HYUNDAY Bosch M7.9.7";
//	char cf_crc[30];

    unsigned char HexBytes1[]= {0x00, 0x00, 0x80, 0x00, 0xFD, 0x5E, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0xFB, 0x80, 0x00};
    unsigned char HexBytes2[]= {0x00, 0x00, 0x80, 0x00, 0xFF, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0xFB, 0x80, 0x00};
    HexCount=16;

    DWORD Buffer= (DWORD)dllECUinfo->EcuBuffer;


    //Распознаем ECU
    if (dllECUinfo->EcuFileSize!=ECUFILESIZE)
    {
        return 0;
    }

    FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes1, HexCount);
    if (FindOffset==0xFFFFFFFF)
    {
        FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes2, HexCount);
        if (FindOffset==0xFFFFFFFF)
        {
            return 0;
        }
    }
    if (!FindFixCRC(dllECUinfo, 0))
    {
        return 0;
    }

    /*	for (i = 0; i < dllECUinfo->EcuFileSize; i++)
    		{
    			f_crc+= *(unsigned char*)(Buffer+i);
    		}
    */
    StringCbLength(FileDescr, 50, &s_crc);
    StringCbCopyN (dllECUinfo->ECU_Descr, 100, FileDescr, s_crc);
    /*	IntToChar (f_crc, cf_crc);
    	StringCbLength(cf_crc, 50, &s_crc);
    	StringCbCatN (dllECUinfo->ECU_Descr, 100, cf_crc, s_crc+1 );
    */
    /*	FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes, HexCount);
    	f_crc=SummInt8(0, dllECUinfo->EcuFileSize-1, (unsigned char*)Buffer );
    	s_crc=SummInt16Intel(0, dllECUinfo->EcuFileSize-1, (unsigned char*)Buffer );
    	s_crc=SummInt16Mot(0, dllECUinfo->EcuFileSize-1, (unsigned char*)Buffer );
    */


    return 1;

}
コード例 #3
0
ファイル: module9.cpp プロジェクト: matt2005/IronFelix
int RecogniseECU (ECU_info* dllECUinfo)
{
	unsigned int i, s_crc, FindOffset, HexCount1, HexCount2, HexCount3 ;
	char* FileDescr="VAG Bosch MED9.5";

	unsigned char HexBytes1[]={0xA1, 0x86, 0x00, 0x00, 0x7C, 0xA5, 0x62, 0x14, 0xA1, 0x66, 0x00, 0x02, 0x7C, 0xA5, 0x5A, 0x14, 0x38, 0xC6, 0x00, 0x04, 0x7C, 0x06, 0x20, 0x40, 0x41, 0x80, 0xFF, 0xE8, 0x7C, 0xA3, 0x2B, 0x78 };
	unsigned char HexBytes2[]={0x7D, 0x84, 0x28, 0xAE, 0x7D, 0x63, 0x28, 0xAE, 0x7C, 0x0C, 0x58, 0x00, 0x41, 0x82, 0x00, 0x18 };
	HexCount1=32;
	HexCount2=16;

	DWORD Buffer= (DWORD)dllECUinfo->EcuBuffer;


	//Recognise ECU
	if (dllECUinfo->EcuFileSize!=ECUFILESIZE)
		{
			return 0;
		}

	FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes1, HexCount1);
	if (FindOffset==0xFFFFFFFF)
		{
			return 0;
		}
	FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes2, HexCount2);
	if (FindOffset==0xFFFFFFFF)
		{
			return 0;
		}

	if (!FindFixCRC(dllECUinfo, 0))
	{
		return 0;
	}

	StringCbLength(FileDescr, 50, &s_crc);
	StringCbCopyN (dllECUinfo->ECU_Descr, 100, FileDescr, s_crc);

	return 1;

}
コード例 #4
0
ファイル: module9.cpp プロジェクト: matt2005/IronFelix
int FixChkSum(ECU_info* dllECUinfo)
{
	unsigned int FindOffset, HexCount1, HexCount2, HexCount3;
	unsigned char HexBytes1[]={0xA1, 0x86, 0x00, 0x00, 0x7C, 0xA5, 0x62, 0x14, 0xA1, 0x66, 0x00, 0x02, 0x7C, 0xA5, 0x5A, 0x14, 0x38, 0xC6, 0x00, 0x04, 0x7C, 0x06, 0x20, 0x40, 0x41, 0x80, 0xFF, 0xE8, 0x7C, 0xA3, 0x2B, 0x78 };
	unsigned char HexBytes2[]={0x7D, 0x84, 0x28, 0xAE, 0x7D, 0x63, 0x28, 0xAE, 0x7C, 0x0C, 0x58, 0x00, 0x41, 0x82, 0x00, 0x18 };
	HexCount1=32;
	HexCount2=16;

	DWORD Buffer= (DWORD)dllECUinfo->EcuBuffer;


	//Recognise ECU
	if (dllECUinfo->EcuFileSize!=ECUFILESIZE)
		{
			return 0;
		}

	FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes1, HexCount1);
	if (FindOffset==0xFFFFFFFF)
		{
			return 0;
		}
	FindOffset=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , HexBytes2, HexCount2);
	if (FindOffset==0xFFFFFFFF)
		{
			return 0;
		}


	if (!FindFixCRC(dllECUinfo, 1))
	{
		return 0;
	}
	return dllECUinfo->BadChkSumNumber;

}
コード例 #5
0
ファイル: module9.cpp プロジェクト: matt2005/IronFelix
int FindFixCRC(ECU_info* dllECUinfo, int FixCRC)
{
	 DWORD Buffer1 = (DWORD)dllECUinfo->EcuBuffer;
	 unsigned char* Buffer= (unsigned char*)(Buffer1);
	 unsigned int FindOffset, EcuSubType, StartAdr1, EndAdr1, ChkSumAdr1, CS_off, CS_count;
	 unsigned int r2_base=0x5C9FF0;
	 unsigned int ChkSumm1=0, CalcSumm1, TotalSumm=0, BadSumm=0, MultCSAdr;
	 //Signature Block CheckSumm
	 unsigned char EcuBlockSig1[]={0x81, 0x43, 0x00, 0x00, 0x81, 0x23, 0x00, 0x04, 0x7C, 0x0A, 0x48, 0x40, 0x41, 0x81, 0x00, 0x18};
	 unsigned int EcuHexCount1=16;

	 md5_t	md5;
	 unsigned char	MD5CalcSig[MD5_SIZE], MD5DecodedSig[MD5_SIZE];
	 unsigned int MD5_StartAdr, MD5_EndAdr, MD5BlkStart, MD5BlkEnd, md5sum, RSAModulus, RSASignature, RSAExponent, RSAFix;
	 //Signature for MD5
	 unsigned char MD5Sig1[]={0x7D, 0x4A, 0x5B, 0x78, 0x7D, 0x9D, 0xF8, 0xAE, 0x7D, 0x4A, 0x63, 0x78, 0x7D, 0x5E, 0xF9, 0x2E};
	 unsigned char MD5Sig2[]={0x39, 0x00, 0x00, 0x00, 0x3B, 0xE0, 0x00, 0x7F, 0x2C, 0x1F, 0x00, 0x00, 0x41, 0x80, 0x00, 0x64};
	 unsigned int MD5HexCount1=16;
	 unsigned int MD5HexCount2=16;
	 unsigned int RSAPubExp=0x03;
	 unsigned char RSABuf[0x80];
	 unsigned char RSAPubModulus[]={
									0x79, 0xD3, 0xD0, 0x1A, 0xB7, 0xE3, 0x6C, 0x98,
									0x4B, 0xBB, 0x54, 0xF5, 0x1C, 0x69, 0xA4, 0x91,
									0xF7, 0xD6, 0xD6, 0x82, 0xA4, 0xC6, 0x8B, 0x77,
									0x0D, 0x2F, 0xEE, 0xFA, 0x3D, 0x43, 0xFF, 0x4C,
									0x6B, 0xED, 0xF6, 0xA7, 0x1F, 0xE1, 0xF8, 0xB3,
									0x54, 0x66, 0x1E, 0x5D, 0x0E, 0x54, 0x87, 0xB6,
									0x66, 0x2B, 0x60, 0x9A, 0x25, 0x07, 0xA9, 0xBC,
									0x8F, 0x3C, 0xFA, 0x56, 0xDE, 0xAE, 0xD7, 0x83,
									0x9E, 0xBF, 0x74, 0xBB, 0x94, 0x22, 0x5C, 0x7D,
									0xB7, 0x2C, 0x3D, 0x1E, 0x6A, 0xDE, 0xC9, 0xB7,
									0x87, 0xA6, 0xF2, 0x2E, 0xFD, 0x87, 0x12, 0x46,
									0x4E, 0xDE, 0xA5, 0x46, 0x2C, 0x22, 0x45, 0x61,
									0x97, 0x07, 0x08, 0x99, 0x21, 0x44, 0x64, 0x36,
									0xDF, 0x53, 0xA1, 0x84, 0xA6, 0x34, 0xC4, 0xF5,
									0x98, 0x6F, 0xE6, 0x23, 0x5C, 0xF2, 0x1D, 0x7E,
									0x7A, 0x25, 0xA0, 0x52, 0xFB, 0xDA, 0x48, 0xB3
									};
	 unsigned char RSAPrivExp[]={
								0x51, 0x37, 0xE0, 0x11, 0xCF, 0xEC, 0xF3, 0x10,
								0x32, 0x7C, 0xE3, 0x4E, 0x12, 0xF1, 0x18, 0x61,
								0x4F, 0xE4, 0x8F, 0x01, 0xC3, 0x2F, 0x07, 0xA4,
								0xB3, 0x75, 0x49, 0xFC, 0x28, 0xD7, 0xFF, 0x88,
								0x47, 0xF3, 0xF9, 0xC4, 0xBF, 0xEB, 0xFB, 0x22,
								0x38, 0x44, 0x14, 0x3E, 0x09, 0x8D, 0xAF, 0xCE,
								0xEE, 0xC7, 0x95, 0xBC, 0x18, 0xAF, 0xC6, 0x7D,
								0xB4, 0xD3, 0x51, 0x8F, 0x3F, 0x1F, 0x3A, 0x56,
								0xCF, 0x8E, 0xE4, 0x2D, 0x8A, 0x89, 0x30, 0x51,
								0x9F, 0x4B, 0x89, 0xF9, 0x87, 0xAF, 0x55, 0xA1,
								0x3A, 0x86, 0x61, 0x4A, 0xC2, 0xA9, 0x9B, 0x74,
								0x24, 0xA3, 0xC1, 0x8C, 0x4D, 0x22, 0xDE, 0xCF,
								0x0C, 0xB6, 0xA9, 0x0E, 0x30, 0xDB, 0xA1, 0x22,
								0x4C, 0xFD, 0xC3, 0xDC, 0x5E, 0x41, 0xC2, 0x58,
								0xE2, 0x61, 0xCE, 0xEF, 0xDE, 0x44, 0x0E, 0x36,
								0xC8, 0x5B, 0x34, 0x38, 0xBB, 0x43, 0x41, 0x2B
								};
	 mpz_t PubExp, PrivExp, Modulus, CalcSig, DecodeSig, Sig;

		//CRC32 and RSA
		 CS_off=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , MD5Sig1, MD5HexCount1);
		 if (CS_off!=0xFFFFFFFF)
			{
			 MD5BlkEnd=*(Buffer+CS_off+0x47)+(*(Buffer+CS_off+0x46)<<8)+(*(Buffer+CS_off+0x43)<<16)+(*(Buffer+CS_off+0x42)<<24);
			 if (*(Buffer+CS_off+0x46)& 0x80) { MD5BlkEnd-=0x10000;}
			 MD5BlkStart=*(Buffer+CS_off+0x4F)+(*(Buffer+CS_off+0x4E)<<8)+(*(Buffer+CS_off+0x4B)<<16)+(*(Buffer+CS_off+0x4A)<<24);
			 if (*(Buffer+CS_off+0x4E)& 0x80) { MD5BlkStart-=0x10000;}
			}
		 else
			{
				 return 0;
			}
		 //Calc MD5
		 md5_init(&md5);
		 MD5_StartAdr=Read4ByteMot(Buffer+MD5BlkStart);
		 MD5_EndAdr=Read4ByteMot(Buffer+MD5BlkEnd);
		 md5_process(&md5, Buffer+MD5_StartAdr, MD5_EndAdr-MD5_StartAdr+1);
		 md5_finish (&md5, MD5CalcSig);

		 CS_off=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , MD5Sig2, MD5HexCount2);
		 if (CS_off!=0xFFFFFFFF)
			{
			 RSASignature=*(Buffer+CS_off-0x09)+(*(Buffer+CS_off-0x0A)<<8)+(*(Buffer+CS_off-0x0D)<<16)+(*(Buffer+CS_off-0x0E)<<24);
			 if (*(Buffer+CS_off-0x0A)& 0x80) { RSASignature-=0x10000;}
			 RSAModulus=*(Buffer+CS_off+0x97)+(*(Buffer+CS_off+0x96)<<8)+r2_base-0x400000;
			 if (*(Buffer+CS_off+0x96)& 0x80) { RSAModulus-=0x10000;}
			 RSAExponent=*(Buffer+CS_off+0x137)+(*(Buffer+CS_off+0x136)<<8)+r2_base-0x400000;
			 if (*(Buffer+CS_off+0x136)& 0x80) { RSAExponent-=0x10000;}
			}
		 else
			{
				 return 0;
			}
		 //Decode RSA Signature
		 RSAFix=0;
		 mpz_init (PubExp);
		 mpz_init (Modulus);
		 mpz_init (DecodeSig);
		 mpz_init (Sig);
		 mpz_import (Sig, 0x80, 1, 1, 0, 0, Buffer+RSASignature);
		 mpz_import (Modulus, 0x80, 1, 1, 0, 0, Buffer+RSAModulus);
		 mpz_import (PubExp, 4, 1, 1, 0, 0, Buffer+RSAExponent);
		 mpz_powm (DecodeSig, Sig, PubExp, Modulus);
		 size_t rsa_size;
		 rsa_size=mpz_sizeinbase(DecodeSig, 2);
		 rsa_size=rsa_size/8+1;
		 memset(RSABuf, 0x00, 0x80);
		 mpz_export(RSABuf+0x80-rsa_size, &rsa_size, 1, 1, 0, 0, DecodeSig);
		 memcpy(MD5DecodedSig, RSABuf+0x70, 0x10);
		 mpz_clear (PubExp);
		 mpz_clear (Modulus);
		 mpz_clear (DecodeSig);
		 mpz_clear (Sig);

		 TotalSumm++;
			 if (memcmp(MD5CalcSig, MD5DecodedSig, 0x10))
				{
					if (FixCRC)
						{
							 //Update Modulus, Exponent, recalc MD5 and RSA
						 *(Buffer+RSAExponent)=0;
						 *(Buffer+RSAExponent+1)=0;
						 *(Buffer+RSAExponent+2)=0;
						 *(Buffer+RSAExponent+3)=RSAPubExp;
						 memcpy(Buffer+RSAModulus, RSAPubModulus, 0x80);
						 RSAFix=1;//Flag for recalc RSA
						 md5_init(&md5);
						 md5_process(&md5, Buffer+MD5_StartAdr, MD5_EndAdr-MD5_StartAdr+1);
						 md5_finish (&md5, MD5CalcSig);
						 //Encode new RSA Signature
						 mpz_init (PrivExp);
						 mpz_init (Modulus);
						 mpz_init (CalcSig);
						 mpz_init (Sig);
						 RSABuf[0]=0x00;
						 RSABuf[1]=0x01;
						 memset (RSABuf+2, 0xFF, 0x6D);
						 RSABuf[0x6F]=0x00;
						 memcpy(RSABuf+0x70, MD5CalcSig, 0x10);
						 mpz_import (Sig, 0x80, 1, 1, 0, 0, RSABuf);
						 mpz_import (Modulus, 0x80, 1, 1, 0, 0, RSAPubModulus);
						 mpz_import (PrivExp, 0x80, 1, 1, 0, 0, RSAPrivExp);
						 mpz_powm (CalcSig, Sig, PrivExp, Modulus);
						 rsa_size=mpz_sizeinbase(CalcSig, 2);
						 rsa_size=rsa_size/8+1;
						 mpz_export(RSABuf, &rsa_size, 1, 1, 0, 0, CalcSig);
						 mpz_clear (PrivExp);
						 mpz_clear (Modulus);
						 mpz_clear (CalcSig);
						 mpz_clear (Sig);
						 memcpy(Buffer+RSASignature, RSABuf, 0x80);
						}
					BadSumm++;
				}

		 //First CS Block
		 CS_off=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , EcuBlockSig1, EcuHexCount1);
		 if (CS_off!=0xFFFFFFFF)
			{
			 MultCSAdr=*(Buffer+CS_off-0x0D)+(*(Buffer+CS_off-0x0E)<<8)+(*(Buffer+CS_off-0x11)<<16)+(*(Buffer+CS_off-0x12)<<24);
			 if (*(Buffer+CS_off-0x0E)& 0x80) { MultCSAdr-=0x10000;}
			}
		 else
			{
				 return 0;
			}

			TotalSumm++;

				StartAdr1=Read4ByteMot(Buffer+MultCSAdr);
				EndAdr1=Read4ByteMot(Buffer+MultCSAdr+4);
				ChkSumm1= Read4ByteMot(Buffer+MultCSAdr+8);
				CalcSumm1=SummInt16Mot(StartAdr1, EndAdr1, Buffer);
				 if (ChkSumm1==(Read4ByteMot(Buffer+MultCSAdr+12)^0xFFFFFFFF))
					{
					 if (ChkSumm1!=CalcSumm1)
						{
							if (FixCRC)
								{
									Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
									Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
								}
							BadSumm++;
						}
					 }
				 else
				 {
					if (FixCRC)
						{
							Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
							Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
						}
					BadSumm++;
				 }

		 //Second CS Block
		 CS_off=FindHexStr(CS_off+16, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , EcuBlockSig1, EcuHexCount1);
		 if (CS_off!=0xFFFFFFFF)
			{
			 MultCSAdr=*(Buffer+CS_off-0x0D)+(*(Buffer+CS_off-0x0E)<<8)+(*(Buffer+CS_off-0x11)<<16)+(*(Buffer+CS_off-0x12)<<24);
			 if (*(Buffer+CS_off-0x0E)& 0x80) { MultCSAdr-=0x10000;}
			}
		 else
			{
				 return 0;
			}

			MultCSAdr+=0x10; //Correct Adress with CS number :)

		  for (CS_count = 0; CS_count < 4; CS_count++)
		  {
				TotalSumm++;

				StartAdr1=Read4ByteMot(Buffer+MultCSAdr);
				EndAdr1=Read4ByteMot(Buffer+MultCSAdr+4);
				ChkSumm1= Read4ByteMot(Buffer+MultCSAdr+8);
				CalcSumm1=SummInt16Mot(StartAdr1, EndAdr1, Buffer);
				 if (ChkSumm1==(Read4ByteMot(Buffer+MultCSAdr+12)^0xFFFFFFFF))
					{
					 if (ChkSumm1!=CalcSumm1)
						{
							if (FixCRC)
								{
									Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
									Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
								}
							BadSumm++;
						}
					 }
				 else
				 {
					if (FixCRC)
						{
							Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
							Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
						}
					BadSumm++;
				 }
            MultCSAdr+=0x10;
		  }

		 //Third CS Block
		 CS_off=FindHexStr(CS_off+16, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , EcuBlockSig1, EcuHexCount1);
		 if (CS_off!=0xFFFFFFFF)
			{
			 MultCSAdr=*(Buffer+CS_off-0x0D)+(*(Buffer+CS_off-0x0E)<<8)+r2_base-0x400000;
			 if (*(Buffer+CS_off-0x0E)& 0x80) { MultCSAdr-=0x10000;}
			}
		 else
			{
				 return 0;
			}

			MultCSAdr+=0x40; //Correct Adress with CS number :)

		  for (CS_count = 0; CS_count < 6; CS_count++)
		  {
				TotalSumm++;

				StartAdr1=Read4ByteMot(Buffer+MultCSAdr)-0x400000;
				EndAdr1=Read4ByteMot(Buffer+MultCSAdr+4)-0x400000;
				ChkSumm1= Read4ByteMot(Buffer+MultCSAdr+8);
				CalcSumm1=SummInt16Mot(StartAdr1, EndAdr1, Buffer);
				 if (ChkSumm1==(Read4ByteMot(Buffer+MultCSAdr+12)^0xFFFFFFFF))
					{
					 if (ChkSumm1!=CalcSumm1)
						{
							if (FixCRC)
								{
									Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
									Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
								}
							BadSumm++;
						}
					 }
				 else
				 {
					if (FixCRC)
						{
							Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
							Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
						}
					BadSumm++;
				 }
			MultCSAdr+=0x10;
		  }

			if (RSAFix) //Recalc RSA after CS block fix
				{
				 md5_init(&md5);
				 md5_process(&md5, Buffer+MD5_StartAdr, MD5_EndAdr-MD5_StartAdr+1);
				 md5_finish (&md5, MD5CalcSig);
				 //Encode new RSA Signature
				 mpz_init (PrivExp);
				 mpz_init (Modulus);
				 mpz_init (CalcSig);
				 mpz_init (Sig);
				 RSABuf[0]=0x00;
				 RSABuf[1]=0x01;
				 memset (RSABuf+2, 0xFF, 0x6D);
				 RSABuf[0x6F]=0x00;
				 memcpy(RSABuf+0x70, MD5CalcSig, 0x10);
				 mpz_import (Sig, 0x80, 1, 1, 0, 0, RSABuf);
				 mpz_import (Modulus, 0x80, 1, 1, 0, 0, RSAPubModulus);
				 mpz_import (PrivExp, 0x80, 1, 1, 0, 0, RSAPrivExp);
				 mpz_powm (CalcSig, Sig, PrivExp, Modulus);
				 rsa_size=mpz_sizeinbase(CalcSig, 2);
				 rsa_size=rsa_size/8+1;
				 mpz_export(RSABuf, &rsa_size, 1, 1, 0, 0, CalcSig);
				 mpz_clear (PrivExp);
				 mpz_clear (Modulus);
				 mpz_clear (CalcSig);
				 mpz_clear (Sig);
				 memcpy(Buffer+RSASignature, RSABuf, 0x80);
				}


		 //Fourth CS Block
		 CS_off=FindHexStr(CS_off+16, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , EcuBlockSig1, EcuHexCount1);
		 CS_off=FindHexStr(CS_off+16, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , EcuBlockSig1, EcuHexCount1);
		 CS_off=FindHexStr(CS_off+16, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , EcuBlockSig1, EcuHexCount1);
		 if (CS_off!=0xFFFFFFFF)
			{
			 MultCSAdr=*(Buffer+CS_off-0x0D)+(*(Buffer+CS_off-0x0E)<<8)+(*(Buffer+CS_off-0x11)<<16)+(*(Buffer+CS_off-0x12)<<24);
			 if (*(Buffer+CS_off-0x0E)& 0x80) { MultCSAdr-=0x10000;}
			}
		 else
			{
				 return 0;
			}

			MultCSAdr+=0x90; //Correct Adress with CS number :)

		  for (CS_count = 0; CS_count < 55; CS_count++)
		  {
				TotalSumm++;

				StartAdr1=Read4ByteMot(Buffer+MultCSAdr);
				EndAdr1=Read4ByteMot(Buffer+MultCSAdr+4);
				ChkSumm1= Read4ByteMot(Buffer+MultCSAdr+8);
				CalcSumm1=SummInt16Mot(StartAdr1, EndAdr1, Buffer);
				 if (ChkSumm1==(Read4ByteMot(Buffer+MultCSAdr+12)^0xFFFFFFFF))
					{
					 if (ChkSumm1!=CalcSumm1)
						{
							if (FixCRC)
								{
									Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
									Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
								}
							BadSumm++;
						}
					 }
				 else
				 {
					if (FixCRC)
						{
							Write4ByteMot(CalcSumm1, Buffer+MultCSAdr+8);
							Write4ByteMot(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
						}
					BadSumm++;
				 }
			MultCSAdr+=0x10;
		  }



	 dllECUinfo->BadChkSumNumber=BadSumm;  //Bad CheckSumm number in dump
	 dllECUinfo->ChkSumNumber=TotalSumm;  //CheckSumm number in dump
	 return 1;
}
コード例 #6
0
ファイル: module4.cpp プロジェクト: nyetwurk/IronFelix
int FindFixCRC(ECU_info* dllECUinfo, int FixCRC)
{
    unsigned int StartAdr1, EndAdr1, StartAdr2, EndAdr2, StartAdr3, EndAdr3, ChkSumAdr1, ChkSumAdr2, ChkSumAdr3, CS_off, CS_count;
    unsigned int ChkSumm1=0, ChkSumm2=0, ChkSumm3=0, CalcSumm1, CalcSumm2, CalcSumm3, TotalSumm=0, BadSumm=0, MultCSAdr;
    //Signature Block CheckSumm
    unsigned char CSummSig1[]= {0x00, 0x00, 0x80, 0x00, 0xFD, 0x5E, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0xFB, 0x80, 0x00};
    unsigned char CSummSig2[]= {0x00, 0x00, 0x80, 0x00, 0xFF, 0x5F, 0x80, 0x00, 0x00, 0x80, 0x80, 0x00, 0xFF, 0xFB, 0x80, 0x00};
    unsigned int HexCount=16;
    unsigned char CSummSig3[]= {0x00, 0x00, 0x00, 0x00, 0xFF, 0x3F, 0x00, 0x00};
    unsigned char CSummSig4[]= {0x00, 0xC0, 0x87, 0x00, 0xFF, 0xFF, 0x87, 0x00};
    unsigned int HexCount2=8;



    DWORD Buffer1 = (DWORD)dllECUinfo->EcuBuffer;
    unsigned char* Buffer= (unsigned char*)(Buffer1);

    /*	 //Calc and check Block Checksumm (803c)
    	 StartAdr1=0x0000;
    	 EndAdr1=Read4ByteIntel(Buffer+0x8030)-0x800000;
    	 StartAdr2=Read4ByteIntel(Buffer+0x8034)+2-0x800000;
    	 EndAdr2=Read4ByteIntel(Buffer+0x8014)-0x800000;
    	 ChkSumAdr1=0x803C;


    		TotalSumm++;
    		ChkSumm1=*(Buffer+ChkSumAdr1)+(*(Buffer+ChkSumAdr1+1)<<8);
    		CalcSumm1=SummBlock(StartAdr1, EndAdr1, Buffer);
    		CalcSumm1+=SummBlock(StartAdr2, EndAdr2, Buffer);
    			 if (ChkSumm1!=CalcSumm1)
    				{
    					if (FixCRC)
    						{
    							*(Buffer+ChkSumAdr1)=CalcSumm1;
    							*(Buffer+ChkSumAdr1+1)=CalcSumm1>>8;
    						}
    					BadSumm++;
    				}
    */
    //Cacl and check full block checksumm
    ChkSumAdr1=0x07FFE0;

    CS_off=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , CSummSig1, HexCount);
    if (CS_off==0xFFFFFFFF)
    {
        CS_off=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , CSummSig2, HexCount);
        if (CS_off==0xFFFFFFFF)
        {
            return 0;
        }
    }

    ChkSumm1= Read4ByteIntel(Buffer+ChkSumAdr1);
    CalcSumm1=0;
    for (CS_count= 0; CS_count < 5; CS_count++)
    {
        StartAdr1=Read4ByteIntel(Buffer+CS_off)-0x800000;
        EndAdr1=Read4ByteIntel(Buffer+CS_off+4)-0x800000;
        CS_off+=8;
        CalcSumm1+=SummInt16Intel(StartAdr1, EndAdr1, Buffer);
    }

    TotalSumm++;


    if (ChkSumm1==(Read4ByteIntel(Buffer+ChkSumAdr1+4)^0xFFFFFFFF))
    {
        if (ChkSumm1!=CalcSumm1)
        {
            if (FixCRC)
            {
                Write4ByteIntel(CalcSumm1, Buffer+ChkSumAdr1);
                Write4ByteIntel(CalcSumm1^0xFFFFFFFF, Buffer+ChkSumAdr1+4);
            }
            BadSumm++;
        }
    }
    else
    {
        if (FixCRC)
        {
            Write4ByteIntel(CalcSumm1, Buffer+ChkSumAdr1);
            Write4ByteIntel(CalcSumm1^0xFFFFFFFF, Buffer+ChkSumAdr1+4);
        }
        BadSumm++;
    }



    //Cacl and check multipoint checksumm
    StartAdr2=FindHexStr(0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , CSummSig3, HexCount2);
    if (StartAdr2==0xFFFFFFFF)
    {
        return 0;
    }
    EndAdr2=FindHexStr(StartAdr2+0x01E0, dllECUinfo->EcuFileSize, (unsigned char*)Buffer , CSummSig4, HexCount2);
    if (EndAdr2==0xFFFFFFFF)
    {
        return 0;
    }
    EndAdr2+=0x0F;

    for (MultCSAdr = StartAdr2; MultCSAdr < EndAdr2; MultCSAdr+=0x10)
    {

        StartAdr1=Read4ByteIntel(Buffer+MultCSAdr);
        EndAdr1=Read4ByteIntel(Buffer+MultCSAdr+4);
        if ( StartAdr1>=0x800000)
        {
            StartAdr1-=0x800000;
            EndAdr1-=0x800000;

            TotalSumm++;
            if (EndAdr1<=dllECUinfo->EcuFileSize)
            {
                ChkSumm1= Read4ByteIntel(Buffer+MultCSAdr+8);
                CalcSumm1=SummInt16Intel(StartAdr1, EndAdr1, Buffer);
                if (ChkSumm1==(Read4ByteIntel(Buffer+MultCSAdr+12)^0xFFFFFFFF))
                {
                    if (ChkSumm1!=CalcSumm1)
                    {
                        if (FixCRC)
                        {
                            Write4ByteIntel(CalcSumm1, Buffer+MultCSAdr+8);
                            Write4ByteIntel(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
                        }
                        BadSumm++;
                    }
                }
                else
                {
                    if (FixCRC)
                    {
                        Write4ByteIntel(CalcSumm1, Buffer+MultCSAdr+8);
                        Write4ByteIntel(CalcSumm1^0xFFFFFFFF, Buffer+MultCSAdr+12);
                    }
                    BadSumm++;
                }
            }
            else break;
        }
    }

    dllECUinfo->BadChkSumNumber=BadSumm;  //Bad CheckSumm number in dump
    dllECUinfo->ChkSumNumber=TotalSumm;  //CheckSumm number in dump
    return 1;
}