eXeL@B —› Основной форум —› Развёртывание ключа |
Посл.ответ | Сообщение |
|
Создано: 26 марта 2012 12:58 · Поправил: Rio · Личное сообщение · #1 Если есть у кого время, укажите правильный ход. Ковыряю BlowFish, начало проверки пароля начинается тут: 0052F398, 005245CC - CryptUnit'(unit шифрования/дешифрования?), 005245F2 (вектор инициализации), длина ключа 10 это то что нашёл. Прошу помощи в поиске инициализации BlowFish'a и развёртывания ключа. |
|
Создано: 26 марта 2012 13:07 · Поправил: VodoleY · Личное сообщение · #2 Ну вопервых прога делфишная.. во вторых, скачай себе dcpcrypt2-laz-2.0.3-2.zip эти модуили используюца для работы с blowfish. Далее смотрим модуль DCPblowfish и функа function TDCP_blowfish.SelfTest: boolean; покажет тебе на примере,как с ним работать, далее тебе останеца только вытащить ключи и данные ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 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; ................. Далее идёт как раз инициализация но в оле на асме? |
|
Создано: 26 марта 2012 13:37 · Поправил: VodoleY · Личное сообщение · #4 чет я не понял.. Cipher.InitStr(KeyStr,TDCP_md5); это как? но вникать ща некогда. Cipher.EncryptString(Memo1.Lines[i]); у тебя в мемо, список зашифрованных строк чели? чет мне подсказывает что InitStr не из этой оперы З.ы. естественно на асме. тебе модуль дал, чтоб ты код СРАВНИВАЛ. а не изобретал велик, реверсирую и отлаживая асм код. Во первых убедись, что это точно этот модуль используеца, дальше пообзывай Call addr правильными именами, а там уже смотри входные выходные данные ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 26 марта 2012 13:56 · Поправил: Rio · Личное сообщение · #5 |
|
Создано: 26 марта 2012 14:09 · Личное сообщение · #6 |
|
Создано: 26 марта 2012 14:23 · Личное сообщение · #7 |
|
Создано: 26 марта 2012 14:24 · Личное сообщение · #8 |
|
Создано: 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> ............................................................................. правильно ли я нашёл место инициализации? какие должны быть дальнейшие действия? |
|
Создано: 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-ов ты зря налипил, имхо. разбирай дальше, где входные данные, где зашишфрованные /расшифрованные, пробуй делать в делфе аналог ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 27 марта 2012 09:31 · Поправил: Rio · Личное сообщение · #11 |
|
Создано: 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; ----- Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме.... |
|
Создано: 27 марта 2012 10:15 · Поправил: Rio · Личное сообщение · #13 |
eXeL@B —› Основной форум —› Развёртывание ключа |
Эта тема закрыта. Ответы больше не принимаются. |