- 积分
- 813
- 实力分
- 点
- 金钱数
- 两
- 技术分
- 分
- 贡献分
- 分
|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
这个是用来在IDA中Patch的IDC文件,IDC是IDA的一种脚本语言,类似于C语言,系统提供了一些函数和变量,详细信息可以看IDA的帮助。
这个东西的原始作者是AlexSid,我做了一些修改,增加了注释,大家可以在此基础上发挥,增加Undo的功能等等。
使用也很简单,在IDA的文件-〉IDC文件,选择此IDC文件,然后选择VKP文件,制定基地址。就可以了。
- #include
- // 原始作者: AlexSid
- // alexsid@mail.ru
- // 修改:coollang
- // v0.3b
- //如果不想进行实际内容的修改,可以打开此注释,只输出调试信息
- //#define DEBUG
- #define PATCH_ALWAYS 0 // 1-YES 0-NO
- //Flash映射的基地址
- #define FF_OFFSET 0xA00000
- static main() {
-
- auto ea, ea1, pos, st, st2, f, st_addr, st_old, st_new, addr, b_old, b_new, no_olds, ff_offset;
-
- st=AskFile(0,"*.vkp","选择VKP文件:");
- Message("Patch file name: %s\n",st);
- f=fopen(st,"r");
- if (f==-1)
- Message("File open error\n");
- else{
- ff_offset=FF_OFFSET;
- ff_offset = AskAddr(FF_OFFSET, "请输入Flash映射的基地址:");
- if(ff_offset == BADADDR)
- Message("无效地址!\n");
- Message("Flash映射的基地址: 0x%06X\n",ff_offset);
- // 从VKP文件中读出一行
- while ((st=readstr(f))!=-1){
- // 过滤注释
- pos=strstr(st,";");
- if (pos>-1){
- st2=substr(st, 0, pos);
- st=st2;
- }
- // 如果是系统参数
- pos=strstr(st,"#");
- if (pos>-1){
- st2=substr(st, 0, pos);
- st=st2;
- }
- // 滤去开头的空格
- while (strstr(st," ")==0 && strlen(st)>0){
- st2=substr(st,1,-1);
- st=st2;
- }
- // 替换换行\t为空格
- while ((pos=strstr(st,"\t"))>-1 && strlen(st)>0){
- st_old=substr(st,0,pos);
- st_new=substr(st,pos+1,-1);
- st=st_old+" "+st_new;
- }
- // 无内容则继续
- if (strlen(st)0){
- st2=substr(st,1,-1);
- st=st2;
- }
- // 取得原始内容
- pos=strstr(st," ");
- st_old=substr(st, 0, pos);
- st2=substr(st, pos+1, -1);
- st=st2;
- while (strstr(st," ")==0 && strlen(st)>0){
- st2=substr(st,1,-1);
- st=st2;
- }
- // 取得覆盖内容
- pos=strstr(st," ");
- st2=substr(st,0,pos);
- pos=strstr(st2,"\n");
- st_new=substr(st2,0,pos);
- no_olds=0;
- if (strlen(st_new)==0){
- no_olds=1;
- st_new=st_old;
- }
- //如果存在原始信息且长度不相等则输出错误信息
- if ((strlen(st_old)!=strlen(st_new)) && (no_olds==0)){
- Message("Error! %d %d |%s| |%s|\n",strlen(st_old),strlen(st_new),st_old,st_new);
- return;
- }
- // 如果存在原始信息则比较原始内容
- while (strlen(st_old)>0){
- b_old=0;
- if (no_olds==0){
- st=substr(st_old,0,2);
- b_old=xtol(st);
- st2=substr(st_old,2,-1);
- st_old=st2;
- }
- st=substr(st_new,0,2);
- b_new=xtol(st);
- st2=substr(st_new,2,-1);
- st_new=st2;
-
- if (no_olds==0) Message("0x%6X: %02X %02X ", addr, b_old, b_new);
- if (no_olds==1) Message("0x%6X: xx %02X ", addr, b_new);
- Jump(addr);
- if (Byte(addr)==b_new){
- Message(" always patched\n");
- addr=addr+1;
- continue;
- }
- if ((Byte(addr)!=b_old) && (PATCH_ALWAYS==0) && (no_olds==0)){
- // 如果没有原始信息
- Message("Warning! old: %02X",Byte(addr));
- // 用户选择
- pos=AskYN(1,"新旧内容不符!\n是否继续Patch?");
- if (pos==-1){
- Message("\nStopped!\n");
- return;
- }
- if (pos==1){
- #ifndef DEBUG
- PatchByte(addr,b_new);
- #endif
- Message(" Patched\n");}
- if (pos==0){
- Message(" Skipped\n");
- }
- } else {
- #ifndef DEBUG
- PatchByte(addr,b_new);
- #endif
- Message(" patched\n");
- }
-
- #ifndef DEBUG
- MakeUnkn(addr,1);
- #endif
- addr=addr+1;
-
- }
- }
- fclose(f);
- }
- }
复制代码 |
|