看雪软件安全论坛



返回   看雪软件安全论坛 > 软件安全 > 『软件调试论坛』

『软件调试论坛』 本版讨论的主题包括:调试逆向、系统底层、漏洞分析、商业保护、病毒木马、虚拟机、.NET平台、安全新闻等

Expired Thread 该主题: "【求助】谁能告诉我ida怎么用脚本取函数代码啊?" 因在一年内没有任何回复而自动关闭。
如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。

发表新主题 关闭主题
关注  
主题工具 显示模式
shijiaoan
级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时

shijiaoan 的头像

初级会员
初级会员

资 料:
注册日期: Feb 2006
帖子: 106 shijiaoan 品行端正
精华: 0
现金: 203 Kx
1 旧 2006-03-28, 03:57:47 默认 【求助】谁能告诉我ida怎么用脚本取函数代码啊?
shijiaoan 当前离线

晕,求大家帮帮忙了 小第要取一个函数的代码 子函数有100多个 手动取太麻烦了啊 有谁帮忙写一个脚本 或者教教我怎么写脚本啊 有谁有脚本函数的说明的?看了ida的帮助 都是英文的看不大懂

回复时引用此帖 返回顶端
dreaman
级别:2 | 在线时长:20小时 | 升级还需:1小时级别:2 | 在线时长:20小时 | 升级还需:1小时

dreaman 的头像

『.net逆向小组』
『.net逆向小组』

资 料:
注册日期: Mar 2006
帖子: 191 dreaman 品行端正
精华: 9
现金: 200 Kx
2 旧 2006-04-03, 18:22:20 默认
dreaman 当前离线

将下面内容保存到一个文本文件,然后用idapro的装入idc文件执行它,执行前先将光标定位在要生成代码的过程上.

#include "idc.idc"

static ElementExist(arrayid,size,val)
{
  auto i,v;
  for(i=0;i<size;i++)
  {
    v=GetArrayElement(AR_LONG,arrayid,i);
    if(v==val)
      return 1;
  }
  return 0;
}
static GenFuncIns(st,arrayid,size)
{
  auto start,end,i,ins,x,xt;
  start=st;
  end=FindFuncEnd(start);
  for(i=start;i<end;)
  {
    ins=GetDisasm(i);
    for(x=Rfirst(i);x!=BADADDR;x=Rnext(i,x))
    {
      xt=XrefType();
      if(xt == fl_CN && !ElementExist(arrayid,size,x))
      {
        SetArrayLong(arrayid,size,x);
        size++;
      }
    }
    i=ItemEnd(i);/*FindCode(i,1);*/
    Message(form("%s\r\n",ins));
  }
  return size;
}
static main()
{
  auto arrayid,size,pos,st;
  st=ScreenEA();
  if(st==BADADDR)
  {
    Warning("您需要选中一个函数起始地址!");
    return;
  }
  arrayid=CreateArray("gen_func_ins");
  if(arrayid<0)
  {    
    arrayid=GetArrayId("gen_func_ins");
  }
  pos=0;
  SetArrayLong(arrayid,pos,st);
  size=1;
  for(pos=0;pos<size;pos++)
  {
    st=GetArrayElement(AR_LONG,arrayid,pos);  
    Message(form("proc:%8.8x\r\n",st));  
    size=GenFuncIns(st,arrayid,size);
    Message("\r\n");
  }
  DeleteArray(arrayid);
}

此帖于 2006-04-03 18:37:03 被 dreaman 最后编辑
回复时引用此帖 返回顶端
softworm
级别:9 | 在线时长:128小时 | 升级还需:12小时级别:9 | 在线时长:128小时 | 升级还需:12小时级别:9 | 在线时长:128小时 | 升级还需:12小时

VIP会员
VIP会员

资 料:
注册日期: Apr 2004
帖子: 1,031 softworm 品行端正
精华: 30
现金: 222 Kx
3 旧 2006-04-03, 19:45:12 默认
softworm 当前离线

用OD的binary copy不是很方便吗

回复时引用此帖 返回顶端
dreaman
级别:2 | 在线时长:20小时 | 升级还需:1小时级别:2 | 在线时长:20小时 | 升级还需:1小时

dreaman 的头像

『.net逆向小组』
『.net逆向小组』

资 料:
注册日期: Mar 2006
帖子: 191 dreaman 品行端正
精华: 9
现金: 200 Kx
4 旧 2006-04-04, 11:04:19 默认
dreaman 当前离线

