diff --git a/thinkpad_unlock_bios.c b/thinkpad_unlock_bios.c index 6431c61..9886546 100644 --- a/thinkpad_unlock_bios.c +++ b/thinkpad_unlock_bios.c @@ -2,6 +2,12 @@ #include /* run this program using the console pauser or add your own getch, system("pause") or input loop */ +struct mac_tab +{ + const unsigned long len; + const unsigned long vel[]; +}; + const char bios_head_X250[32]= { @@ -12,6 +18,16 @@ const char bios_head_X260[32]= 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x5A,0xA5,0xF0,0x0F,0x03,0x00,0x04,0x00,0x08,0x02,0x10,0x42,0x30,0x03,0x31,0x00 }; +struct mac_tab x250_mac= +{ + 0, + {0} +}; +struct mac_tab x260_mac= +{ + 2, + {0x1000,0x2000} +}; /* bios type: @@ -23,6 +39,7 @@ bios type: */ char bios_type=0; char buff[0xffffff]; +struct mac_tab *chage_mac_tab; char outputdir[256]; char inputdir[256]; char chack_str(const char *a,char *b,int len) @@ -52,10 +69,12 @@ void change_bios_type() if(bios_type==1) { unlock_bios=fopen("./X250.bbb","rb"); + chage_mac_tab=&x250_mac; } if(bios_type==2) { unlock_bios=fopen("./X260.bbb","rb"); + chage_mac_tab=&x260_mac; } if(unlock_bios==NULL) { @@ -78,17 +97,18 @@ void change_bios_type() char tryunlock(char *dir) { int a=0; - if(dir==NULL) + unsigned long mac_t=0; + if(dir==NULL)//手动输入模式 { printf(" 直接输入BIOS路径:\n 或输入命令:\n change 改变BIOS类型。\n exit 退出程序 \n"); - for(a=0;a<256;a++) + for(a=0;a<256;a++)//清空输入缓存 { inputdir[a]=0; } - scanf("%s",inputdir); - if(chack_str("change",inputdir,6)==0) + scanf("%s",inputdir);//读取输入 + if(chack_str("change",inputdir,6)==0)//读取特殊字符串 { - change_bios_type(); + change_bios_type(); //改变bios类型 return 1; } if(chack_str("exit",inputdir,4)==0) @@ -98,89 +118,99 @@ char tryunlock(char *dir) }else { a=0; - while(dir[a]!='\0') + while(dir[a]!='\0')//拖入文件模式 { inputdir[a]=dir[a]; a++; } } - if(bios_type==0) + if(bios_type==0) //还没设置bios类型 { - change_bios_type(); + change_bios_type();//改变bios类型 } printf("Input flie %s\n",inputdir); - FILE *bios=NULL; - FILE *output_bios=NULL; + FILE *bios=NULL; //将要破解的bios + FILE *output_bios=NULL; //输出的bios bios=fopen(inputdir,"rb"); char id[32]; - if(bios==NULL) + if(bios==NULL)//打开将要破解的bios失败 可能是路径错误 { printf("ERROR. can't Open file ..\n"); + return 0; }else { - fread(id,32,1,bios); + fread(id,32,1,bios);//读取将要破解的bios的前32个字节 鉴定是不是bios文件 if(chack_str(buff,id,32)) { printf("ERROR. Not Bios File\n"); + return 0; }else { //printf("try it..\n"); - if(fseek(bios,0xf00,SEEK_SET)) + if(fseek(bios,0xf00,SEEK_SET))//读取将要破解的Bios的ID { printf("ERROR. -0\n"); + return 0; }else { fread(id,32,1,bios); - for(a=0;a<32;a++) + for(a=0;a<32;a++)//将ID写入已破解bios { buff[0xf00+a]=id[a]; } - - //change MAC ADD - if(fseek(bios,0x1000,SEEK_SET)) + } + //更改MAC地址 + if(fseek(bios,0x1000,SEEK_SET))//读取将要破解的Bios的MAC + { + printf("ERROR. -0\n"); + return 0; + }else + { + for(a=0;a<32;a++)//复用id数组 { - printf("ERROR. -0\n"); - }else + id[a]=0; + } + fread(id,6,1,bios); + //写入到已破解bios,有好几个地址 + for(mac_t=0;mac_tlen;mac_t++) { - for(a=0;a<32;a++) - { - id[a]=0; - } - fread(id,6,1,bios); for(a=0;a<6;a++) { - buff[0x1000+a]=id[a]; + buff[chage_mac_tab->vel[mac_t]+a]=id[a]; } - - for(a=0;a<256;a++) - { - outputdir[a]=0; - } - printf("MAC: %02X%02X%02X%02X%02X%02X \n",id[0],id[1],id[2],id[3],id[4],id[5]); - sprintf(outputdir,"%s%s",inputdir,"_unlock.bin"); - printf("Output flie %s",outputdir); - output_bios=fopen(outputdir,"wb"); - if(output_bios==NULL) - { - printf("ERROR. can't Output file ..\n"); - }else - { - fwrite(buff,0xffffff,1,output_bios); - fclose(output_bios); - } - - printf("\n\n"); - } + + } + + for(a=0;a<256;a++) + { + outputdir[a]=0; + } + printf("MAC: %02X%02X%02X%02X%02X%02X \n",id[0],id[1],id[2],id[3],id[4],id[5]); + sprintf(outputdir,"%s%s",inputdir,"_unlock.bin"); + printf("Output flie %s",outputdir); + output_bios=fopen(outputdir,"wb"); + if(output_bios==NULL) + { + printf("ERROR. can't Output file ..\n"); + }else + { + fwrite(buff,0xffffff,1,output_bios); + fclose(output_bios); + } + + printf("\n\n"); + + - } + } } @@ -244,6 +274,7 @@ char tryunlock(char *dir) int main(int argc, char *argv[]) { + printf("ThinkPad Bios unlock..v0.1\n\n\n"); if(argc==1) { diff --git a/thinkpad_unlock_bios.exe b/thinkpad_unlock_bios.exe index 87d9ef2..25f9d28 100644 Binary files a/thinkpad_unlock_bios.exe and b/thinkpad_unlock_bios.exe differ