|
1 | 1 | using System; |
2 | 2 | using System.IO; |
3 | 3 | using System.Text.RegularExpressions; |
| 4 | +using SabreTools.Hashing; |
4 | 5 | using SabreTools.IO.Compression.zlib; |
5 | 6 | using SabreTools.Models.InstallShieldCabinet; |
6 | 7 | using static SabreTools.Models.InstallShieldCabinet.Constants; |
@@ -76,6 +77,11 @@ public int MajorVersion |
76 | 77 |
|
77 | 78 | #region Constants |
78 | 79 |
|
| 80 | + /// <summary> |
| 81 | + /// Default buffer size |
| 82 | + /// </summary> |
| 83 | + private const int BUFFER_SIZE = 64 * 1024; |
| 84 | + |
79 | 85 | /// <summary> |
80 | 86 | /// Maximum size of the window in bits |
81 | 87 | /// </summary> |
@@ -556,5 +562,63 @@ public unsafe static int UncompressOld(byte[] dest, ref ulong destLen, byte[] so |
556 | 562 | } |
557 | 563 |
|
558 | 564 | #endregion |
| 565 | + |
| 566 | + #region Obfuscation |
| 567 | + |
| 568 | + /// <summary> |
| 569 | + /// Deobfuscate a buffer |
| 570 | + /// </summary> |
| 571 | + private void Deobfuscate(byte[] buffer, long size, ref uint offset) |
| 572 | + { |
| 573 | + offset = Deobfuscate(buffer, size, offset); |
| 574 | + } |
| 575 | + |
| 576 | + /// <summary> |
| 577 | + /// Deobfuscate a buffer with a seed value |
| 578 | + /// </summary> |
| 579 | + /// <remarks>Seed is 0 at file start</remarks> |
| 580 | + private static uint Deobfuscate(byte[] buffer, long size, uint seed) |
| 581 | + { |
| 582 | + for (int i = 0; size > 0; size--, i++, seed++) |
| 583 | + { |
| 584 | + buffer[i] = (byte)(ROR8(buffer[i] ^ 0xd5, 2) - (seed % 0x47)); |
| 585 | + } |
| 586 | + |
| 587 | + return seed; |
| 588 | + } |
| 589 | + |
| 590 | + /// <summary> |
| 591 | + /// Obfuscate a buffer |
| 592 | + /// </summary> |
| 593 | + private void Obfuscate(byte[] buffer, long size, ref uint offset) |
| 594 | + { |
| 595 | + offset = Obfuscate(buffer, size, offset); |
| 596 | + } |
| 597 | + |
| 598 | + /// <summary> |
| 599 | + /// Obfuscate a buffer with a seed value |
| 600 | + /// </summary> |
| 601 | + /// <remarks>Seed is 0 at file start</remarks> |
| 602 | + private static uint Obfuscate(byte[] buffer, long size, uint seed) |
| 603 | + { |
| 604 | + for (int i = 0; size > 0; size--, i++, seed++) |
| 605 | + { |
| 606 | + buffer[i] = (byte)(ROL8(buffer[i] ^ 0xd5, 2) + (seed % 0x47)); |
| 607 | + } |
| 608 | + |
| 609 | + return seed; |
| 610 | + } |
| 611 | + |
| 612 | + /// <summary> |
| 613 | + /// Rotate Right 8 |
| 614 | + /// </summary> |
| 615 | + private static int ROR8(int x, byte n) => (x >> n) | (x << (8 - n)); |
| 616 | + |
| 617 | + /// <summary> |
| 618 | + /// Rotate Left 8 |
| 619 | + /// </summary> |
| 620 | + private static int ROL8(int x, byte n) => (x << n) | (x >> (8 - n)); |
| 621 | + |
| 622 | + #endregion |
559 | 623 | } |
560 | 624 | } |
0 commit comments