uLMHash.pas |
// LM Hash on Win box for Delphi // !!! (C)(R) by Branko Defar, All rights reserved !!! // This code is published only!!! for academic research // and for use it u need permison from me
// This unit is slow, couse i wonna it slow; reason: script kiddies // It's written in delphi, couse i don't wonna it portable; reason: script kiddies // Hint: For fast implementation write your own Bitslice DES key search in assembler
// In hacker culture, a script kiddie, occasionally script bunny, skiddie, // script kitty, script-running juvenile (SRJ), or similar, is a derogatory // term used to describe those who use scripts or programs developed by others // to attack computer systems and networks. It is generally assumed that script // kiddies are juveniles who lack the ability to write sophisticated hacking // programs or exploits on their own, and that their objective is to try to // impress their friends or gain credit in underground hacker communities.
unit uLMHash;
interface
procedure LMHash(var LMHashS:string;PwdS:string);
implementation
uses Windows,SysUtils;
type ab6=array[0..5] of byte; type ab7=array[0..6] of byte; type ab8=array[0..7] of byte; type ab16=array[0..15] of byte; type ab28=array[0..27] of byte; type ab32=array[0..31] of byte; type ab48=array[0..47] of byte; type ab56=array[0..55] of byte; type ab64=array[0..63] of byte; type ab16_48=array[0..15] of ab48; type ab8_6=array[0..7] of ab6;
const perm1:ab56= (57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4);
const perm2:ab48= (14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32);
const perm3:ab64= (58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4, 62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8, 57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3, 61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7);
const perm4:ab48= (32, 1, 2, 3, 4, 5, 4, 5, 6, 7, 8, 9, 8, 9, 10, 11, 12, 13, 12, 13, 14, 15, 16, 17, 16, 17, 18, 19, 20, 21, 20, 21, 22, 23, 24, 25, 24, 25, 26, 27, 28, 29, 28, 29, 30, 31, 32, 1);
const perm5:ab32= (16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10, 2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25);
const perm6:ab64= (40, 8, 48, 16, 56, 24, 64, 32, 39, 7, 47, 15, 55, 23, 63, 31, 38, 6, 46, 14, 54, 22, 62, 30, 37, 5, 45, 13, 53, 21, 61, 29, 36, 4, 44, 12, 52, 20, 60, 28, 35, 3, 43, 11, 51, 19, 59, 27, 34, 2, 42, 10, 50, 18, 58, 26, 33, 1, 41, 9, 49, 17, 57, 25);
const sc:ab16=(1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1);
const sbox:array[0..7,0..3,0..15] of byte = ( ((14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7), (0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8), (4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0), (15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13)),
((15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10), (3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5), (0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15), (13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9)),
((10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8), (13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1), (13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7), (1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12)),
((7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15), (13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9), (10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4), (3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14)),
((2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9), (14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6), (4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14), (11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3)),
((12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11), (10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8), (9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6), (4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13)),
((4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1), (13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6), (1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2), (6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12)),
((13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7), (1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2), (7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8), (2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11)));
procedure permute32(var outt:ab32;const inn:ab32;const p:ab32); var i:integer; begin for i:=0 to 31 do outt[i]:=inn[p[i]-1]; end;
procedure permute56(var outt:ab56;const inn:ab64;const p:ab56); var i:integer; begin for i:=0 to 55 do outt[i]:=inn[p[i]-1]; end;
procedure permute48(var outt:ab48;const inn:ab56;const p:ab48); var i:integer; begin for i:=0 to 47 do outt[i]:=inn[p[i]-1]; end;
procedure permute64(var outt:ab64;const inn:ab64;const p:ab64); var i:integer; begin for i:=0 to 63 do outt[i]:=inn[p[i]-1]; end;
procedure permute48v2(var outt:ab48;const inn:ab32;const p:ab48); var i:integer; begin for i:=0 to 47 do outt[i]:=inn[p[i]-1]; end;
procedure lshift(var d:ab28;const count,n:integer); var outt:ab64; i:integer; begin for i:=0 to (n-1) do outt[i]:=d[(i+count) mod n]; for i:=0 to (n-1) do d[i]:=outt[i]; end;
procedure concat28(var outt:ab56;const in1:ab28;const in2:ab28;const l1,l2:integer); var i,ii:integer; begin for i:=0 to (l1-1) do outt[i]:=in1[i]; i:=l1; for ii:=0 to (l2-1) do begin outt[i]:=in2[ii]; i:=i+1; end; end;
procedure concat32(var outt:ab64;const in1:ab32;const in2:ab32;const l1,l2:integer); var i,ii:integer; begin for i:=0 to (l1-1) do outt[i]:=in1[i]; i:=l1; for ii:=0 to (l2-1) do begin outt[i]:=in2[ii]; i:=i+1; end; end;
procedure x_or32(var outt:ab32;const in1,in2:ab32;const n:integer); var i:integer; begin for i:=0 to (n-1) do outt[i]:=in1[i] xor in2[i]; end;
procedure x_or48(var outt:ab48;const in1,in2:ab48;const n:integer); var i:integer; begin for i:=0 to (n-1) do outt[i]:=in1[i] xor in2[i]; end;
procedure dohash_forw(var outt:ab64;const key:ab64;const forw:integer); const //const sp8:ab8=($4b, $47, $53, $21, $40, $23, $24, $25); inn:ab64= (0,1,0,0,1,0,1,1, 0,1,0,0,0,1,1,1, 0,1,0,1,0,0,1,1, 0,0,1,0,0,0,0,1, 0,1,0,0,0,0,0,0, 0,0,1,0,0,0,1,1, 0,0,1,0,0,1,0,0, 0,0,1,0,0,1,0,1); var i,j,k:integer; pk1:ab56; c,d:ab28; cd:ab56; ki:ab16_48; pd1:ab64; l,r:ab32; rl:ab64;
er:ab48; erk:ab48; b:ab8_6; cb:ab32; pcb:ab32; r2:ab32;
m,n:integer; begin permute56(pk1, key, perm1);
for i:=0 to 27 do c[i]:=pk1[i]; for i:=0 to 27 do d[i]:=pk1[i+28];
for i:=0 to 15 do begin lshift(c,sc[i],28); lshift(d,sc[i],28);
concat28(cd,c,d,28,28); permute48(ki[i],cd,perm2); end;
permute64(pd1,inn,perm3);
for j:=0 to 31 do begin l[j]:=pd1[j]; r[j]:=pd1[j+32]; end;
for i:=0 to 15 do begin permute48v2(er,r,perm4);
if (forw<>0) then x_or48(erk, er, ki[i],48) else x_or48(erk, er, ki[15-i],48);
for j:=0 to 7 do begin for k:=0 to 5 do b[j][k]:=erk[j*6+k]; end;
for j:=0 to 7 do begin m:=(b[j][0] shl 1) or b[j][5];
n:=(b[j][1] shl 3) or (b[j][2] shl 2) or (b[j][3] shl 1) or b[j][4];
for k:=0 to 3 do begin if (sbox[j][m][n] and (1 shl (3-k)))<>0 then b[j][k]:=1 else b[j][k]:=0; end; end;
for j:=0 to 7 do begin for k:=0 to 3 do cb[j*4+k]:=b[j][k]; end;
permute32(pcb, cb, perm5);
x_or32(r2, l, pcb, 32);
for j:=0 to 31 do l[j]:=r[j]; for j:=0 to 31 do r[j]:=r2[j]; end; //for i:=0 to 15 do
concat32(rl,r,l,32,32);
permute64(outt,rl,perm6); end;
procedure str_to_key(const str:ab7;var key:ab8); var i:integer; begin key[0]:= str[0] shr 1; key[1]:=((str[0] and $01) shl 6) or (str[1] shr 2); key[2]:=((str[1] and $03) shl 5) or (str[2] shr 3); key[3]:=((str[2] and $07) shl 4) or (str[3] shr 4); key[4]:=((str[3] and $0F) shl 3) or (str[4] shr 5); key[5]:=((str[4] and $1F) shl 2) or (str[5] shr 6); key[6]:=((str[5] and $3F) shl 1) or (str[6] shr 7); key[7]:=str[6] and $7F; for i:=0 to 7 do key[i]:=(key[i] shl 1); end;
procedure des_crypt56_forw(var outt:ab8;const key:ab7;const forw:integer); var i:integer; outb,keyb:ab64; key2:ab8; begin str_to_key(key,key2); FillChar(keyb, SizeOf(keyb),0); FillChar(outb, SizeOf(outb),0); for i:=0 to 63 do if (key2[i div 8] and (1 shl (7-(i mod 8))))<>0 then keyb[i]:=1; dohash_forw(outb, keyb, forw); FillChar(outt, SizeOf(outt),0); for i:=0 to 63 do if outb[i]<>0 then outt[i div 8]:=outt[i div 8] or (1 shl (7-(i mod 8))); end;
procedure LMHash(var LMHashS:string;PwdS:string); const hex: array[0..$F] of char = ('0','1','2','3','4','5','6','7', '8','9','A','B','C','D','E','F'); var o1,o2:ab8; i1,i2:ab7; i:integer; begin PwdS:=UpperCase(PwdS); FillChar(i1, SizeOf(i1),0); FillChar(i2, SizeOf(i2),0); i:=Length(PwdS); if i>7 then i:=7; for i:=1 to i do i1[i-1]:=ord(PwdS[i]); i:=Length(PwdS); if i>14 then i:=14; for i:=8 to i do i2[i-8]:=ord(PwdS[i]); des_crypt56_forw(o1, i1,1); des_crypt56_forw(o2, i2,1); LMHashS:=hex[(o1[0] and $F0) shr 4]+hex[o1[0] and $0F]+ hex[(o1[1] and $F0) shr 4]+hex[o1[1] and $0F]+ hex[(o1[2] and $F0) shr 4]+hex[o1[2] and $0F]+ hex[(o1[3] and $F0) shr 4]+hex[o1[3] and $0F]+ hex[(o1[4] and $F0) shr 4]+hex[o1[4] and $0F]+ hex[(o1[5] and $F0) shr 4]+hex[o1[5] and $0F]+ hex[(o1[6] and $F0) shr 4]+hex[o1[6] and $0F]+ hex[(o1[7] and $F0) shr 4]+hex[o1[7] and $0F]+ hex[(o2[0] and $F0) shr 4]+hex[o2[0] and $0F]+ hex[(o2[1] and $F0) shr 4]+hex[o2[1] and $0F]+ hex[(o2[2] and $F0) shr 4]+hex[o2[2] and $0F]+ hex[(o2[3] and $F0) shr 4]+hex[o2[3] and $0F]+ hex[(o2[4] and $F0) shr 4]+hex[o2[4] and $0F]+ hex[(o2[5] and $F0) shr 4]+hex[o2[5] and $0F]+ hex[(o2[6] and $F0) shr 4]+hex[o2[6] and $0F]+ hex[(o2[7] and $F0) shr 4]+hex[o2[7] and $0F]; end;
end.
|
|
|
29.09.2011
Ste tudi vi žrtev danskega podjetja Brunata ? Zaradi prirojene napake v brunatinih delilnikih stroškov toplote in nagnjenosti danskega podjetja Brunata k neopravičenem praznenju vaše denarnice tudi ste !
več ?
01.02.2008
Če mislite, da je v interesu proizvajalcev operacijske opreme vaša varnost, se bridko motite. V njihovem interesu je dostopnost do vaših podatkov.
več ?
|
|