爱技术

 找回密码
 注册会员

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 4370|回复: 10
收起左侧

[原创]用来在IDA中Patch的IDC文件

[复制链接]
发表于 2005-8-11 00:00:00 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册会员 微信登录

x
这个是用来在IDA中Patch的IDC文件,IDC是IDA的一种脚本语言,类似于C语言,系统提供了一些函数和变量,详细信息可以看IDA的帮助。
这个东西的原始作者是AlexSid,我做了一些修改,增加了注释,大家可以在此基础上发挥,增加Undo的功能等等。
使用也很简单,在IDA的文件-〉IDC文件,选择此IDC文件,然后选择VKP文件,制定基地址。就可以了。

  1. #include

  2. // 原始作者: AlexSid
  3. // alexsid@mail.ru
  4. // 修改:coollang

  5. // v0.3b

  6. //如果不想进行实际内容的修改,可以打开此注释,只输出调试信息
  7. //#define DEBUG


  8. #define PATCH_ALWAYS   0 // 1-YES 0-NO

  9. //Flash映射的基地址
  10. #define FF_OFFSET 0xA00000

  11. static main() {
  12.        
  13.         auto ea, ea1, pos, st, st2, f, st_addr, st_old, st_new, addr, b_old, b_new, no_olds, ff_offset;
  14.        
  15.         st=AskFile(0,"*.vkp","选择VKP文件:");
  16.         Message("Patch file name: %s\n",st);
  17.         f=fopen(st,"r");
  18.         if (f==-1)
  19.                 Message("File open error\n");
  20.         else{
  21.                 ff_offset=FF_OFFSET;
  22.                 ff_offset = AskAddr(FF_OFFSET, "请输入Flash映射的基地址:");
  23.                 if(ff_offset == BADADDR)
  24.                     Message("无效地址!\n");
  25.                 Message("Flash映射的基地址: 0x%06X\n",ff_offset);
  26.                 // 从VKP文件中读出一行
  27.                 while ((st=readstr(f))!=-1){
  28.                         // 过滤注释
  29.                         pos=strstr(st,";");
  30.                         if (pos>-1){
  31.                                 st2=substr(st, 0, pos);
  32.                                 st=st2;
  33.                         }
  34.                         // 如果是系统参数
  35.                         pos=strstr(st,"#");
  36.                         if (pos>-1){
  37.                                 st2=substr(st, 0, pos);
  38.                                 st=st2;
  39.                         }
  40.                         // 滤去开头的空格
  41.                         while (strstr(st," ")==0 && strlen(st)>0){
  42.                                 st2=substr(st,1,-1);
  43.                                 st=st2;
  44.                         }
  45.                         // 替换换行\t为空格
  46.                         while ((pos=strstr(st,"\t"))>-1 && strlen(st)>0){
  47.                                 st_old=substr(st,0,pos);
  48.                                 st_new=substr(st,pos+1,-1);
  49.                                 st=st_old+" "+st_new;
  50.                         }
  51.                         // 无内容则继续
  52.                         if (strlen(st)0){
  53.                                 st2=substr(st,1,-1);
  54.                                 st=st2;
  55.                         }
  56.                         // 取得原始内容
  57.                         pos=strstr(st," ");
  58.                         st_old=substr(st, 0, pos);
  59.                         st2=substr(st, pos+1, -1);
  60.                         st=st2;
  61.                         while (strstr(st," ")==0 && strlen(st)>0){
  62.                                 st2=substr(st,1,-1);
  63.                                 st=st2;
  64.                         }
  65.                         // 取得覆盖内容
  66.                         pos=strstr(st," ");
  67.                         st2=substr(st,0,pos);
  68.                         pos=strstr(st2,"\n");
  69.                         st_new=substr(st2,0,pos);
  70.                         no_olds=0;
  71.                         if (strlen(st_new)==0){
  72.                                 no_olds=1;
  73.                                 st_new=st_old;
  74.                         }
  75.                         //如果存在原始信息且长度不相等则输出错误信息
  76.                         if ((strlen(st_old)!=strlen(st_new)) && (no_olds==0)){
  77.                                 Message("Error! %d %d |%s| |%s|\n",strlen(st_old),strlen(st_new),st_old,st_new);
  78.                                 return;
  79.                         }
  80.                         // 如果存在原始信息则比较原始内容
  81.                         while (strlen(st_old)>0){
  82.                                 b_old=0;
  83.                                 if (no_olds==0){
  84.                                         st=substr(st_old,0,2);
  85.                                         b_old=xtol(st);
  86.                                         st2=substr(st_old,2,-1);
  87.                                         st_old=st2;
  88.                                 }
  89.                                 st=substr(st_new,0,2);
  90.                                 b_new=xtol(st);
  91.                                 st2=substr(st_new,2,-1);
  92.                                 st_new=st2;
  93.                                
  94.                                 if (no_olds==0) Message("0x%6X: %02X %02X ", addr, b_old, b_new);
  95.                                 if (no_olds==1) Message("0x%6X: xx %02X ", addr, b_new);
  96.                                 Jump(addr);
  97.                                 if (Byte(addr)==b_new){
  98.                                         Message(" always patched\n");
  99.                                         addr=addr+1;
  100.                                         continue;
  101.                                 }
  102.                                 if ((Byte(addr)!=b_old) && (PATCH_ALWAYS==0) && (no_olds==0)){
  103.                                         // 如果没有原始信息
  104.                                         Message("Warning! old: %02X",Byte(addr));
  105.                                         // 用户选择
  106.                                         pos=AskYN(1,"新旧内容不符!\n是否继续Patch?");
  107.                                         if (pos==-1){
  108.                                                 Message("\nStopped!\n");
  109.                                                 return;
  110.                                         }
  111.                                         if (pos==1){
  112. #ifndef DEBUG
  113.                                                 PatchByte(addr,b_new);
  114. #endif
  115.                                                 Message(" Patched\n");}
  116.                                         if (pos==0){
  117.                                                 Message(" Skipped\n");
  118.                                         }
  119.                                 } else {
  120. #ifndef DEBUG
  121.                                         PatchByte(addr,b_new);
  122. #endif
  123.                                         Message(" patched\n");
  124.                                 }
  125.                                
  126. #ifndef DEBUG
  127.                                 MakeUnkn(addr,1);
  128. #endif
  129.                                 addr=addr+1;
  130.                                
  131.                         }

  132.             }
  133.             fclose(f);
  134.         }
  135. }
