Сейчас на форуме: rmn, exp50848 (+8 невидимых)

 eXeL@B —› Основной форум —› Развёртывание ключа
Посл.ответ Сообщение

Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 26 марта 2012 12:58 · Поправил: Rio
· Личное сообщение · #1

Если есть у кого время, укажите правильный ход.
Ковыряю BlowFish, начало проверки пароля начинается тут: 0052F398, 005245CC - CryptUnit'(unit шифрования/дешифрования?), 005245F2 (вектор инициализации), длина ключа 10
это то что нашёл.
Прошу помощи в поиске инициализации BlowFish'a и развёртывания ключа.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 26 марта 2012 13:07 · Поправил: VodoleY
· Личное сообщение · #2

Ну вопервых прога делфишная.. во вторых, скачай себе dcpcrypt2-laz-2.0.3-2.zip эти модуили используюца для работы с blowfish. Далее смотрим модуль DCPblowfish и функа
function TDCP_blowfish.SelfTest: boolean;
покажет тебе на примере,как с ним работать, далее тебе останеца только вытащить ключи и данные

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 26 марта 2012 13:25 · Поправил: Rio
· Личное сообщение · #3

спасибо VodoleY, уже накидал:
http://rghost.ru/37228703
так?
вот:
class function TDCP_blowfish.SelfTest: boolean;
const
Key1: array[0..7] of byte= ($00,$00,$00,$00,$00,$00,$00,$00);
Key2: array[0..7] of byte= ($7C,$A1,$10,$45,$4A,$1A,$6E,$57);
InData1: array[0..7] of byte= ($00,$00,$00,$00,$00,$00,$00,$00);
InData2: array[0..7] of byte= ($01,$A1,$D6,$D0,$39,$77,$67,$42);
OutData1: array[0..7] of byte= ($4E,$F9,$97,$45,$61,$98,$DD,$78);
OutData2: array[0..7] of byte= ($59,$C6,$82,$45,$EB,$05,$28,$2B);
var
Cipher: TDCP_blowfish;
Data: array[0..7] of byte;
begin
Cipher:= TDCP_blowfish.Create(nil);
Cipher.Init(Key1,Sizeof(Key1)*8,nil);
Cipher.EncryptECB(InData1,Data);
Result:= boolean(CompareMem(@Data,@OutData1,Sizeof(Data)));
Cipher.Reset;
Cipher.DecryptECB(Data,Data);
Result:= boolean(CompareMem(@Data,@InData1,Sizeof(Data))) and Result;
Cipher.Burn;
Cipher.Init(Key2,Sizeof(Key2)*8,nil);
Cipher.EncryptECB(InData2,Data);
Result:= boolean(CompareMem(@Data,@OutData2,Sizeof(Data))) and Result;
Cipher.Reset;
Cipher.DecryptECB(Data,Data);
Result:= boolean(CompareMem(@Data,@InData2,Sizeof(Data))) and Result;
Cipher.Burn;
Cipher.Free;
end;
.................
Далее идёт как раз инициализация
но в оле на асме?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 26 марта 2012 13:37 · Поправил: VodoleY
· Личное сообщение · #4

чет я не понял.. Cipher.InitStr(KeyStr,TDCP_md5); это как? но вникать ща некогда.
Cipher.EncryptString(Memo1.Lines[i]); у тебя в мемо, список зашифрованных строк чели?
чет мне подсказывает что InitStr не из этой оперы
З.ы. естественно на асме. тебе модуль дал, чтоб ты код СРАВНИВАЛ. а не изобретал велик, реверсирую и отлаживая асм код. Во первых убедись, что это точно этот модуль используеца, дальше пообзывай Call addr правильными именами, а там уже смотри входные выходные данные

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 26 марта 2012 13:56 · Поправил: Rio
· Личное сообщение · #5

>>Cipher.EncryptString(Memo1.Lines[i]); у тебя в мемо, список зашифрованных строк чели?
да.
>>Во первых убедись, что это точно этот модуль
DCPcrypt2.
этот.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 26 марта 2012 14:09
· Личное сообщение · #6

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

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 26 марта 2012 14:23
· Личное сообщение · #7

создай при помощи idr мап файл, после чего подгрузи его в ольку при помощи плагина mapimp, сразу станет видней что где и как вызывается.



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 26 марта 2012 14:24
· Личное сообщение · #8

Vovan666 +1 но я предпочитаю делать это руками, на верочку...

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 27 марта 2012 09:18
· Личное сообщение · #9