OD的binary copy是拷贝连续的代码吧,楼主说的好象是需要提取一个指定函数及其调用的子函数的代码,可能还是得用脚本比较合适.

回复时引用此帖 返回顶端
gzgzlxg
级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时

gzgzlxg 的头像

高级会员
高级会员

资 料:
注册日期: Aug 2005
帖子: 344 gzgzlxg 品行端正
精华: 11
现金: 206 Kx
5 旧 2006-04-05, 10:45:14 默认
帅哥 gzgzlxg 当前离线

dreaman这段代码写的不错,我给改了几句,让生成的代码有跳转地址,对于改写可以减少工作。但那个":"号还是有点问题,到处乱加,哈哈,我对IDC的脚本实在是玩不转。
#include "idc.idc"

static ElementExist(arrayid,size,val)
{
  auto i,v;
  for(i=0;i<size;i++)
  {
    v=GetArrayElement(AR_LONG,arrayid,i);
    if(v==val)
      return 1;
  }
  return 0;
}
static GenFuncIns(st,arrayid,size)
{
  auto start,end,i,ins,x,xt,name;
  start=st;
  end=FindFuncEnd(start);
  for(i=start;i<end;)
  {
    ins=GetDisasm(i);
    for(x=Rfirst(i);x!=BADADDR;x=Rnext(i,x))
    {
      xt=XrefType();
      if(xt == fl_CN && !ElementExist(arrayid,size,x))
      {
        SetArrayLong(arrayid,size,x);
        size++;
      }
    }
    if ((name=GetTrueNameEx(i,i)) != 0) 
      if (LocByName(name) == start)
        Message("%s\r\n",name);
      else
        Message("%s:\r\n",name);
    i=ItemEnd(i);/*FindCode(i,1);*/
    Message(form("    %s\r\n",ins));
  }
  return size;
}
static main()
{
  auto arrayid,size,pos,st,name;
  st=ScreenEA();
  if(st==BADADDR)
  {
    Warning("您需要选中一个函数起始地址!");
    return;
  }
  arrayid=CreateArray("gen_func_ins");
  if(arrayid<0)
  {    
    arrayid=GetArrayId("gen_func_ins");
  }
  pos=0;
  SetArrayLong(arrayid,pos,st);
  size=1;
  for(pos=0;pos<size;pos++)
  {
    st=GetArrayElement(AR_LONG,arrayid,pos);  
    Message(form("proc:%8.8x\r\n",st)); 
    if ((name=GetType(st)) != 0) 
      Message("%s\r\n",GetType(st));
    size=GenFuncIns(st,arrayid,size);
    Message("\r\n");
  }
  DeleteArray(arrayid);
}

回复时引用此帖 返回顶端
ViperDodge
级别:7 | 在线时长:92小时 | 升级还需:4小时级别:7 | 在线时长:92小时 | 升级还需:4小时级别:7 | 在线时长:92小时 | 升级还需:4小时级别:7 | 在线时长:92小时 | 升级还需:4小时

普通会员
普通会员

资 料:
注册日期: Sep 2004
帖子: 166 ViperDodge 品行端正
精华: 1
现金: 242 Kx
6 旧 2006-04-05, 12:40:54 默认
ViperDodge 当前离线

  问一下,脚本执行完毕后,结果放在哪里?

回复时引用此帖 返回顶端
gzgzlxg
级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时

gzgzlxg 的头像

高级会员
高级会员

资 料:
注册日期: Aug 2005
帖子: 344 gzgzlxg 品行端正
精华: 11
现金: 206 Kx
7 旧 2006-04-05, 13:08:49 默认
帅哥 gzgzlxg 当前离线

直接拷贝出去,如果代码太大,就会溢出,这是有两个办法,要么改这个IDC让他直接写成文件,要么加大IDA的缓冲区。

回复时引用此帖 返回顶端
bshjp
级别:0 | 在线时长:4小时 | 升级还需:1小时

普通会员
普通会员

资 料:
注册日期: Oct 2005
帖子: 23 bshjp 品行端正
精华: 2
现金: 200 Kx
8 旧 2006-04-05, 15:32:44 默认
bshjp 当前离线

gzgzlxg 能不能把代码写出的文件的脚本加进来~

回复时引用此帖 返回顶端
shijiaoan
级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时

