· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Какой алгоритм юзает авард биос при подсчете CRC

Посл.отвђт Сообщенiе


Дата: Дек 15, 2002 11:48:00 · Поправил: Безпощадный даос

ХЕЛП! Какой алгоритм юзает авард биос при подсчете ЦРЦ пароля?? Плиз, очень нужно!


Дата: Дек 15, 2002 15:09:21

Похоже, что-нибудь вроде:
xor dx,dx
и для каждого следующего символа (al)
mov ah,0
rol dx,2
add dx,ax


Дата: Дек 15, 2002 15:10:40

Вдогонку - результат, естественно, в DX


Дата: Дек 15, 2002 16:18:29

Вобще а больше на QB VB кодю, но асм тоже летом подучил,
как я понял, байты складываются, и после каждого символа происходит смещение на 2 бита (вправо вроде), притом етот хвост теряется, так?
просто мне ето так и так на VB перекодить,
я буду фильтр писать, шоб список универсальных паролей почистить

---
а, не, рол, етож вроде циклический здвиг, тогда ети 2 бита вылезут с другого конца? :) ну тогда все ок, токо
в АЛ символы идут в какой кодеровке? асли просто ASCII, то тк символы англ, можно и на ВБ без перекодирования тыкать :)


Дата: Дек 15, 2002 17:21:58

Команда ROL = ROtate Left - циклический сдвиг влево.

>в АЛ символы идут в какой кодеровке?
При вводе пароля SETUP'а - естесственно, ASCII


Дата: Дек 15, 2002 17:35:05

Вот, хыть ктото мне ответил нормально :)
(на citforum все молчат :)

а там точно сдвиг на 2 бита?
вобщем надосуге на бесике напишу, испробую :) (если че - подгоню, у меня есть несколько паролей с одинаковой crc)


Дата: Июл 11, 2003 16:30:38 · Поправил: Безпощадный даос

Вот тебе исходник... Ногами не пинай, когда писал - был еще маленький и бородатый...
program award_bios_password_fucker;
uses crt;

function inbyte(addr:byte):byte;
var b:byte;
begin
  asm
    push ax
    push dx
    mov dx,70h
    mov al,addr
    out dx,al
    inc dx
    in al,dx
    mov b,al
    pop dx
    pop ax
  end;
  inbyte:=b;
end;

procedure outbyte(addr,val:byte);
begin
  asm
    push ax
    push dx
    mov dx,70h
    mov al,addr
    out dx,al
    inc dx
    mov al,val
    out dx,al
    pop dx
    pop ax
  end;
end;


function crc_calc(c:boolean):word;{case c of true-standard;false-extended}
var crc:word;
    f,s,e:byte;
begin
  crc:=0;
  if c then
  begin
    s:=16;
    e:=45;
  end else
  begin
    s:=64;
    e:=121;
  end;
  for f:=s to e do inc(crc,inbyte(f));
  crc_calc:=crc;
end;

function pass_crc(s:string):word;
var crc,k:longint;
    f:byte;
begin
  k:=1;
  crc:=0;
  for f:=length(s) downto 1 do
  begin
    inc (crc,k*ord(s[f]));
    k:=k*4;
  end;
  k:=round(crc/65536);
  crc:=crc-k*65536;
  pass_crc:=crc+k;
end;

procedure box(x1,y1,x2,y2:byte);
var f:byte;
begin
  gotoxy(x1,y1);
  write('Й');
  for f:=x1+1 to x2-1 do write ('Н');
  write('»');
  for f:=y1+1 to y2-1 do
  begin
    gotoxy(x1,f);
    write('є');
    gotoxy(x2,f);
    write('є');
  end;
  gotoxy(x1,y2);
  write('И');
  for f:=x1+1 to x2-1 do write ('Н');
  write('ј');
end;

function input(l:byte):string;
var s:string;
    x,y,f:byte;
    c:char;
