Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
1

Поиск и изменение HEX в файле

25.03.2017, 22:58. Показов 1412. Ответов 5
Метки нет (Все метки)

Помогите пожалуйста решить проблему
Есть бинарный файл. Размер около 100 Мбайт.
Есть HEX значения которые нужно поменять на другие и сохранить все это в другой файл. 31 31 33 34 -> 31 35 30 30

Вот так считываю файл и получаю HEX строку:
C#
1
2
3
4
5
6
7
8
9
FileStream fs = new FileStream("1.dll", FileMode.Open);
            int hexIn;
            String hex="";
            
          
            for (int i = 0; (hexIn = fs.ReadByte()) != -1; i++)
            {   
                    hex += string.Format("{0:X2}", hexIn);
            }
Далее в ней ищу 31313334, меняю на 31353030
И пытаюсь записать, предварительно конвертируя hex в byte
C#
1
2
3
4
5
6
7
public static byte[] StringToByteArray(string hex)
        {
            return Enumerable.Range(0, hex.Length)
                             .Where(x => x % 2 == 0)
                             .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                             .ToArray();
        }

C#
1
File.WriteAllBytes("2.dll", StringToByteArray(hex));
Так вот проблема в том, что конвертации из HEX при таком объеме происходит очень долго. Как можно сделать это быстро? Или может вообще есть куда более просто решение?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.03.2017, 22:58
Ответы с готовыми решениями:

Поиск и замена hex значения в dll файле
Как мне найти и заменить несколько hex значений в dll файле?

Поиск и замена hex значения в dll файле
Как мне найти и заменить несколько hex значений в dll файле?

Поиск hex значения в файле и получение его смещения
Всем доброго времени суток. Есть последовательность в виде b'\x69\x13\x0f' надо найти её в файле...

Поиск в текстовом файле и его изменение
Есть файл .тхт, примерно такой структуры: cost 200/комент weight 3.0/комент и ище...

5
4700 / 3244 / 1375
Регистрация: 09.05.2015
Сообщений: 7,955
25.03.2017, 23:06 2
А зачем туда-сюда конвертировать то? Ищите сразу байты и меняйте их...
0
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
25.03.2017, 23:23  [ТС] 3
тогда возникает вопрос как в массиве искать последовательность байт?
у меня очень небольшой опыт в с#.
0
4700 / 3244 / 1375
Регистрация: 09.05.2015
Сообщений: 7,955
25.03.2017, 23:32 4
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
using System;
using System.Collections.Generic;
 
    internal static class FindPatterns
    {
        public static uint Find(byte[] data, byte[] patternBytes, string mask)
        {
            if ((data == null) || (data.Length == 0))
            {
                throw new ArgumentNullException("data");
            }
            if ((patternBytes == null) || (patternBytes.Length == 0))
            {
                throw new ArgumentNullException("patternBytes");
            }
            if (mask == string.Empty)
            {
                throw new ArgumentNullException("mask");
            }
            if (patternBytes.Length != mask.Length)
            {
                throw new ArgumentException("Pattern and Mask lengths must be the same.");
            }
            int length = patternBytes.Length;
            int num2 = data.Length - length;
            for (int i = 0; i < num2; i++)
            {
                bool flag = true;
                for (int j = 0; j < length; j++)
                {
                    if (((mask[j] == 'x') && (patternBytes[j] != data[i + j])) || ((mask[j] == '!') && (patternBytes[j] == data[i + j])))
                    {
                        flag = false;
                        break;
                    }
                }
                if (flag)
                {
                    return (uint)i;
                }
            }
            return -1;
        }
 
        public static uint[] FindAll(byte[] data, byte[] patternBytes, string mask)
        {
            List<uint> list = new List<uint>();
            for (int i = 0; i < (data.Length - patternBytes.Length); i++)
            {
                bool flag = true;
                for (int j = 0; j < patternBytes.Length; j++)
                {
                    if (((mask[j] == 'x') && (patternBytes[j] != data[i + j])) || ((mask[j] == '!') && (patternBytes[j] == data[i + j])))
                    {
                        flag = false;
                        break;
                    }
                }
                if (flag)
                {
                    list.Add((uint)i);
                }
            }
            return list.ToArray();
        }
    }
C#
1
2
3
4
5
6
7
8
9
var data = File.ReadAllBytes(...);
uint offset = FindPatterns.Find(data, new byte[] { 0x31, 0x31, 0x33, 0x34 }, "xxxx");
// после перезаписываете в файле по найденным смещениям новые байты...
using (FileStream fStream = File.Open(path, FileMode.Open))
{
    byte[] newBytes = new byte[] { 0x31, 0x35, 0x30, 0x30 };
    fStream.Position = offset;
    fStream.Write(newBytes, 0, newBytes.Length);
}
1
869 / 658 / 214
Регистрация: 30.04.2009
Сообщений: 2,741
26.03.2017, 00:30 5
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
        static void Main(string[] args)
        {
            byte[] sourceBytes = StringHexToByteArray("31313334");
            byte[] targetBytes = StringHexToByteArray("31353030");
            
            BinaryReplace("tmp.dll", sourceBytes, "tmp_patched.dll", targetBytes);
        }
 
        public static void BinaryReplace(string sourceFile, byte[] sourceSeq, string targetFile, byte[] targetSeq)
        {
            FileStream sourceStream = File.OpenRead(sourceFile);
            FileStream targetStream = File.Create(targetFile);
            
            try
            {
                int b;
                long foundSeqOffset = -1;
                int searchByteCursor = 0;
 
                while ((b=sourceStream.ReadByte()) != -1)
                {
                    if (sourceSeq[searchByteCursor] == b)
                    {
                        if (searchByteCursor == sourceSeq.Length - 1)
                        {
                            targetStream.Write(targetSeq, 0, targetSeq.Length);
                            searchByteCursor = 0;
                            foundSeqOffset = -1;
                        }
                        else 
                        {
                            if (searchByteCursor == 0)
                            {
                                foundSeqOffset = sourceStream.Position - 1;
                            }
 
                            ++searchByteCursor;
                        }
                    }
                    else
                    {
                        if (searchByteCursor == 0)
                        {
                            targetStream.WriteByte((byte) b);
                        }
                        else
                        {
                            targetStream.WriteByte(sourceSeq[0]);
                            sourceStream.Position = foundSeqOffset + 1;
                            searchByteCursor = 0;
                            foundSeqOffset = -1;
                        }
                    }
                }
            }
            finally
            {
                sourceStream.Dispose();
                targetStream.Dispose();
            }
        }
 
        public static byte[] StringHexToByteArray(String hex)
        {
            int NumberChars = hex.Length;
            byte[] bytes = new byte[NumberChars / 2];
            for (int i = 0; i < NumberChars; i += 2)
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            return bytes;
        }
0
0 / 0 / 0
Регистрация: 25.03.2017
Сообщений: 3
26.03.2017, 00:55  [ТС] 6
Someone007, Спасибо, помогло
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.03.2017, 00:55

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Редактирование hex значений в файле
Всем привет. Не знаю как сделать то что на 2 скриншотах. На 1 до, на втором - после. В какую...

Изменение нужного байта, hex редактор
Запустил *.exe, нашел через читЕнджи нужный адрес 4d215c, кликнул на него и показало *.exe+d215c -...

Hex редактирование - замена строк в файле
Есть файл (вернее 3d модель) в котором нужно сменить имя текстуры, при помощи Free Hex Editor Neo...

Поиск hex в строке
Привет. У меня задан hex массив str2 = {0x79, 0x65, 0x6C, 0x6C}; как найти эту последовательность в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.