Важно ли поле Имя каждой таблицы метаданных в файловой структуре Dotnet? - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь удалить файл Dotnet, который был запутан Eazfuscator.NET в руководстве.Просто для удовольствия и для изучения.

Насколько я знаю, файлы Dotnet могут быть декомпилированы декомпиляторами.Итак, я подумал, что могу открыть файл и экспортировать его в файл проекта и скомпилировать его.Но это не так.Поскольку имена переменных, функций, пространств имен находятся за пределами отображаемой области (например, более 0x80).

В то время я думал, что экспорт в проектную функцию будет работать нормально, если я исправлю невоспроизводимые имена.Поэтому я фиксирую все имена в таблице метаданных.Но все же это не работает.

Важно ли поле Имя каждой таблицы метаданных в структуре файла Dotnet?

Если это так, есть ливажное правило именования?

Пожалуйста, помогите мне.

Вот мой частичный код и идея.Мой код написан на python3 и наследует pefile.

  1. Путешествуйте по таблице метаданных и находите отображаемые строки
    def arrange_cor20_Strings_index(self):
        metadataRootOffset = self.get_offset_from_rva(self.COR20_HEADER.METADATA.VirtualAddress)
        # { Original offset ( Index 0 contains an index for a new string ) :
        #     Arranged offset ( -1 means undisplayable)
        # }
        strings = {}
        for streamHeader in self.COR20_HEADER.STREAM_HEADERS:
            streamName = streamHeader.Name.decode()
            if streamName == "#Strings":
                streamOffset = metadataRootOffset + streamHeader.Offset
                rawStream = self.__data__[streamOffset:streamOffset + streamHeader.Size]

                if len(rawStream) > 0:
                    string = []
                    stringIndex = 0
                    arrangedIndex = 0
                    for index in range(len(rawStream)):
                        if rawStream[index] == 0:
                            # strings[stringIndex] = "".join([chr(c) for c in string])
                            if self.isDisplayable(string) == True:
                                strings[stringIndex] = arrangedIndex
                                arrangedIndex = arrangedIndex + len(string) + 1
                            else:
                                strings[stringIndex] = -1
                            string = []
                            stringIndex = index + 1
                            continue
                        string.append(rawStream[index])
                    strings[0] = arrangedIndex
                break
        return strings
Сохранять отображаемые строки и удалять неотображаемые
    def arrange_cor20_Strings_strings(self):
        for originIndex in self.dictArrangedIndex.keys():
            if originIndex == 0:
                self.dictArrangedStrings[originIndex] = []
                continue
            if self.dictArrangedIndex[originIndex] != -1:
                self.dictArrangedStrings[self.dictArrangedIndex[originIndex]] =\
                    self.COR20_HEADER.STREAMS["#Strings"][originIndex]
Исправить не отображаемые строки в таблице метаданных
    ...

    def fix_cor20_Strings_metadata_Module(self, metadata):
        strForm = "M%d"
        index = self.rearrange_cor20_Strings_heap(metadata.Name, strForm)
        metadata.Name = index
        return metadata

    def fix_cor20_Strings_metadata_TypeRef(self, metadata):
        strForm = "TRN%d"
        index = self.rearrange_cor20_Strings_heap(metadata.TypeName, strForm)
        metadata.TypeName = index
        strForm = "TRNS%d"
        index = self.rearrange_cor20_Strings_heap(metadata.TypeNamespace, strForm)
        metadata.TypeNamespace = index
        return metadata

    ...

    def fix_cor20_Strings_metadata(self, metadata):
        fixedMetadata = {}
        #print(metadata)
        if metadata.name == self.__IMAGE_COR20_METADATA_MODULE_format__[0]: # 0
            fixedMetadata = self.fix_cor20_Strings_metadata_Module(metadata)
        elif metadata.name == self.__IMAGE_COR20_METADATA_TYPEREF_format__[0]: # 1
            fixedMetadata = self.fix_cor20_Strings_metadata_TypeRef(metadata)
        elif metadata.name == self.__IMAGE_COR20_METADATA_TYPEDEF_format__[0]: # 2
            fixedMetadata = self.fix_cor20_Strings_metadata_TypeDef(metadata)
        ...

    ...

    # { metadata.name :
    #     fixed count
    # }
    dictFixedCnt = {}
    # { Original offset ( Index 0 contains an index for a new string ) :
    #     Arranged offset ( -1 means undisplayable)
    # }
    dictArrangedIndex = {}
    # { String offset :
    #     String
    # }
    dictArrangedStrings = {}

    def fix_cor20_Strings(self):
        self.dictArrangedIndex = self.arrange_cor20_Strings_index()
        self.arrange_cor20_Strings_strings()

        streamName = "#~"
        #print(self.COR20_HEADER.STREAMS[streamName])
        for tagIndex in range(len(self.COR20_HEADER.STREAMS[streamName].Tags)):
            metadataTag = self.COR20_HEADER.STREAMS[streamName].Tags[tagIndex]
            for metadataRow in range(self.COR20_HEADER.STREAMS[streamName].Rows[tagIndex]):
                metadata = self.COR20_HEADER.STREAMS[streamName].Metadatas[metadataTag][metadataRow]
                fixedMetadata = self.fix_cor20_Strings_metadata(metadata)

        self.COR20_HEADER.STREAMS["#Strings"] = self.dictArrangedStrings
...