Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.51/104: Рейтинг темы: голосов - 104, средняя оценка - 4.51
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615

Декомпиляция dll файла

04.04.2017, 17:22. Показов 20539. Ответов 53
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читал, все говорят что можно, а чем не пишут.
Сам файл размером 101 Кб. Написан он по любому на C и/или C++.

Как его можно отчекрыжить?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
04.04.2017, 17:22
Ответы с готовыми решениями:

Декомпиляция из dll в C++
У меня есть библиотека dll, как её можно декомпилировать в C++? Точно знаю, что она написана на C++ Пытался декомпилировать вот тут...

Декомпиляция dll
Возможна ли декомпиляция dll'ки, защищенной Themida, если есть ThemidaSDK.h и Obfuscator.cpp, с помощью которых была скомпилирована эта dll...

Кто может поделиться файлами ogg.dll, vorbis.dll и vorbisfile.dll - 32-х и 64-битными версиями?
Движок перевожу на платформу Win64 и нужно, чтобы разрядность ЕХЕ и DLL совпадали, а в интернете искал 64-битные версии ogg.dll, vorbis.dll...

53
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
31.03.2018, 17:41  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Someone007 Посмотреть сообщение
Зачем его компилировать обратно тогда? Разобрали логику работы защиты по коду из Hex-Rays, поправили asm прямо в exe и все.
Зачем нужны эти лишние телодвижения?
Я не понимаю в ASM, и после изменения ничего не работает, пробовал уже, на другом...

Такая строка, регламент функции:
C++
1
_BOOL8 __fastcall sub_140001A70(const WCHAR *a1, const wchar_t *a2);
Ошибка: идентификатор _BOOL8 не определён.
Я так понимаю что 8 - это количество бит, файл 64х разрядный, видимо сделано в однобайтный тип?
Т.е. можно выше макросом сделать:

C++
1
typedef bool _BOOL8;
Работать работает, только не уверен на счёт bool.
Эти типы дурацкие с кучей имён, которые одно и тоже означают...
0
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
31.03.2018, 21:08  [ТС]
Ооочень много ошибок...

С другой стороны, можно попробовать в HexEdit заменить.

Чит замудрёный, ключи хранятся на сервере, видимо по какому-то идентификатору системы хранит использование ключа.
Кроме этого, он типа "защищён" от изменения, я полагаю, он создаёт свою копию где-то, пересчитывает сумму, и в итоге выдаёт да или нет(не рассматривал алгоритм).
Скачивается заново, а изменённая версия удаляется, причём всё это типа "не закрываясь".
Автор просто параноик.

Но, вот тут:

C++
1
2
3
4
5
6
7
8
9
10
// В v12 приходит строка с ответом от сервера
v12 = (char *)sub_14000E9D0(off_140053000[0], (const WCHAR *)DstBuf, 0i64, 0, 0);
 
// Тут проверяется есть ли в ответе подстрока
if ( sub_14000A910(v12, "trial not available") )
{
    v2 = GetDlgItem(hDlg, 1006); // Что-то там неинтересное, идентификатор объекта куда выводить...
    qword_1400549B8(v2, L"Trial not available."); // Вывести сообщение в эдит
    result = 0i64; // Выход
}

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
lea     rdx, aTrialNotAvaila ; "trial not available"
mov     rcx, [rsp+5E8h+var_5B8]
call    sub_14000A910
test    rax, rax ; ---------------- Сравнение ---------------------
jbe     short loc_140002360 ; ----------------------А это нужно заменить, т.е. если строки не равны, переход на другой кусок кода
mov     edx, 3EEh       ; nIDDlgItem
mov     rcx, cs:hDlg    ; hDlg
call    cs:GetDlgItem
lea     rdx, aTrialNotAvaila_0 ; "Trial not available."
mov     rcx, rax
call    cs:qword_1400549B8
xor     eax, eax
jmp     loc_140002607
jbe нужно заменить на jnle, вроде бы.

76 или 0F 86
На
7F или 0F 8F