复制代码
发表于 2005-8-11 00:01:00 | 显示全部楼层
第一个顶!收藏下,先去看看IDA帮助文件!
idc的脚本语言的确给人似曾相识的感觉,是不是基于C语言开发的?^-^~!
发表于 2005-8-11 00:02:00 | 显示全部楼层
好,成功,省了大力气了,谢谢!!!
能否在更改的地址自动加上注释?
 楼主| 发表于 2005-8-11 00:03:00 | 显示全部楼层
可以,参照我以前发过的解语言包的程序,那个就是在对应地方加注释。
我的想法是,可以把一个Patch里的注释直接放在IDA文件中的对应位置上。
我这算是抛砖引玉了,各种复杂的做法大家可以自己发挥!
发表于 2005-8-11 00:04:00 | 显示全部楼层
刚才试过,已经够好用了。 ^_^
发表于 2005-8-11 00:05:00 | 显示全部楼层
DING!
那么做补丁是不是就可以用C语言写了?
 楼主| 发表于 2005-8-11 00:06:00 | 显示全部楼层
以下是引用lishenglyx在2004-5-15 0:38:45的发言:
DING!
那么做补丁是不是就可以用C语言写了?

这个和补丁的语言无关,不过补丁确实可以用C语言写。
你可以用Tasking,把函数先声明一下,就可以在C语言里调用了,最后联合编译。
Tasking的破解版Mamaich曾经提供过一个,等有了Ftp我传上去!
发表于 2005-8-11 00:07:00 | 显示全部楼层
咦,以前怎么没注意到这种Script语言,这就回去试试的说~
要谢谢狼大先~

btw:问一下,这种脚本在IDA中有提供调试的环境吗?
 楼主| 发表于 2005-8-11 00:08:00 | 显示全部楼层