begin
  s:='';
  x:=wherex;
  y:=wherey;
  repeat
    gotoxy(x,y);
    for f:=1 to l do write('±');
    gotoxy(x,y);
    write(s);
    c:=readkey;
    if (c=#8) and (length(s)>0) then delete(s,length(s),1);
    if length(s)=l then continue;
    if c in ['!'..'~'] then s:=s+c;
  until c=#13;
  input:=s;
end;

function dump_cmos(n:string):boolean;
var d:file of byte;
    f,b:byte;
begin
{$I-}
  dump_cmos:=true;
  assign(d,n);
  rewrite(d);
  for f:=0 to 127 do
  begin
    b:=inbyte(f);
    write(d,b);
  end;
  close(d);
  reset(d);
  for f:=0 to 127 do
  begin
    read(d,b);
    if b<>inbyte(f) then dump_cmos:=false;
  end;
  close(d);
  if ioresult<>0 then dump_cmos:=false;
{$I+}
end;

procedure restore_dump(n:string);
var d:file of byte;
    f,b:byte;
begin
  assign(d,n);
  reset(d);
  if IOresult<>0 then exit;
  if filesize(d)<>128 then exit;
  for f:=0 to 127 do
  begin
    read(d,b);
    outbyte(f,b);
  end;
  close(d);
end;

function request:boolean;
var s,c:char;
begin
  gotoxy(4,6);
  write('Are You Sure? ');
  repeat
  c:=readkey;
  if upcase(c) in ['Y','N'] then
  begin
    s:=upcase(c);
    gotoxy(18,6);
    Write(s);
  end;
  until (c=#13) and (s in ['Y','N']);
  if s='Y' then request:=true else request:=false;
end;

var ptr,f:byte;
    crc:word;
    fun:array[1..6] of string;
    c:char;
    s:string;
begin
  fun[1]:='Dump CM0S';
  fun[2]:='Restore CM0S';
  fun[3]:='Disable Password';
  fun[4]:='Set Password';
  fun[5]:='Reset CMOS';
  fun[6]:='Calculate Password';
  ptr:=1;

  repeat
    clrscr;
    box (3,2,61,7);
    gotoxy(4,3);
    write('-=CM0S Manager & AWARD  Password Fucker By Drozhd Maxim=-');
    gotoxy(4,4);
    for f:=1 to 6 do
    begin
      if f=5 then gotoxy(4,5);
      if f=ptr then
      begin
        highvideo;
        s:='<'+fun[f]+'>';
      end else
      begin
        lowvideo;
        s:='['+fun[f]+']';
      end;
      write(s);

      lowvideo;
    end;
    c:=readkey;
    case c of
    #75: if ptr>1 then dec(ptr) else ptr:=6;
    #77: if ptr<6 then inc(ptr) else ptr:=1;
    #13: case ptr of
         1:
           begin
             box (5,7,45,9);
             gotoxy(7,8);
             write ('PHile Name With0ut X-tension:');
             s:=input(8);
             if s<>'' then dump_cmos(s+'.dmp');
           end;
         2:
           begin
             if not request then continue;
             box (5,7,45,9);
             gotoxy(7,8);
             write ('PHile Name With0ut X-tension:');
             s:=input(8);
             if s<>'' then restore_dump(s+'.dmp');
           end;
         3:
           begin
             f:=inbyte(17);
             if ((f and 2)=2) then f:=f xor 2;
             outbyte(17,f);
             crc:=crc_calc(true);
             outbyte(46,hi(crc));
             outbyte(47,lo(crc));
             gotoxy(4,6);
             write('PassW0rd DisAbled');
             readkey;
           end;
         4:
           begin
             box(5,7,35,9);
             gotoxy(7,8);
             write('Enter NEW Password:');
             s:=input(8);
             if length(s)>0 then
             begin
               crc:=pass_crc(s);
               outbyte(28,lo(crc));
               outbyte(29,hi(crc));
               f:=inbyte(17);
               f:=f or 2;
               outbyte(17,f);
               crc:=crc_calc(true);
               outbyte(46,hi(crc));
               outbyte(47,lo(crc));
               gotoxy(4,6);
               write('PassW0rd Changed!');
               readkey;
             end;
           end;

         end;

    end;

  until c=#27;
end.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.095