Если я правильно понимаю, раз программа 64х битная, то и команды у неё получается двухбайтовые, а значит мне нужно заменить 0F 86 на 0F 8F.

Только как найти, я смотрел видео, но так и не понял что за оффсеты и как их получить...
В аиде то оно вот:
0
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
31.03.2018, 21:18  [ТС]
Изменил просто сравниваемую строку, теперь "защиту" обошел, и ключ почти тоже.
А искать я так понял проще по вкладке hex...
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
31.03.2018, 21:42
Оффсет инструкции в файле указан в окне иды. Так же можно включить отображение байтов инструкций в окне с дизассемблированным кодом в настройках (Disassembly->Number of opcode bytes).
Миниатюры
Декомпиляция dll файла  
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
01.04.2018, 08:25  [ТС]
Понял, спасибо. )
Всё получилось, почти, чит в процессе подгрузки в игру выдаёт ошибку загрузки чего-то, видимо ещё что-то тут.
Ну принцип понял, как с ассемблерными командами работать, если нет пресловутой защиты.
Начал деобфускацию кода.

Функции же не могут быть такими?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
FARPROC sub_140001020();
__int64 qword_1400549A0; // Больше в коде не встречается
 
FARPROC sub_140001020()
{
    HMODULE v0; // rax
    FARPROC result; // rax
 
    v0 = GetModuleHandleA("Kernel32.dll");
    result = GetProcAddress(v0, "CreateProcessA");
    qword_1400549A0 = (__int64)result;
    return result;
}
Я так понял, Hex-Rays вывалил код вместе с окном и прочими прелестями.
Наверное сначала нужно создать проект с похожим окном и компонентами на нем, и начинать перетаскивать код с функции WinMain?

Добавлено через 9 часов 11 минут
0i64 - это же просто 0, только 64х битный?

Его можно на NULL заменить?
VS потом сама определит скольки битный туда ставить.
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
01.04.2018, 10:35
о господи
вы ерундой занимаетесь.
сколько раз повторять, что для того, что вам нужно нет необходимости использовать дизассемблер.
дизят код когда хотят спереть функции. Например хакерская группа CODEX переписала лаунчер ubisoft с нуля, дизассемблируя оригинальную dll. Они точно скопировали все функции, внесли соответствующие коррективы в работе DRM. Их эмулятор не требует постоянного подключения к интернету и не запрашивает данные с серверов, а запускает игру в офлайне.

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

ещё раз повторяю - скачайте x64dbg и спокойно отлаживайте код как вам нужно. В чём проблема то?
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
01.04.2018, 22:14  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
вы ерундой занимаетесь.
Ну надо же чем-то заниматься. ))

Цитата Сообщение от _lunar_ Посмотреть сообщение
для того, что вам нужно нет необходимости использовать дизассемблер
Да у меня нет конкретной цели на счёт этого чита, в интернете есть бесплатные, и получше.
Мне просто интересно, как это всё устроено.
Не знаю почему, просто захотелось именно этот exeшник поковырять, и получить рабочий исходник.
Заодно посмотрю как происходит инжект и прочее...

Цитата Сообщение от _lunar_ Посмотреть сообщение
Ковырять статику и искать функции через IDA это бред.
Не знаю, скинул полностью декомпиленный код на С++, вполне себе читаемый, подумаешь названия функций сгенерированы.

Цитата Сообщение от _lunar_ Посмотреть сообщение
ещё раз повторяю - скачайте x64dbg и спокойно отлаживайте код как вам нужно. В чём проблема то?
А что это? https://x64dbg.com/#start ? Так тут всё тоже самое что и в IDA...
Или это файлы отладки? У меня есть такие файлы.

