Как восстановить потерянный исходный код?

У меня есть однофункциональная DLL, которая экспортирует GetHash(). Однако исходный код этой библиотеки DLL утерян. Мне нужно интегрировать этот код в мой проект MSVC++.

Я знаю, что для этого существуют условно-бесплатные инструменты, но я думаю, что смогу сделать это вручную.

Что мне нужно сделать, чтобы выполнить это вручную?


person Svetlana    schedule 09.03.2009    source источник
comment
Что касается моего редактирования: я думаю, что изменение заголовка принесет набор ответов, которые в конечном итоге будут более полезными для этого пользователя. Однако я сомнительно отношусь к изменению, поскольку оно меняет тип ответов, которые могут появиться.   -  person Gavin Miller    schedule 09.03.2009
comment
Я могу помочь с ручной декомпиляцией, если она вам все еще нужна.   -  person    schedule 05.11.2010


Ответы (3)


В создаваемом проекте укажите ссылку на dll и вызовите хеш-функцию. Запустите код в отладчике, войдите в него, дизассемблируйте функцию и переведите ее обратно на язык высокого уровня.

Если этого недостаточно, разберите код на ряд функций, которые вы можете реализовать с помощью блоков ASM.

person plinth    schedule 09.03.2009

У вас есть файл LIB для DLL? Файл H(eader)? Оба необходимы для статической компоновки, что является самым простым способом.

В противном случае, самый простой маршрут, вероятно, просто связать его динамически. (Если это не COM-DLL — вам нужно использовать RegSvr32? Если да, вы можете сослаться на нее и назвать ее COM-стилем.) Для этого вы используете LoadLibrary() и GetProcAddress() для получения указателя на функцию. И здесь все становится сложнее: какое соглашение о вызовах использует функция, какие параметры и какой тип возвращаемого значения? Если они у вас есть, вы можете определить соответствующий тип указателя функции (например, "int fphasher*(char *)"). В противном случае приготовьтесь к большому количеству забавных экспериментов или даже разбору листинга, чтобы все получилось правильно...

Средство просмотра DLL, такое как DllExportViewer, может помочь с правильным названием функции и получить некоторые подсказки. следует ли использовать соглашения о вызовах в стиле C++ или C. Предостережение: я не тестировал эту конкретную версию.

person Pontus Gagge    schedule 09.03.2009

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

Это, вероятно, будет более долгосрочным решением этой проблемы.

person Gavin Miller    schedule 09.03.2009