还没发现调试环境,我一般都是通过输出信息来调试!
发表于 2005-8-11 00:09:00 | 显示全部楼层
集成的东西,未提供调试。
IDA本来就是静态反编译:)
发表于 2005-8-11 00:10:00 | 显示全部楼层
刚才用IDC文件导入一个文件,处理
27D500:FFFFFFFFFFFFFFFF DC4FD44E02002D32
等较短的还可以,
但处理:
4EDC70:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF81FFFFFFFFFFFFFFFFFFFFFFF801FFFFFFFFFFFFFFFFFFFFFFC003FFFFFFFFFFFFFFFFFFFFFC0007FFFFFFFFFFFFFFFFFFFFE3F00FFFFFFFFFFFFFFFFFFFFFFFFC1FFFFFF8383FF0FFFFFFFFFFFE3FFFFFF0303FF0FFFFFFFFFFFE7FFFFFE0203010F8022203003EFFFFFFE0002010F0020031001DFFFFFFC00021F0F0C20031041FFFFFFF800423F0F1E218010E1FFFFFFF820C21F000C21C3F0E1FFFFFFF060C201000021C190E1FFFFFFE0E1C301008021E010E1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 000000000000000000000000077C0000000000000000000001F740000000000000000000000017402000000000000000000000174060000000000000000000601740A00000000000000000FAE017013FF000977001FFFE00827E0701201000D42000010000A2630701A41000F720000380008FC107032DD000B4200006C000A75D0701241000972001FFFE00825D070125D400000001860600B85D0701A01A00FFE001420A00804107032C1401001001201200BF5D070122A8024A880110220080410701245002E02801084200895D0701A8B0024E88012792009C4107034ED002112801400A00BE630701801002208801800600883E0701FFF001C07001FFFE00EBF00700000000000000000000000007000000000000000000000000070000000000000000000000000700000000000000000000000007000000000000000000000000070300000000000000000000000704877000000000003000C00007048EF80003000000CC00C000070319EC00050000F89400FC0807003FBE00092001051200C6FC0703FFAA001110018D6200828E0702E1C203A15000F88400BABC0703C0E002A1480104CC00BAA80703807002A12800F83000BAA00707003802A1280104000082A00706F81802A12800F801FFFFFF8702D81002A14801047A000000C702A9D003A15000F8840000006702D9D00011100104CC0FFFF06702F9D000092000F87C100010670201D00005000000042000186703FFF0000300000004400018670000000000000000049C07D867000000000000000004801C78670000000000000000049F301867000000000000000004802008670000000000000000049F600C670000000080300004948040046701CFF000C0300009249FC00667014FF807BCD601449480400667014FFC00831002A92480600E6701C140008310022004FFE00C6701414006BD56015FE47FF01C6701414001813000A01C001C78670141400181600020940007DC6707F3E0067DCE00209400000E6706363000018000303C1144E6670224100001000018641B6D106706B51000000000FFFC155500670495100117180000041145106706B51001B4A400494C1144E06744951001548800555400000077441630015724015D5E000000F743E3E0011418009493FFFFFFD7400000000000000001FFFFFF977C0000000000000000000001F700000000000000000000000007FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFDEFFFC07F843FFFFFFFFFFC0FF841FC1B7FB5BFFFEFAFB1FDFFF6B7FF407FB5BFFFE7272EFDFFF001FF5B7F843FFFEAAAAFC007F7FDFC1B7FFB7FFFEDADAFFDFFFC0FFF407F001FFFEFAFAFFC7FFDEFFF7BFFEF7FFFEFAFAFFD9FFC07FF60FF041FFFEFAFAEFDEFFDF7FF3BFFB5BFFFEFAFB1FDFFFDF7FCFBFFB5BFFFFFFFFFFDFFFC07FF807F843FFFFFFFFFFFFFFFFFFFFFFFFFFFF
等较长的就没有导入。
您需要登录后才可以回帖 登录 | 注册会员 微信登录

本版积分规则

小黑屋|Archiver|手机版|爱技术 ( 沪ICP备08115260号-3 )

GMT+8, 2024-6-3 05:43

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表