shijiaoan 的头像

初级会员
初级会员

资 料:
注册日期: Feb 2006
帖子: 106 shijiaoan 品行端正
精华: 0
现金: 203 Kx
9 旧 2006-04-05, 17:05:09 默认
shijiaoan 当前离线

非常感谢上面两位高手!

回复时引用此帖 返回顶端
shijiaoan
级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时级别:3 | 在线时长:28小时 | 升级还需:4小时

shijiaoan 的头像

初级会员
初级会员

资 料:
注册日期: Feb 2006
帖子: 106 shijiaoan 品行端正
精华: 0
现金: 203 Kx
10 旧 2006-04-05, 17:28:24 默认
shijiaoan 当前离线

哈哈 我也修改了一下 这样可以写到文件里了 而且对于错误的call也能辨认
#include "idc.idc"

static ElementExist(arrayid,size,val)
{
  auto i,v;
  for(i=0;i<size;i++)
  {
    v=GetArrayElement(AR_LONG,arrayid,i);
    if(v==val)
      return 1;
  }
  return 0;
}
static GenFuncIns(st,arrayid,size)
{
  auto start,end,i,ins,x,xt,funcend;
  start=st;
  end=FindFuncEnd(start);
  for(i=start;i<end;)
  {
    ins=GetDisasm(i);
    for(x=Rfirst(i);x!=BADADDR;x=Rnext(i,x))
    {
      xt=XrefType();
      if(xt == fl_CN && !ElementExist(arrayid,size,x))
      {
        SetArrayLong(arrayid,size,x);
        size++;
      }
    }
    i=ItemEnd(i);/*FindCode(i,1);*/
    //Message(form("%s\r\n",ins));
  }
  return size;
}
static main()
{
  auto arrayid,size,pos,st,file,funcend;
  st=ScreenEA();
  file=fopen("c:\Get.asm","a+");
  if(st==BADADDR)
  {
    Warning("您需要选中一个函数起始地址!");
    return;
  }
  arrayid=CreateArray("gen_func_ins");
  if(arrayid<0)
  {    
    arrayid=GetArrayId("gen_func_ins");
  }
  pos=0;
  SetArrayLong(arrayid,pos,st);
  size=1;
  for(pos=0;pos<size;pos++)
  {
    st=GetArrayElement(AR_LONG,arrayid,pos);  
    Message(form("proc:%8.8x\r\n",st));  
    funcend=FindFuncEnd(st);
    if (funcend!=BADADDR)
    {
      Message("正在将这个函数代码写入c:\Get.asm中...\r\n");  
      GenerateFile(OFILE_ASM,file, st,funcend, 0);
    }
    else
    {
      Message(form("proc:%8.8x Write false\r\n",st)); 
    }
    size=GenFuncIns(st,arrayid,size);
  }
  DeleteArray(arrayid);
Message("All done, exiting...\n");
}

回复时引用此帖 返回顶端
dreaman
级别:2 | 在线时长:20小时 | 升级还需:1小时级别:2 | 在线时长:20小时 | 升级还需:1小时

dreaman 的头像

『.net逆向小组』
『.net逆向小组』

资 料:
注册日期: Mar 2006
帖子: 191 dreaman 品行端正
精华: 9
现金: 200 Kx
11 旧 2006-04-05, 19:07:19 icon15
dreaman 当前离线

 改过的比我写的好多了.

回复时引用此帖 返回顶端
gzgzlxg
级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时级别:7 | 在线时长:82小时 | 升级还需:14小时

gzgzlxg 的头像

高级会员
高级会员

资 料:
注册日期: Aug 2005
帖子: 344 gzgzlxg 品行端正
精华: 11
现金: 206 Kx
12 旧 2006-04-06, 00:21:07 默认
帅哥 gzgzlxg 当前离线

再改写一下,见笑了。
生成的文件放在c盘的根目录不好,所以改到当前打开的 idb 文件目录下,文件名由 idb 的文件名加上 Part 组成。
代码:
#include "idc.idc"

static ElementExist(arrayid,size,val)
{
  auto i,v;
  for(i=0;i<size;i++)
  {
    v=GetArrayElement(AR_LONG,arrayid,i);
    if(v==val)
      return 1;
  }
  return 0;
}
static GenFuncIns(st,arrayid,size)
{
  auto start,end,i,ins,x,xt,funcend;
  start=st;
  end=FindFuncEnd(start);
  for(i=start;i<end;)
  {
    ins=GetDisasm(i);
    for(x=Rfirst(i);x!=BADADDR;x=Rnext(i,x))
    {
      xt=XrefType();
      if(xt == fl_CN && !ElementExist(arrayid,size,x))
      {
        SetArrayLong(arrayid,size,x);
        size++;
      }
    }
    i=ItemEnd(i);/*FindCode(i,1);*/
    //Message(form("%s\r\n",ins));
  }
  return size;
}
static main()
{
  auto arrayid,size,pos,st,file,funcend,path;
  st=ScreenEA();
  path = GetIdbPath();
  path = substr(path, 0, strlen(path) - 4) + "Part.asm";
  file=fopen(path,"w+");
  if(st==BADADDR)
  {
    Warning("您需要选中一个函数起始地址!");
    return;
  }
  arrayid=CreateArray("gen_func_ins");
  if(arrayid<0)
  {    
    arrayid=GetArrayId("gen_func_ins");
  }
  pos=0;
  SetArrayLong(arrayid,pos,st);
  size=1;
  for(pos=0;pos<size;pos++)
  {
    st=GetArrayElement(AR_LONG,arrayid,pos);  
    Message(form("proc:%8.8x\r\n",st));  
    funcend=FindFuncEnd(st);
    if (funcend!=BADADDR)
    {
      Message("正在将这个函数代码写入 %s \n",path);  
      GenerateFile(OFILE_ASM,file, st,funcend, 0);
    }
    else
    {
      Message(form("proc:%8.8x Write false\r\n",st)); 
    }
    size=GenFuncIns(st,arrayid,size);
  }
  DeleteArray(arrayid);
  fclose(file);
Message("All done, exiting...\n");
}

回复时引用此帖 返回顶端
FishSeeWater
级别:13 | 在线时长:225小时 | 升级还需:27小时级别:13 | 在线时长:225小时 | 升级还需:27小时级别:13 | 在线时长:225小时 | 升级还需:27小时级别:13 | 在线时长:225小时 | 升级还需:27小时

中级会员
中级会员

资 料:
注册日期: Apr 2004
帖子: 350 FishSeeWater 品行端正
精华: 7
现金: 414 Kx
13 旧 2006-04-06, 08:41:36 默认
FishSeeWater 当前在线

牛老大们多写点IDA教程呀:)
我等菜鸟很需要的:)

回复时引用此帖 返回顶端
jules
级别:1 | 在线时长:8小时 | 升级还需:4小时

初级会员
初级会员

资 料:
注册日期: Mar 2006
帖子: 64 jules 品行端正
精华: 0
现金: 200 Kx
14 旧 2006-04-06, 09:56:00 默认
jules 当前离线

顶牛牛们
ida反编译出来的代码可读性比od高挺多的,希望牛牛们多贴一些ida的使用技巧

回复时引用此帖 返回顶端
快雪时晴
级别:14 | 在线时长:280小时 | 升级还需:5小时级别:14 | 在线时长:280小时 | 升级还需:5小时级别:14 | 在线时长:280小时 | 升级还需:5小时级别:14 | 在线时长:280小时 | 升级还需:5小时级别:14 | 在线时长:280小时 | 升级还需:5小时

快雪时晴 的头像

普通会员
普通会员

资 料:
注册日期: Jun 2005
帖子: 1,475 快雪时晴 品行端正
精华: 4
现金: 226 Kx
15 旧 2006-04-06, 11:56:20 默认
快雪时晴 当前离线

顺便问问牛人们有么有OD下的同类脚本

回复时引用此帖 返回顶端
发表新主题 关闭主题

书签
Expired Thread 该主题: "【求助】谁能告诉我ida怎么用脚本取函数代码啊?" 因在一年内没有任何回复而自动关闭。
如果您还对该主题感兴趣或者想参与对此主题的讨论,请您重新发表一篇相关的新主题。


主题工具
显示模式

发帖规则
不可以发表新主题
不可以发表回复
不可以上传附件
不可以编辑自己的帖子
论坛启用 BB 代码
论坛启用 表情符号
论坛跳转


所有时间均为北京时间。现在的时间是 17:00:39


©2000-2010 PEdiy.com All rights reserved.By PEDIY
Powered by vBulletin ®Jelsoft Enterprises Ltd. 增强包制作PHP源动力.界面支持standme Studio.