private void ReplaceResourcesToken(byte[] bytes) { string searchToken = "PublicKeyToken=" + Options.txtOldTokenText; byte[] searchTokenBytes = Encoding.UTF8.GetBytes(searchToken); string replaceToken = "PublicKeyToken=" + Options.txtNewTokenText; byte[] replaceTokenBytes = Encoding.UTF8.GetBytes(replaceToken); int index = BytesUtils.ByteSearch(bytes, searchTokenBytes, 0, bytes.Length); while (index > 0) { for (int i = 0; i < replaceTokenBytes.Length; i++) { bytes[index + i] = replaceTokenBytes[i]; } index = BytesUtils.ByteSearch(bytes, searchTokenBytes, index + searchTokenBytes.Length, bytes.Length - index - searchTokenBytes.Length); } }
private void FixByteReference(byte[] bytes, string adName, byte[] token) { const int TOKEN_LEN = 16; string searchName = String.Format("{0}, Version=", adName); byte[] searchBytes = Encoding.UTF8.GetBytes(searchName); string searchToken = "PublicKeyToken="; byte[] searchTokenBytes = Encoding.UTF8.GetBytes(searchToken); string searchNull = "null"; byte[] searchNullBytes = Encoding.UTF8.GetBytes(searchNull); string searchNullLong = "null ";//16 bytes byte[] searchNullLongBytes = Encoding.UTF8.GetBytes(searchNullLong); string tokenString = TokenUtils.GetReferenceTokenString(token); byte[] tokenStringBytes = Encoding.UTF8.GetBytes(tokenString); int index = BytesUtils.ByteSearch(bytes, searchBytes, 0, bytes.Length); while (index > 0) { index = BytesUtils.ByteSearch(bytes, searchTokenBytes, index + searchBytes.Length, bytes.Length - index - searchBytes.Length); if (index > 0) { index = index + searchTokenBytes.Length; if (token == null) { if (BytesUtils.ByteSearch(bytes, searchNullBytes, index, searchNullBytes.Length) == index) { } else { for (int i = 0; i < searchNullBytes.Length; i++) { bytes[index + i] = searchNullBytes[i]; } index += searchNullBytes.Length; for (int i = 0; i < TOKEN_LEN - searchNullBytes.Length; i++) { bytes[index + i] = 0x20; } } } else { if (BytesUtils.ByteSearch(bytes, searchNullBytes, index, searchNullBytes.Length) == index) { if (BytesUtils.ByteSearch(bytes, searchNullLongBytes, index, searchNullLongBytes.Length) == index) { for (int i = 0; i < tokenStringBytes.Length; i++) { bytes[index + i] = tokenStringBytes[i]; } } else { #region complicated, found PublicKeyToken=null and need to extend space to sign, ignore now /* * //1. extend bytes array * //2. amend bytes length for custom attribute or resource * // * // below is old code for custom attribute only * { * int endIndex = index + 4; * int sizeIndex = 2; * bool ok = false; * if (endIndex - sizeIndex - 1 == (int)bytes[sizeIndex]) * { * ok = true; * } * else * { * sizeIndex++; * if (endIndex - sizeIndex - 1 == (int)bytes[sizeIndex]) * { * ok = true; * } * } * * if (ok)//need to extend * { * byte[] newBytes = new byte[bytes.Length + 12]; * Array.Copy(bytes, newBytes, index); * Array.Copy(tokenStringBytes, newBytes, tokenStringBytes.Length); * for (int i = index + 4; i < bytes.Length; i++) * { * newBytes[i + 12] = bytes[i]; * } * newBytes[sizeIndex] += 12; * * result = newBytes; * bytes = newBytes; * } * else * { * endIndex = index + 16; * sizeIndex = 2; * ok = false; * if (endIndex - sizeIndex - 1 == (int)bytes[sizeIndex]) * { * ok = true; * } * else * { * sizeIndex++; * if (endIndex - sizeIndex - 1 == (int)bytes[sizeIndex]) * { * ok = true; * } * } * * if (ok) //enough room * { * for (int i = 0; i < tokenStringBytes.Length; i++) * { * bytes[index + i] = tokenStringBytes[i]; * } * } * } * } */ #endregion complicated, found PublicKeyToken=null and need to extend space to sign } } else { for (int i = 0; i < tokenStringBytes.Length; i++) { bytes[index + i] = tokenStringBytes[i]; } } } index = BytesUtils.ByteSearch(bytes, searchBytes, index + searchTokenBytes.Length, bytes.Length - index - searchTokenBytes.Length); } //end if searchToken found } //end if searchName found }