From ea752ecd085e5ec5b67ea326345768fd88f9df98 Mon Sep 17 00:00:00 2001 From: kevin Date: Mon, 27 Jun 2022 17:37:33 +0800 Subject: [PATCH] it can change MAC add Signed-off-by: kevin --- thinkpad_unlock_bios.c | 123 ++++++++++++++++++++++++--------------- thinkpad_unlock_bios.exe | Bin 136254 -> 136322 bytes 2 files changed, 77 insertions(+), 46 deletions(-) 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 87d9ef2e44e90fc3e570b0cf3da04dd935838d42..25f9d28abb11c68d586618e0100a0be77b042beb 100644 GIT binary patch delta 12981 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 ahhgjKiTQbcCO;i>it?t_Svv{^9{&$mjWmD& delta 12691 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