>>Vovan666:
>>создай при помощи idr мап файл
Спс Vovan666,сделал.
С помощью Idr декомпилировал.
...............................................................
005245CC по этому адресу подключается модуль CryptUnit, далее - 0051F580 создаётся класс
BlowFish, вот здесь непонятно что это за набор символов:
00524626 MOV EAX, <aEExC85MrjdNj_g> ; ASCII "e<}^eX[c8/5)MrjD,NJ_Ge0U&wG.:w/r"
0052462B |. E8 785CEEFF CALL <Sysutils::StrLen(char *)> (кол. символов строки)
далее по адресу 0052043D происходит инициализация (TDCP_blowfish.InitKey).
далее (как в исходнике) 00520465 - CALL <System::Move(void *,void *,int) и
0052047A - CALL <System::Move(void *,void *,int)>
..Move(SBoxOrg,SBox,Sizeof(SBox));// из исходника
Move(PBoxOrg,PBox,Sizeof(PBox));
..
00402A59 - REP MOVS DWORD PTR ES:[EDI], DWORD PTR D (здесь подключи?)
далее опять считывается посимвольно "e<}^eX[c8/5)MrjD,NJ_Ge0U&wG.:w/r"
потом:
for i:= 0 to 8 do
begin
EncryptECB(Block,Block);
PBox[i*2]:= dword(Block[3]) + (dword(Block[2]) shl 8) + (dword(Block[1]) shl 16) + (dword(Block[0]) shl 24);
PBox[i*2+1]:= dword(Block[7]) + (dword(Block[6]) shl 8) + (dword(Block[5]) shl 16) + (dword(Block[4]) shl 24);
end;// из исходника
а, в оле:
005204F0 > > /8D4C24 08 LEA ECX, DWORD PTR SS:[ESP+8] ; loc_5204F0
005204F4 . |8D5424 08 LEA EDX, DWORD PTR SS:[ESP+8]
005204F8 . |8BC6 MOV EAX, ESI
005204FA . |8B38 MOV EDI, DWORD PTR DS:[EAX]
005204FC . |FF57 6C CALL DWORD PTR DS:[EDI+6C]
005204FF . |33D2 XOR EDX, EDX
00520501 . |8A5424 0B MOV DL, BYTE PTR SS:[ESP+B]
00520505 . |33C9 XOR ECX, ECX
00520507 . |8A4C24 0A MOV CL, BYTE PTR SS:[ESP+A]
0052050B . |C1E1 08 SHL ECX, 8
0052050E . |03D1 ADD EDX, ECX
00520510 . |33C9 XOR ECX, ECX
00520512 . |8A4C24 09 MOV CL, BYTE PTR SS:[ESP+9]
00520516 . |C1E1 10 SHL ECX, 10
00520519 . |03D1 ADD EDX, ECX
0052051B . |33C9 XOR ECX, ECX
0052051D . |8A4C24 08 MOV CL, BYTE PTR SS:[ESP+8]
00520521 . |C1E1 18 SHL ECX, 18
00520524 . |03D1 ADD EDX, ECX
00520526 . |8BC3 MOV EAX, EBX
00520528 . |03C0 ADD EAX, EAX
0052052A . |899486 481000>MOV DWORD PTR DS:[ESI+EAX*4+1048], EDX
00520531 . |33D2 XOR EDX, EDX
00520533 . |8A5424 0F MOV DL, BYTE PTR SS:[ESP+F]
00520537 . |33C9 XOR ECX, ECX
00520539 . |8A4C24 0E MOV CL, BYTE PTR SS:[ESP+E]
0052053D . |C1E1 08 SHL ECX, 8
00520540 . |03D1 ADD EDX, ECX
00520542 . |33C9 XOR ECX, ECX
00520544 . |8A4C24 0D MOV CL, BYTE PTR SS:[ESP+D]
00520548 . |C1E1 10 SHL ECX, 10
0052054B . |03D1 ADD EDX, ECX
0052054D . |33C9 XOR ECX, ECX
0052054F . |8A4C24 0C MOV CL, BYTE PTR SS:[ESP+C]
00520553 . |C1E1 18 SHL ECX, 18
00520556 . |03D1 ADD EDX, ECX
00520558 . |899486 4C1000>MOV DWORD PTR DS:[ESI+EAX*4+104C], EDX
0052055F . |43 INC EBX
00520560 . |83FB 09 CMP EBX, 9
00520563 .^\75 8B JNZ SHORT <loc_5204F0>
.............................................................................
правильно ли я нашёл место инициализации?
какие должны быть дальнейшие действия?



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 27 марта 2012 09:30 · Поправил: VodoleY
· Личное сообщение · #10

