IDA6.8 脚本学习:

来源:互联网 发布:sql语句查询最高两位 编辑:程序博客网 时间:2024/06/06 12:55
IDA6.8 脚本学习:


author:hjjdebug

自己的一个小经历, 留个纪念吧!


看见IDA 在调试时,有一个默认python 的交换调试窗口.
点击它,可以改为IDC 脚本对话窗口.
然后可以在这个窗口中输入命令:

输入什么呢? 先来个hello, world 吧
输入: print "hello"
提示说: missing semicolon
IDC>print hello
Missing semicolon
加上分号; print hello; 还是提示missing semicolon
后来才明白,其实是语法不对, IDC 不是按照bash的方式, 而是应该按C 语言函数调用的方式输入!!!
print("hello");
IDC>print("hello")
"hello"
好了, 现在可以使用IDC 与IDA 数据库交互了. 查看一下它的光标所在的位置吧,
ScreenEA()
IDC>ScreenEA()
 1074050458. 4004B59Ah 10001132632o 01000000000001001011010110011010b '毜.@'
它以多种数据表示方式打印了当前光标的位置.
与用户交互的函数还有:
Warning()
Message()
AskYN()
AskFile()
AskStr()
Jump()
其中Message 相当于printf 格式化输出, Warning 是对话框输出.
Ask...是获取用户输入, Jump 跳转到指定地址.
上面即为与IDA进行交互的函数接口.
上面这个小交互窗口只是一个单行编辑窗口, 适合输入一条命令或者用;分割的少量的命令
较多的命令需要在一个多行编辑窗口(shift-F2)或者通过加载一个script-file(Alt-F7)来进行.
它们对应的菜单命令是(file->script command 和 file->script file).

IDC 是一种语言, 除了上面的用户接口函数, 它还可以定义变量,支持赋值语句,流程控制语句,引入函数,
同时也引入了C++的对象概念. 并内置了一些函数功能如字符串处理函数.
但它特定的功能还是与IDA 数据库交互, 所以主要的接口函数还包括:

面对一个IDA 的数据库和强大的IDC, 我们还能用IDC脚本来干点什么呢?
auto offset=100;print("%d",offset);
IDC>auto offset=100;print(offset);
        100.       64h         144o 00000000000000000000000001100100b 'd...'
此说明, 函数支持打印变量.

IDC>print(offset)
Variable 'offset' is undefined
此说明, 变量仅在当前脚本中存在.

打印一个简单的变量并没有什么稀奇,但是,如果我们用鼠标指向一个反汇编行,该行会对应一个虚拟地址,
用ScreenEA()可以得到, 再减去一个偏移值, 就可以从动态地址转变为静态地址, 如果用热键去激活这个函数
这将是一个有用的功能,所以我们值得书写这个函数. (在script command 窗口中)
偏移量用一个变量来保存, 偏移量的获取从一个已知的函数名称中得到.静态分析它是固定的地址,动态加载后由IDA函数
LocByName获取地址, 相减得到地址偏移.

static WarnAddr()
{
    auto addr, offset;
    addr = LocByName("AVLM_InitEx");
    offset = addr - 0x3E854;
    addr = ScreenEA();
    Warning("static addr is %x", addr - offset);    
}
WarnAddr();

得到了如下错误提示:
Script Default snippet error: 8: Function declaration is expected
说没有函数声明, 可我们刚刚声明了啊? 又是哪里错了呢?
此时在命令行里输入WarnAddr()是可以运行的, 说明在command script 窗口中刚刚加载了WarnAddr()函数, 但不能马上运行,
需要第二步才能运行.
AddHotkey("Alt+p","WarnAddr")
这条语句也只能在命令行输入了, 因为放在script 窗口, 它又会抱怨没有定义.
这个函数, 在双开IDA 做逆向互相对照地址时还是有用的!!!
command script 窗口中的语句,似乎只有加载的功能,没有执行的功能?

下一步我们用脚本干什么呢? 把静态分析的一些成果应用到动态库上.
例如MakeFunction, MakeName, SetType 等, 你可以导出一个数据库的IDC文件,会看到很多类似的语句.




在这个函数处暂停,R0寄存器指向的地址就是dex文件在内存中的地址,R1寄存器就是dex文件的大小
然后我们就可以使用ida的script command去dump内存中的dex文件了。
static main(void)
{
  auto fp, begin, end, ptr;
  fp = fopen("C:\\dump.dex", "wb");
  begin = r0;
  end = r0 + r1;
  for ( ptr = begin; ptr < end; ptr ++ )
      fputc(Byte(ptr), fp);
}


----------------------------------------------------------------------------------------
//任务:  ida 与内存数据, 运用脚本处理一些我们感兴趣的逆向的东西.
1. 获取影像分布,找到堆,栈,只读数据,数据分布图, (查找地址属于那个段)
2. 指针, 是字符串打印字符串, 非字符串打印4个byte.
// ida 打印内存字符串, GetString(ea)
// ida 打印4byte 内存数据, Byte(ea)
----------------------------------------------------------------------------------------