Добавлено через 8 часов 16 минут
Что-то копался, копался, и понял почему заменой байт не получилось:

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
signed __int64 sub_140015110()
{
    signed __int64 result;  // rax
    unsigned int v1;        // [rsp+30h] [rbp-18h]
    _BYTE *v2;              // [rsp+38h] [rbp-10h]
 
    v1 = sub_140014190(&unk_1400546C0);
    
    if ( v1 )
    {
        v2 = (_BYTE *)sub_14000E9D0((char)off_140053000[0]); // Ответ от сервера
        
        if ( *v2 == 77 && v2[1] == 90 )
        {
            sub_1400147C0(v1, v2); // Сюда должно попасть !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
            result = 1i64;
        }
        else
        {
            MessageBoxA(0i64, "File load error.", 0i64, 0); // Здесь заканчивается работа приложения
            result = 0i64;
        }
    }
    else
    {
        MessageBoxW(0i64, &word_140054790, 0i64, 0);
        result = 0i64;
    }
    return result;
}
Assembler
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
sub_140015110 proc near
 
var_28= byte ptr -28h
var_18= dword ptr -18h
var_10= qword ptr -10h
 
sub     rsp, 48h
lea     rcx, unk_1400546C0
call    sub_140014190
mov     [rsp+48h+var_18], eax
cmp     [rsp+48h+var_18], 0
jnz     short loc_140015144
xor     r9d, r9d        ; uType
xor     r8d, r8d        ; lpCaption
lea     rdx, word_140054790 ; lpText
xor     ecx, ecx        ; hWnd
call    cs:MessageBoxW
xor     eax, eax
jmp     short loc_1400151C1
 
loc_140015144:
mov     [rsp+48h+var_28], 0
xor     r9d, r9d
xor     r8d, r8d
lea     rdx, DstBuf
mov     rcx, cs:off_140053000
call    sub_14000E9D0
mov     [rsp+48h+var_10], rax
mov     eax, 1
imul    rax, 0
mov     rcx, [rsp+48h+var_10]
movsx   eax, byte ptr [rcx+rax]
cmp     eax, 4Dh
jnz     short loc_140015195 // Здесь нужно изменить условие ?????????????????????????????????????????????????
mov     eax, 1
imul    rax, 1
mov     rcx, [rsp+48h+var_10]
movsx   eax, byte ptr [rcx+rax]
cmp     eax, 5Ah
jz      short loc_1400151AE
 
loc_140015195:          ; uType // Здесь заканчивается работа приложения
xor     r9d, r9d
xor     r8d, r8d        ; lpCaption
lea     rdx, aFileLoadError ; "File load error."
xor     ecx, ecx        ; hWnd
call    cs:MessageBoxA
xor     eax, eax
jmp     short loc_1400151C1
 
loc_1400151AE:              // Сюда должно перейти
mov     rdx, [rsp+48h+var_10]
mov     ecx, [rsp+48h+var_18]
call    sub_1400147C0
mov     eax, 1
 
loc_1400151C1:
add     rsp, 48h
retn
sub_140015110 endp
Из справочника(Hex - 75):
Команда: JNZ/JNE
Переход, если: не нуль или не равно
Условие перехода: ZF=0
Меняю на(Hex - 74):
Команда: JZ/JE
Переход, если: нуль или равно
Условие перехода: ZF=1
И всё равно вылезает то же сообщение.
Именно это, их в коде 2 штуки, но я у этого одну букву изменил, чтобы было понятно какое из них.

Попробовал(Hex - 79):
Команда: JNS
Переход, если: знак равен 0
Условие перехода: SF=0
И всё равно эта же мессага.

Может я чего не понимаю, и не там меняю?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
01.04.2018, 22:21
Там 2 условия (строки 34, 40) вы оба меняете? Можно еще jmp short использовать чтобы сразу прыгнуть куда надо.
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
02.04.2018, 00:16  [ТС]
Ааа. ))
Не привык к такому коду.
Я 40ю и не заметил.
0
475 / 427 / 290
Регистрация: 10.03.2015
Сообщений: 1,782
02.04.2018, 01:41
артист, ты что, целый год 1 файлик мучаешь?!
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
02.04.2018, 12:23  [ТС]
Нет, это другой. ))
Просто тему новую не стал создавать, потому, что смысл один и тот же. )


Эту проверку обошел, на другой теперь встрял.
Тут уже идёт куча проверок...
Это был 6й изменённый байт.