Rio для начала выяснить, откуда ростут ноги у строчки "e<}^eX[c8/5)MrjD,NJ_Ge0U&wG.:w/r" если она константа (в экзешнике в чистом виде) то смело ее тырим (посмотрел в экзешнике.. да, это константа)
Cipher:= TDCP_blowfish.Create(nil);
Cipher.Init(Key1,Sizeof(Key1)*8,nil); Зашифровали
Cipher.EncryptECB(InData1,Data);


Cipher.Reset;
Cipher.DecryptECB(Data,Data); расшифровали
Cipher.Burn;
PBox[i*2]:= dword(Block[3]) + (dword(Block[2]) shl 8) + (dword(Block[1]) shl 16) + (dword(Block[0]) shl 24);
PBox[i*2+1]:= dword(Block[7]) + (dword(Block[6]) shl 8) + (dword(Block[5]) shl 16) + (dword(Block[4]) shl 24);
dword-ов ты зря налипил, имхо. разбирай дальше, где входные данные, где зашишфрованные /расшифрованные, пробуй делать в делфе аналог

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 27 марта 2012 09:31 · Поправил: Rio
· Личное сообщение · #11

to:VodoleY
>>если она константа
да.
там в exe'шнике в открытом виде упоминается md5,sha1, а константы:"e<}^eX[c8/5)MrjD,NJ_Ge0U&wG.:w/r" и
"X]FSD!d%"



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 27 марта 2012 09:55 · Поправил: VodoleY
· Личное сообщение · #12

хех.. ну вот смотри.. руками, без др. инструментов... ты дал адресс 0052462B я прошелся чуть ниже
00524649 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
переходим на смотрим ниже
0051F76C /. 55 PUSH EBP
0051F76D |. 8BEC MOV EBP,ESP
подымаем глазки чуть высше..
хитрая процедурка
0051F764 . B8 40000000 MOV EAX,40
0051F769 . C3 RETN
типа result:=64
еще высше глазки...
0051F638 . 00F75100 DD testexam.0051F700 ; ASCII 12,"TDCP_blockcipher64"
0051F63C 48 DB 48 ; CHAR 'H'
Теперь ищем это дело в pas файлах, этой либы
unit DCPblockciphers;
...
TDCP_blockcipher64= class(TDCP_blockcipher)
private
IV, CV: array[0..7] of byte;


.....

class function TDCP_blockcipher64.GetBlockSize: integer;
begin
Result:= 64;
end;

procedure TDCP_blockcipher64.Init(const Key; Size: longword; InitVector: pointer);
begin
inherited Init(Key,Size,InitVector);
InitKey(Key,Size);
if InitVector= nil then
begin
FillChar(IV,8,{$IFDEF DCP1COMPAT}$FF{$ELSE}0{$ENDIF});
EncryptECB(IV,IV);
Reset;
end
else
begin
Move(InitVector^,IV,8);
Reset;
end;
end;
похоже? асм и пас? вот таким образом (или ищи свой )ты должен обозвать все процедурки для того чтоб было проще разбираца, после этого написать аналог этого кода на делфе. дирзай


0051F49C /. 55 PUSH EBP
0051F49D |. 8BEC MOV EBP,ESP
0051F49F |. 53 PUSH EBX
0051F4A0 |. 56 PUSH ESI
0051F4A1 |. 57 PUSH EDI
0051F4A2 |. 8BFA MOV EDI,EDX
..... == unit DCPcrypt2;
procedure TDCP_blockcipher.Decrypt(const Indata; var Outdata; Size: longword);
begin
case fCipherMode of
cmCBC: DecryptCBC(Indata,Outdata,Size);
cmCFB8bit: DecryptCFB8bit(Indata,Outdata,Size);
cmCFBblock: DecryptCFBblock(Indata,Outdata,Size);
cmOFB: DecryptOFB(Indata,Outdata,Size);
cmCTR: DecryptCTR(Indata,Outdata,Size);
end;
end;

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....




Ранг: 95.5 (постоянный), 36thx
Активность: 0.080.04
Статус: Участник

Создано: 27 марта 2012 10:15 · Поправил: Rio
· Личное сообщение · #13

Спасибо VodoleY, буду "копать"...


 eXeL@B —› Основной форум —› Развёртывание ключа
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати