This software is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
Thanks to bluefish for BSD support
*/
#include <string.h>
#include <stdio.h>
#ifdef __MSDOS__
#include <dos.h>
#include <ctype.h>
#include <conio.h>
#elif defined linux
#include <unistd.h>
#include <ctype.h>
#include <errno.h>
int ioperm(unsigned long, unsigned long, int);
#elif defined WIN32
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
#define outportb(PORT,VALUE) outp(PORT,VALUE)
#define inportb(PORT) inp(PORT)
//
// Macro definition for defining IOCTL and FSCTL function control codes. Note
// that function codes 0-2047 are reserved for Microsoft Corporation, and
// 2048-4095 are reserved for customers.
//
// Device type -- in the "User Defined" range."
#define IOPMD_TYPE 0xF100 // used several places
// The IOCTL function codes from 0x800 to 0xFFF are for non-Microsoft use.
// LIOPM means "local I/O Permission Map" maintained by this driver.
//--------------------------
// Test functions
#define IOCTL_IOPMD_READ_TEST CTL_CODE(IOPMD_TYPE, 0x900, METHOD_BUFFERED, FILE_ANY_ACCESS ) // returns IOPM_TEST
#define IOCTL_IOPMD_READ_VERSION CTL_CODE(IOPMD_TYPE, 0x901, METHOD_BUFFERED, FILE_ANY_ACCESS ) // returns IOPM_VERSION
// Manipulate local IOPM
#define IOCTL_IOPMD_CLEAR_LIOPM CTL_CODE(IOPMD_TYPE, 0x910, METHOD_BUFFERED, FILE_ANY_ACCESS ) // set map to block perm on all I/O addresses
#define IOCTL_IOPMD_SET_LIOPM CTL_CODE(IOPMD_TYPE, 0x911, METHOD_BUFFERED, FILE_ANY_ACCESS ) // set a byte (8 ports-worth) in LIOPM
#define IOCTL_IOPMD_GET_LIOPMB CTL_CODE(IOPMD_TYPE, 0x912, METHOD_BUFFERED, FILE_ANY_ACCESS ) // get a byte from LIOPM (diagnostic)
#define IOCTL_IOPMD_GET_LIOPMA CTL_CODE(IOPMD_TYPE, 0x913, METHOD_BUFFERED, FILE_ANY_ACCESS ) // get entire array of current LIOPM
// Interact with kernel
#define IOCTL_IOPMD_ACTIVATE_KIOPM CTL_CODE(IOPMD_TYPE, 0x920, METHOD_BUFFERED, FILE_ANY_ACCESS ) // copy LIOPM to be active map
#define IOCTL_IOPMD_DEACTIVATE_KIOPM CTL_CODE(IOPMD_TYPE, 0x921, METHOD_BUFFERED, FILE_ANY_ACCESS ) // tell NT to forget map
#define IOCTL_IOPMD_QUERY_KIOPM CTL_CODE(IOPMD_TYPE, 0x922, METHOD_BUFFERED, FILE_ANY_ACCESS ) // get OS's IOPM into LIOPM?
#define GWIOPM_PARAMCOUNT 3 // for most functions
#define GWIOPM_PARAMCOUNT_BYTES GWIOPM_PARAMCOUNT * 4 // for most functions
#elif defined(bsd)
#include <ctype.h>
#include <stdlib.h>
FILE *cmos_fd;
#endif
typedef unsigned char byte; /* type of 8 bit unsigned quantity */
typedef unsigned char Bit8u;
typedef unsigned short Bit16u; /* type of 16 bit unsigned quantity */
typedef unsigned long Bit32u; /* type of 32 bit unsigned quantity */
#define TAILLE_CMOS 0x80
#define TAILLE_BUFFER 2*0x200+TAILLE_CMOS
#define MINLEN_CRC 6
/* port i/o privileges & co. */
#define IO_READ 1
#define IO_WRITE 2
#define IO_RDWR (IO_READ | IO_WRITE)
#define PORT_CMOS_0 0x70
#define PORT_CMOS_1 0x71
#define UNKNOWN_CAR '?'
#define VAL_NON_STOP 256
int get32(int position);
void printchar(unsigned char car, int scancode);
void aff_hexa(const unsigned char*buffer,const int lng);
int build_table(const int position, const int lng, const int meth_parcourt, int *table);
void table2val(const int *table, unsigned char *value, const int lng);
void aff_result(const unsigned char *value, const int lng,const int val_stop,const int mode_aff);
int generic_ami(unsigned char *value, const int lng, const int methode,const int val_stop);
void generic_acer(unsigned char *value, const int lng,const int val_stop);
void generic_dtk(unsigned char *value, const int lng,const unsigned char value_stop);
void generic_unknown(unsigned char*value, const int lng,const int val_stop);
void generic_phoenix_dec(unsigned char *value, const int lng,const unsigned char value_stop);
void generic_phoenix_xor(unsigned char *value, const int lng,const unsigned char value_stop);
void generic_phoenix_add(unsigned char *value, const int lng,const unsigned char value_stop);
int check_filled(const unsigned char*value, const int lng, const unsigned char filled_value);
void generic_basic(const int position, const int lng, const int meth_parcourt,const int algo,const int val_stop,const int mode_aff);
int check_crcadd(int position, int size, int pos_crc);
void generic_crc(int algo, int position);
void award_backdoor(void);
char get_table_pb(unsigned char val)
{
switch(val)
{
case 0xE7:
case 0x3F:
return 'B';
case 0xA3:
return 'C';
case 0xFB:
return 'D';
case 0xBD:
return 'E';
case 0xF6:
return 'F';
case 0x77:
return 'G';
case 0xB9:
return 'H';
case 0xCF:
return 'O';
case 0xD7:
return 'T';
}
return UNKNOWN_CAR;
}
/* Affichage de caractere */
void printchar(unsigned char car, int scancode)
{
printf("%c", filtre(scancode?scan2ascii(car):car));
}
/* Affichage de la cmos */
void dumpcmos(const int scancode)
{
int i,j;
for (i=0;i<TAILLE_CMOS;i+=0x10)
{
printf("\n%02X: ", i);
for(j=0;j<0x10;j++)
printf("%02X ", cmos[i+j]);
printf(" |");
for(j=0;j<0x10;j++)
printchar(cmos[i+j],scancode);
printf("|");
}
printf("\n");
}
void aff_hexa(const unsigned char*buffer,const int lng)
{
int i;
for(i=0;i<lng;i++)
printf("%02X ",buffer[i]);
}
/* test et manipulation binaire */
byte parity_test(byte val)
{
int res=0;
int i;
for(i=0;i<8;i++)
{
if(val&1)
res^=1;
val>>=1;
}
return res;
}
int build_table(const int position, const int lng, const int meth_parcourt, int *table)
{
int i;
switch(meth_parcourt)
{
case METH_PARC_NORMAL:
for(i=0;i<lng;i++)
table[i]=position+i;
return 0;
case METH_PARC_SWAP:
for(i=0;i<lng;i+=2)
{
table[i]=position+i+1;
if(i+1<lng)
table[i+1]=position+i;
}
return 0;
}
return 1;
}
void table2val(const int *table, unsigned char *value, const int lng)
{
int i;
for(i=0;i<lng;i++)
if(table[i])
value[i]=cmos[table[i]];
else
value[i]=UNKNOWN_CAR;
}
void aff_result(const unsigned char *value, const int lng,const int val_stop,const int mode_aff)
{
int i;
putchar('[');
for(i=0;(i<lng) && (value[i]!=val_stop);i++)
{
if(value[i]==UNKNOWN_CAR)
putchar('?');
else
switch(mode_aff)
{
case AFF_ASCII:
putchar(filtre(value[i]));
break;
case AFF_SCAN:
putchar(filtre(scan2ascii(value[i])));
break;
default:
printf("Bad display method");
}
}
putchar(']');
}
int generic_ami(unsigned char *value, const int lng, const int methode,const int val_stop)
{
int pos;
unsigned char ah,al;
switch(methode)
{
case ALGO_AMI_F0: al=value[0] & 0xF0; break;
case ALGO_AMI: al=value[0]; break;
case ALGO_AMI_80: al=0x80; break;
default: printf("Bad AMI ALGO"); return 1;
}
for(pos=1;pos<lng;pos++)
{
int i;
ah=al;
al=value[pos];
if (al==val_stop) break;
for (i=0;i<=255;i++)
{
if (al==ah) break;
if (parity_test(0xE1&al)) al=(al<<1)|1; else al<<=1;
}
al=value[pos];
if(i>255)
value[pos-1]=UNKNOWN_CAR;
else
value[pos-1]=i;
value[pos]=val_stop;
}
return 0;
}
void generic_acer(unsigned char *value, const int lng,const int val_stop)
{
int i;
for(i=0;(i<lng)&&(value[i]!=val_stop);i++)
value[i]=value[i]>>1; /* ibm_1 */
/* shr al,1 D0 E8
* cmp al,[bx+si] 3A 00
*/
}
void generic_unknown(unsigned char*value, const int lng,const int val_stop)
{
int i;
for(i=0;(i<lng)&&(value[i]!=val_stop);i++)
value[i]=UNKNOWN_CAR;
}
int check_filled(const unsigned char*value, const int lng, const unsigned char filled_value)
{
int i;
int etat=0;
for(i=0;i<lng;i++)
{
switch(etat)
{
case 0:
if(value[i]==filled_value)
etat++;
break;
case 1:
if(value[i]!=filled_value)
return 1;
}
}
return 0;
}
void generic_table(const int *table, const int lng, const int algo,const int val_stop,const int mode_aff);
void generic_basic(const int position, const int lng, const int meth_parcourt,const int algo,const int val_stop,const int mode_aff)
{
#ifdef __MSDOS__
int table[10];
#else
int table[lng];
#endif
build_table(position,lng,meth_parcourt,table);
generic_table(table,lng,algo,val_stop,mode_aff);
}
void generic_table(const int *table, const int lng, const int algo,const int val_stop,const int mode_aff)
{
#ifdef __MSDOS__
unsigned char value[10];
#else
unsigned char value[lng];
#endif
table2val(table,value,lng);
switch(algo)
{
case ALGO_AMI_F0:
case ALGO_AMI:
case ALGO_AMI_80:
generic_ami(value,lng,algo,val_stop);
break;
case ALGO_UNKNOW:
generic_unknown(value,lng,val_stop);
break;
case ALGO_ACER:
generic_acer(value,lng,val_stop);
break;
case ALGO_PACKARD:
check_filled(value,lng,val_stop);
generic_packard(value,lng,val_stop);
break;
case ALGO_NONE:
break;
case ALGO_PHOENIX_DEC:
generic_phoenix_dec(value,lng,val_stop);
break;
case ALGO_PHOENIX_XOR:
generic_phoenix_xor(value,lng,val_stop);
break;
case ALGO_PHOENIX_ADD:
generic_phoenix_add(value,lng,val_stop);
break;
case ALGO_DTK:
generic_dtk(value,lng,val_stop);
break;
default:
printf("BAD ALGO ");
return;
}
aff_result(value,lng,val_stop,mode_aff);
}
/* ================================================================= */
int check_crcadd(int position, int size, int pos_crc)
{
int i;
int crc=0;
for(i=position;i<position+size;i++)
crc+=cmos[i];
return ((crc & 0xFF) == cmos[pos_crc]);
}
void generic_packard(unsigned char *value, const int lng,const unsigned char value_stop)
{
int i;
for(i=1;(i<lng)&&(value[i]!=value_stop);i++) /* Ecrase le "CRC ?" */
{
value[i-1]=get_table_pb(value[i]);
value[i]=value_stop;
}
}
/* ==================================================== */
void generic_crc(int algo, int position)
{
switch(algo)
{
case ALGO_AWARD:
brute_award(get32(position));
break;
case ALGO_TOSHIBA:
brute_toshiba(get32(position));
break;
}
}
/* Brute force Award */
int awa_pos;
char awa_res[9];
int kill_cmos(void)
{
int i;
char car;
printf("Warning: if the password is stored in an eeprom (notebook), the password won't be erased\n"
"\n1 - Kill cmos"
"\n2 - Kill cmos (try to keep date and time)"
"\n0 - Abort"
"\nChoice : ");
fflush(stdout);
do
car=toupper(getchar());
while((car<'0')||(car>'2'));
fflush(stdout);
if(car=='0')
return 1;
set_permissions();
for (i=(car=='1'?0:0x10);i<TAILLE_CMOS;i++)
write_cmos(i,0);
unset_permissions();
printf("\nCmos killed!");
if(car=='1')
printf("\nRemember to set date and time");
return 0;
}
int load_cmos(void)
{
int i;
set_permissions();
for (i=0;i<TAILLE_CMOS;i++)
cmos[i]=read_cmos(i);
unset_permissions();
return 0;
}
int restore_cmos(int choix)
{
int i;
char car='2';
if(choix)
{
printf("\n1 - Restore full cmos"
"\n2 - Restore cmos (keep date and time)"
"\n0 - Abort"
"\nChoice : ");
fflush(stdout);
do
car=toupper(getchar());
while((car<'0')||(car>'2'));
printf("%c\n", car);
fflush(stdout);
if(car==0)
return 1;
}
set_permissions();
for (i=(car=='1'?0:0x10);i<TAILLE_CMOS;i++)
write_cmos(i,cmos[i]);
unset_permissions();
if(car=='1')
printf("\nRemember to set date and time");
return 0;
}
int load_backup(const char* name)
{
FILE *fb;
unsigned char buffer[TAILLE_BUFFER+1];
unsigned int taille,i;
fb=fopen(name,"rb");
if (fb==0)
{
printf("\nUnable to read %s", name);
return 1;
}
taille=fread(buffer,1, TAILLE_BUFFER+1,fb);
fclose(fb);
if((taille==64)||(taille==128)||(taille==256))
{
printf("\nRead a %d byte cmos backup (%s)",taille, name);
for(i=0;i<taille;i++)
cmos[i]=buffer[i];
}
else
if((taille==64-0x10)||(taille==128-0x10)||(taille==256-0x10))
{
printf("\nRead a %d byte cmos backup, first 16 byte skipped",taille);
for(i=0x10;i<taille;i++)
cmos[i]=buffer[i-0x10];
}
else
if(taille==0x400+TAILLE_CMOS-0x10)
{
printf("\nRead a cmos backup from a SAUVER file");
for(i=0x10;i<TAILLE_CMOS;i++)
cmos[i]=buffer[0x400+i-0x10];
}
else
if(taille==129)
{
printf("\nRead a %d byte cmos !BIOS backup (%s)",taille, name);
for(i=0;i<taille;i++)
cmos[i]=buffer[i];
}
else
{
printf("\nUnknown file format");
for(i=0;i<TAILLE_CMOS;i++)
cmos[i]=buffer[i];
}
return 0;
}
첫댓글 소스에 #define문을 보면 지원되는 바이오스 목록이 나와 있네요. 캬하하하하 아 또 자폐증이....