Добавлено через 4 часа 8 минут
А как можно числа в человеческий вид привести?

Например:
C++
1
__int64 v4 = 2ui64;
Можно ли ставить просто 2? Не будет ли такого, что заполнится только 1н из 8ми байт?
Ну типа это же дизассемблированный код, и числа там стоят те, которые компилятор подставил, не?

Или нужно так?
C++
1
__int64 v4 = (__int64)2;
Просто меня раздражает такая запись, оно вроде и понятно, но не надо.

2ui64:
2 - значение.
u - unsigned беззнаковое.
i - integer - целочисленное.
64 - размер, битность...
0
Эксперт С++
 Аватар для _lunar_
3701 / 2836 / 451
Регистрация: 03.05.2011
Сообщений: 5,193
Записей в блоге: 21
02.04.2018, 15:02
Цитата Сообщение от артист Посмотреть сообщение
Так тут всё тоже самое что и в IDA...
ага, за исключением одно маленькой "несущественной" детальки - отладчик работает с динамической памятью, а IDA (уже в сотый раз повторяю) это статичный код.

вы уж тогда определитесь, что вам надо - сделать чит бесплатным (это отладчик), или разобрать его код до основания (это дизассемблер)?

Цитата Сообщение от артист Посмотреть сообщение
Можно ли ставить просто 2?
можно.
1
 Аватар для артист
50 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,615
02.04.2018, 16:54  [ТС]
Цитата Сообщение от _lunar_ Посмотреть сообщение
ага, за исключением одно маленькой "несущественной" детальки - отладчик работает с динамической памятью, а IDA (уже в сотый раз повторяю) это статичный код.
Динамичная память - это типа можно посмотреть что находится в переменных во время работы приложения?

Цитата Сообщение от _lunar_ Посмотреть сообщение
вы уж тогда определитесь, что вам надо - сделать чит бесплатным (это отладчик), или разобрать его код до основания (это дизассемблер)?
Да без разницы, я и то и то пробую - ничего не получилось, пока что, не получилось. ))
Суть в освоении на практике, а не в результате.

Я тут подумал что можно было просто подменить VSN диска C, к которому привязывается чит.
Но тему закрыли.

Так то я нашел пару статей, но ничего не понимаю, а спрашивать про такое правила видимо запрещают...
Ладно, дальше буду копипастить код, исходник лучше чем костыли какие-то...
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
02.04.2018, 17:24
Цитата Сообщение от артист Посмотреть сообщение
Динамичная память - это типа можно посмотреть что находится в переменных во время работы приложения?
Ну не в переменных, а в регистрах. Можно и сразу менять пути выполнения программы патча её код в памяти или меняя флаги перехода.

В IDA кстати тоже отладчик есть, и там тоже все это можно сделать, и вроде даже Hex-Rays интегрирован с отладчиком, так что можно и в переменные заглянуть.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.04.2018, 17:24

Декомпиляция С++
Товарисчи с++ разработчики, тут возникла такая проблема, связанная с декомпиляцией с++ приложений. Увы, познания конкретно в этом языке у...

Декомпиляция программы
Как декомпилировать программу? И как узнать на каком языке она написана?

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

Декомпиляция программы
Люди, никто не знает можно ли декомпелировать программу написаную на языке Си в исходный код?

Возможна ли декомпиляция исходника?
Возможно ли получить исходник программы на c++? Если да, то как от этого защититься?


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

Или воспользуйтесь поиском по форуму:
54
Ответ Создать тему
Новые блоги и статьи
Оказывается, Unreal Engine позволяет качество на порядки выше, чем было в Lineedge
Etyuhibosecyu 05.07.2026
Жаль, конечно, что я не узнал об этом, пока Lineedge существовала, а то бы Noname2331 написал, что волки превращаются в пиксельную кашу, а я бы его попросил скачать какую-нибудь бриллиантовую или Pro. . .
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась. Первый вариант. . .
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2. Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет. Но обычно это 50 лет и более. Наверное, закисление почвы происходит сезонно в средней. . .
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru