Существует ли декомпилятор C++? [закрытый]

Хотя стандартная практика заключается в реализации интерфейса ICloneable (описанный здесь здесь , поэтому я не буду срыгиваться), вот хороший клон для клон-клонов, который я нашел на Код проекта некоторое время назад и включил его в наш материал.

Как уже упоминалось в другом месте, это требует, чтобы ваши объекты были сериализуемыми.

using System;
using System.IO;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;

/// 
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx
/// Provides a method for performing a deep copy of an object.
/// Binary Serialization is used to perform the copy.
/// 
public static class ObjectCopier
{
    /// 
    /// Perform a deep Copy of the object.
    /// 
    /// The type of object being copied.
    /// The object instance to copy.
    /// The copied object.
    public static T Clone(T source)
    {
        if (!typeof(T).IsSerializable)
        {
            throw new ArgumentException("The type must be serializable.", "source");
        }

        // Don't serialize a null object, simply return the default for that object
        if (Object.ReferenceEquals(source, null))
        {
            return default(T);
        }

        IFormatter formatter = new BinaryFormatter();
        Stream stream = new MemoryStream();
        using (stream)
        {
            formatter.Serialize(stream, source);
            stream.Seek(0, SeekOrigin.Begin);
            return (T)formatter.Deserialize(stream);
        }
    }
}

Идея состоит в том, что он сериализует ваш объект и затем десериализует его в новый объект. Преимущество в том, что вам не нужно беспокоиться о клонировании всего, когда объект становится слишком сложным.

И с использованием методов расширения (также из исходного источника):

Если вы предпочитаете использовать новые методы расширения для C # 3.0, измените метод на наличие следующей сигнатуры:

public static T Clone(this T source)
{
   //...
}

Теперь вызов метода просто становится objectBeingCloned.Clone();.

EDIT (10 января 2015 г.) Думал, что передумал, отметив, что я недавно начал использовать (Newtonsoft) Json для этого, он должен быть легче, и избегает накладные расходы [Сериализуемые] теги. (NB @atconway указал в комментариях, что частные члены не клонируются с использованием метода JSON)

/// 
/// Perform a deep Copy of the object, using Json as a serialisation method. NOTE: Private members are not cloned using this method.
/// 
/// The type of object being copied.
/// The object instance to copy.
/// The copied object.
public static T CloneJson(this T source)
{            
    // Don't serialize a null object, simply return the default for that object
    if (Object.ReferenceEquals(source, null))
    {
        return default(T);
    }

    // initialize inner objects individually
    // for example in default constructor some list property initialized with some values,
    // but in 'source' these items are cleaned -
    // without ObjectCreationHandling.Replace default constructor values will be added to result
    var deserializeSettings = new JsonSerializerSettings {ObjectCreationHandling = ObjectCreationHandling.Replace};

    return JsonConvert.DeserializeObject(JsonConvert.SerializeObject(source), deserializeSettings);
}

106
задан abatishchev 6 April 2009 в 17:42
поделиться

5 ответов

Можно использовать IDA Pro Шестнадцатеричные Лучи . Вы не будете обычно вытаскивать хороший C++ из двоичного файла, если Вы не скомпилировали в отладочной информации. Подготовьтесь тратить партия из физического труда, инвертирующего код.

, Если Вы не разделяли двоичные файлы, существует некоторая надежда, поскольку IDA Pro может произвести код C-alike для Вас для работы с. Обычно это очень грубо, хотя, по крайней мере, когда я использовал его несколько лет назад.

77
ответ дан David Holm 24 November 2019 в 03:52
поделиться

информация отбрасывается в процессе компиляции. Даже если декомпилятор мог бы произвести логический эквивалентный код с классами и всем (это, вероятно, не может), части самодокументирования не стало в оптимизированном коде выпуска. Никакие имена переменной, никакие стандартные имена, никакие имена классов - просто не обращаются.

24
ответ дан Dustin Getz 24 November 2019 в 03:52
поделиться

Да, но ни одному из них не удастся произвести достаточно читаемый код для стоящего усилия. Вы проведете больше времени, пытаясь считать декомпилируемый источник с ассемблерными блоками внутри, чем перезапись Вашего старого приложения с нуля.

19
ответ дан m_pGladiator 24 November 2019 в 03:52
поделиться

Я не видел декомпиляторов, которые генерируют код C++. Я видел несколько экспериментальных, которые предпринимают разумную попытку генерации C код, но они имели тенденцию зависеть от соответствия шаблонам генерации кода конкретного компилятора (который, возможно, изменился, это было некоторое время, так как я в последний раз изучил это). Конечно, любая символьная информация закончится. Google для "декомпилятора".

6
ответ дан Ferruccio 24 November 2019 в 03:52
поделиться

В зависимости от того, насколько большой, и насколько правильно написанный исходный код был, это могло бы стоить запустить снова на Вашем любимом языке (который мог бы все еще быть C++), и учащийся на любых ошибках, сделанных в последней версии. Кто-то однажды не сказал о записи той для выбрасывания?

n.b. Очевидно, если это - огромный продукт, то это не может стоить времени.

2
ответ дан harriyott 24 November 2019 в 03:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: