首页
社区
课程
招聘
[求助]为什么IDC脚本在用IDA点击script file运行和命令行运行结果会不一样?
发表于: 2024-2-26 16:46 1574

[求助]为什么IDC脚本在用IDA点击script file运行和命令行运行结果会不一样?

2024-2-26 16:46
1574

因为环境原因(低版本linux的Wine下跑IDA),idapython没法用只能用idc脚本。
写了个返回函数调用流图的脚本,结果使用
./idat64.exe -c -A -S"fc.idc" ./test.exe
这个命令返回来的结果和直接在IDA里点击运行脚本的结果完全不一样,试了一下感觉是for(target = Rfirst(inst);target != BADADDR; target = Rnext(inst,target))这段的问题,为什么会出现这种情况??

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <idc.idc>
 
static refs(start)
{
    auto func,end,target,inst,name,flags,xref,s,output;
     
    flags = SEARCH_DOWN | SEARCH_NEXT;
    output="";
     
    func = GetFunctionAttr(start,FUNCATTR_START);
    if(func != -1)
    {
        name =Name(func);
        end = GetFunctionAttr(func,FUNCATTR_END);
        for(inst = func;  (inst < end)&&(inst !=BADADDR) ; inst = FindCode(inst,flags))
        {
 
            for(target = Rfirst(inst);target != BADADDR; target = Rnext(inst,target))
            {
  
                 xref = XrefType();
                if(xref == fl_CN || xref == fl_CF)
                {
                    s=sprintf("%s call -> %s from --> %x \n",name,Name(target),inst);
                    output=sprintf("%s%s",output,s);
                }
 
            }
        }
    }
    return output;
}
static main()
{
     auto addr,file, start,end, args, locals, frame, firstArg, name, ret,s1,s2,s3,s4,output;
     addr = 0;
     for (addr = NextFunction(addr); addr != BADADDR; addr = NextFunction(addr))
    {
         name = Name(addr);
         start = GetFunctionAttr(addr, FUNCATTR_START);
         end = GetFunctionAttr(addr, FUNCATTR_END);
         locals = GetFunctionAttr(addr, FUNCATTR_FRSIZE);
         frame = GetFrame(addr); // retrieve a handle to the function’s stack frame
         ret = GetMemberOffset(frame, " r"); // " r" is the name of the return address
         if (ret == -1) continue;
         firstArg = ret + 4;
         args = GetStrucSize(frame) - firstArg;
         s1=sprintf("Function: %s, starts at %x, ends at %x\n", name, addr, end);
         s2=sprintf(" Local variable area is %d bytes\n", locals);
         s3=sprintf(" Arguments occupy %d bytes (%d args)\n", args, args / 4);
        s4=refs(start);
                output=sprintf("%s%s%s%s%s",output,s1,s2,s3,s4);
 }
file=fopen("output.txt","wt+");
writestr(file,output);
fclose(file);
qexit(0);
}

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 110
活跃值: (146)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好像明白了,是因为main函数开始没调用Wait()来等待ida建立数据库……
加了Wait就对了
2024-2-26 17:19
0
游客
登录 | 注册 方可回帖
返回
//