О грустном
Мне сейчас DL напоминает котенка, которого сбила машина и вот он лежит на асфальте весь в крови, мозг вытекает на асфальт, судорожно вздрагивает - вроде умер, а вроде и нет.
Смотрю в VIPах новые сайты появились, решил там посмотреть что да как..
Увидел тему одну «Интересно ли? Криптоанализ.»
), покурили, флаги побросали и с концами...
Ну а мне тема понравилась, и я решил чего-нибудь написать на эту тему
Сразу скажу, что я нуб в криптографии, впрочем, как и во всем остальном
Да и вообще о криптографии написано очень много, а я решил все-таки описать сам процесс, ну вернее...
Если вам понравится все что ниже написано, и вы посчитаете этот материал интересным/полезным, разместите у себя на сайте
=============================================================================================
Пишем билдер. Часть первая. Анализ.
Реклама: http://xss.pro/index.php?topic=21847 - Получи исходничег!
Идем и качаем тестовый сэмпл
http://exelab.ru/f/files/d02b_05.06.2011_EXELAB.rU.tgz
и читаем пару постов о боте
http://exelab.ru/f/index.php?action=vthrea...=15227&page=6#3
"распаковываем" сами или качаем из поста GMax уже "распакованный" файл
Ищем строчку:
Ищем ссылки на нее
И попадаем на адрес 00411F92
Нас интересует функция CALL 00411EB4, заходим в нее и видим такой код:
CALL 00407840 – это base64 decode
А вот CALL 0040794C нас как раз и интересует, заходим в нее и видим такой код:
Это и есть тот код, который декодирует данные, в том числе и ссылку к админке
Первое что нам нужно сделать, так это оптимизировать код
Из кода можно увидеть, что по адресам 432F84, 432F88, 432F8C находятся какие-то значения, с помощью которых происходит декодирование
Они инициализируются немного выше в функции CALL 0040792C
T (432F84) = 0x624 (624h)
A (432F88) = 0x86E (86Eh)
C (432F8C) = 0x9139 (9139h)
Важно: Писать мы будем билдер на питоне, не потому что я умею на нем кодить, нет, а потому что я считаю что питон самый лучший ЯП и обладает безграничными возможностями в плане десктопа
И так давайте почитаем, что нам пишет "элитО"
Дадим адресам 432F84, 432F88, 432F8C символьные имена T, A, C
где А и С - константы, Т - "исходная величина"
теперь мы переведем ASM код в питон
Теперь все вместе
Если внимательно посмотреть на код, то можно увидеть что это простое симметричное шифрование строк
Мы знаем что бот написан на Delphi, а стало быть погуглим (гы-гы) и вот оно
а стало быть, обратный алгоритм будет такой
Наш анализ закончен, писать билдер на питоне будем во второй части 
Хотя насчет второй части не обещаю, все зависит от наличия свободного времени…
Мне сейчас DL напоминает котенка, которого сбила машина и вот он лежит на асфальте весь в крови, мозг вытекает на асфальт, судорожно вздрагивает - вроде умер, а вроде и нет.
Смотрю в VIPах новые сайты появились, решил там посмотреть что да как..
Увидел тему одну «Интересно ли? Криптоанализ.»
Чел вроде как "клялся" и "божился" статью написать.. все дружно в топе покричали ура (и даже Ar3sLozzie пишет:
Не так давно на форуме появилось сообщение, часть которого посвящалась тому, что форум является "однотипным". Поэтому появилась идея написать статью, которая бы имела мало отношения к ботнетам, связкам и т.п. ПО. Первое, что пришло в голову, - криптография. Например, еще не встречал на подобных форумах статей, посвященных настоящему криптоанализу.
Сейчас есть идея статьи-введения в частотный и синтаксический анализ, который позволяет достаточно быстро восстанавливать сообщения, обработанные простыми алгоритмами замены, не зная ключ. Начинающим пользователям материал может оказаться полезным, но меня смущает слово "может".
Назревает вопрос, интересно ли это пользователям и стоит ли тратить на это время? Если хотя бы несколько пользователей выскажутся "за", то сделаю, а также буду готов ответить на все последующие вопросы.
Ну а мне тема понравилась, и я решил чего-нибудь написать на эту тему
Сразу скажу, что я нуб в криптографии, впрочем, как и во всем остальном
Да и вообще о криптографии написано очень много, а я решил все-таки описать сам процесс, ну вернее...
Если вам понравится все что ниже написано, и вы посчитаете этот материал интересным/полезным, разместите у себя на сайте
=============================================================================================
Пишем билдер. Часть первая. Анализ.
Реклама: http://xss.pro/index.php?topic=21847 - Получи исходничег!
Идем и качаем тестовый сэмпл
http://exelab.ru/f/files/d02b_05.06.2011_EXELAB.rU.tgz
и читаем пару постов о боте
http://exelab.ru/f/index.php?action=vthrea...=15227&page=6#3
"распаковываем" сами или качаем из поста GMax уже "распакованный" файл
Ищем строчку:
Код:
ADDRESS: 00404E94
NxVF+j/F385U6sVXA/tdQPPRjdi621/NcSudDng637htLdtvYxoz7SoH75D71R2r6PFN/ds1gdPBa8iQOtdeT1ULaij3MO2+rRK8YvcS3EGEj8XMcg/JfNn58mNuS29xMBGl+/che9Y4rWMxKRoL+VCrHZb/zD/2tUGRc65m0AmhhlMg3qNZA6bU82mrupHltACH0g==
И попадаем на адрес 00411F92
Код:
00411F92 A1 48424100 MOV EAX,DWORD PTR DS:[414248]
00411F97 8B00 MOV EAX,DWORD PTR DS:[EAX]
00411F99 E8 16FFFFFF CALL 00411EB4
Код:
00411EDA 8D55 F8 LEA EDX,DWORD PTR SS:[EBP-8]
00411EDD 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00411EE0 E8 5B59FFFF CALL 00407840
00411EE5 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8]
00411EE8 8BD3 MOV EDX,EBX
00411EEA E8 5D5AFFFF CALL 0040794C
А вот CALL 0040794C нас как раз и интересует, заходим в нее и видим такой код:
Код:
00407975 E8 B2FFFFFF CALL 0040792C
0040797A 8BC7 MOV EAX,EDI
0040797C E8 83C6FFFF CALL 00404004
00407981 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00407984 E8 BFC8FFFF CALL 00404248
00407989 8BF0 MOV ESI,EAX
0040798B 85F6 TEST ESI,ESI
0040798D 7E 4C JLE SHORT 004079DB
0040798F BB 01000000 MOV EBX,1
00407994 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
00407997 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0040799A 8A541A FF MOV DL,BYTE PTR DS:[EDX+EBX-1]
0040799E 8B0D 842F4300 MOV ECX,DWORD PTR DS:[432F84]
004079A4 C1E9 08 SHR ECX,8
004079A7 32D1 XOR DL,CL
004079A9 E8 22C8FFFF CALL 004041D0
004079AE 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8]
004079B1 8BC7 MOV EAX,EDI
004079B3 E8 98C8FFFF CALL 00404250
004079B8 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004079BB 0FB64418 FF MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
004079C0 0305 842F4300 ADD EAX,DWORD PTR DS:[432F84]
004079C6 F72D 882F4300 IMUL DWORD PTR DS:[432F88]
004079CC 0305 8C2F4300 ADD EAX,DWORD PTR DS:[432F8C]
004079D2 A3 842F4300 MOV DWORD PTR DS:[432F84],EAX
004079D7 43 INC EBX
004079D8 4E DEC ESI
004079D9 75 B9 JNZ SHORT 00407994
Первое что нам нужно сделать, так это оптимизировать код
Код:
00407997 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0040799A 8A541A FF MOV DL,BYTE PTR DS:[EDX+EBX-1]
0040799E 8B0D 842F4300 MOV ECX,DWORD PTR DS:[432F84]
004079A4 C1E9 08 SHR ECX,8
004079A7 32D1 XOR DL,CL
004079B8 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
004079BB 0FB64418 FF MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
004079C0 0305 842F4300 ADD EAX,DWORD PTR DS:[432F84]
004079C6 F72D 882F4300 IMUL DWORD PTR DS:[432F88]
004079CC 0305 8C2F4300 ADD EAX,DWORD PTR DS:[432F8C]
004079D2 A3 842F4300 MOV DWORD PTR DS:[432F84],EAX
Они инициализируются немного выше в функции CALL 0040792C
T (432F84) = 0x624 (624h)
A (432F88) = 0x86E (86Eh)
C (432F8C) = 0x9139 (9139h)
Важно: Писать мы будем билдер на питоне, не потому что я умею на нем кодить, нет, а потому что я считаю что питон самый лучший ЯП и обладает безграничными возможностями в плане десктопа
И так давайте почитаем, что нам пишет "элитО"
Вы что-нибудь поняли? Не огорчайтесь, я тоже ничего понял %)))Одним из хоpоших конгpуэнтных генеpатоpов является линейный конгpуэнтный датчик ПСЧ. Он выpабатывает последовательности псевдослучайных чисел T(i), описываемые соотношением
T(i+1) = (A*T(i)+C) mod m,
где А и С - константы, Т(0) - исходная величина, выбpанная в качестве поpождающего числа. Очевидно, что эти тpи величины и обpазуют ключ.
Такой датчик ПСЧ генеpиpует псевдослучайные числа с опpеделенным пеpиодом повтоpения, зависящим от выбpанных значений А и С. Значение m обычно устанавливается pавным 2n , где n - длина машинного слова в битах. Датчик имеет максимальный пеpиод М до того, как генеpиpуемая последовательность начнет повтоpяться. По пpичине, отмеченной pанее, необходимо выбиpать числа А и С такие, чтобы пеpиод М был максимальным. Как показано Д. Кнутом, линейный конгpуэнтный датчик ПСЧ имеет максимальную длину М тогда и только тогда, когда С - нечетное, и А mod 4 = 1.
Дадим адресам 432F84, 432F88, 432F8C символьные имена T, A, C
где А и С - константы, Т - "исходная величина"
теперь мы переведем ASM код в питон
Код:
;ASM
MOV DL,BYTE PTR DS:[EDX+EBX-1]
Код:
#Python
ord(c)
Код:
;ASM
MOV ECX,DWORD PTR DS:[432F84]
SHR ECX,8
Код:
#Python
Т>>8
Код:
;ASM
XOR DL,CL
Код:
#Python
^
Код:
;ASM
MOV EDX,DWORD PTR SS:[EBP-4]
MOV DL,BYTE PTR DS:[EDX+EBX-1]
MOV ECX,DWORD PTR DS:[432F84]
SHR ECX,8
XOR DL,CL
Код:
#Python
ord(c) ^ (Т>>8)
Код:
;ASM
MOV EAX,DWORD PTR SS:[EBP-4]
MOVZX EAX,BYTE PTR DS:[EAX+EBX-1]
ADD EAX,DWORD PTR DS:[432F84]
IMUL DWORD PTR DS:[432F88]
ADD EAX,DWORD PTR DS:[432F8C]
MOV DWORD PTR DS:[432F84],EAX
Код:
#Python
Т = ((ord(c)+Т)*A)+C
Код:
ord(c) ^ (Т>>8)
Т = ((ord(c)+Т)*A)+C
Код:
{Предназначена для расшифровки строки, ранее зашифрованной фукцией UBPFD.Encrypt
Зависимости: UBPFD.Encrypt
Автор: Anatoly Podgoretsky, anatoly@podgoretsky.com, Johvi
Copyright: (c) Anatoly Podgoretsky, 1996
Дата: 26 апреля 2002 г.
***************************************************** }
const
StartKey = 471; // Start default key
MultKey = 62142; // Mult default key
AddKey = 11719; // Add default key
// обязательно смените ключи до использования
{$R-}
{$Q-}
function Decrypt(const InString: string; StartKey, MultKey, AddKey: Integer):
string;
var
I: Byte;
// Если поменять тип переменной I на Integer, то будет возможно
// шифрование текста длиной более 255 символом - VID.
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(InString[I]) + StartKey) * MultKey + AddKey;
end;
end;
{$R+}
{$Q+}
Код:
{Предназначена для простого шифрование строк и паролей, ключ 96 бит, шифрование
симметричное.
Зависимости: UBPFD.decrypt
Автор: Anatoly Podgoretsky, anatoly@podgoretsky.com, Johvi
Copyright: (c) Anatoly Podgoretsky, 1996
Дата: 26 апреля 2002 г.
***************************************************** }
const
StartKey = 471; // Start default key
MultKey = 62142; // Mult default key
AddKey = 11719; // Add default key
// обязательно смените ключи до использования
function Encrypt(const InString: string; StartKey, MultKey, AddKey: Integer):
string;
var
I: Byte;
// Если поменять тип переменной I на Integer, то будет возможно
// шифрование текста длиной более 255 символом - VID.
begin
Result := '';
for I := 1 to Length(InString) do
begin
Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
end;
end;
Хотя насчет второй части не обещаю, все зависит от наличия свободного времени…