首页
社区
课程
招聘
[转帖]两个IDA PRO的插件:IDApython & IDAperl
发表于: 2006-11-23 16:26 18678

[转帖]两个IDA PRO的插件:IDApython & IDAperl

2006-11-23 16:26
18678
来自:8d7K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4c8W2j5h3@1#2x3o6W2Q4x3X3g2U0L8$3#2Q4x3V1k6E0L8$3c8#2L8r3g2K6i4K6u0W2M7r3S2H3i4K6y4r3L8X3q4E0k6g2)9K6c8p5&6W2N6%4y4Q4x3U0k6X3K9h3I4W2i4K6y4p5j5i4u0@1K9h3y4D9k6g2)9J5y4Y4y4A6k6q4)9K6c8o6p5%4

两个IDA PRO的插件:IDApython & IDAperl




wooshi@gmail.com




IDA PRO是目前应用最广的静态反汇编分析工具,功能十分强大,但其自带的IDC脚本语言却十分丑陋,写起脚本来非常不方便。有两位大牛就写了两个工具来方便大家编写IDC的脚本,一个是Gergely Erdelyi 写的IDApython,另一个是RedPlait 写的IDAperl。总的说来,IDApython写出来的脚本非常漂亮,也非常简单,但IDAperl有一项功能是IDApython不具有的,那就是IDAperl的脚本支持debug功能。下面我们分别简单的介绍一下这两个强大的插件。


IDApython


安装:非常简单,先安装python2.3,然后在这里下载IDApython:263K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3c8Q4x3X3c8V1L8$3#2W2i4K6u0W2L8X3g2@1i4K6u0r3K9h3c8S2M7s2W2@1K9r3!0F1i4K6u0r3i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6S2m8i4K6S2m8d9f1c8m8M7s2W2@1K9r3!0F1i4@1f1#2i4@1q4q4i4K6R3&6i4@1f1^5i4@1p5K6i4K6R3#2i4@1f1#2i4K6S2o6i4K6R3#2i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1&6i4K6R3%4i4K6S2o6i4@1f1%4i4K6W2m8i4K6R3@1M7s2W2@1K9r3!0F1i4@1f1%4i4K6W2n7i4@1q4q4i4@1f1#2i4@1u0p5i4K6V1#2i4@1f1$3i4K6S2n7i4@1t1%4i4@1f1#2i4K6R3^5i4@1t1H3d9f1c8m8i4@1f1%4i4K6W2m8i4K6R3@1i4@1f1%4i4K6W2n7i4@1q4q4i4@1f1#2i4@1u0p5i4K6V1#2i4@1f1@1i4@1t1^5i4K6S2n7i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6S2m8i4K6S2m8M7r3I4#2k6$3W2F1M7#2)9J5c8Y4m8&6N6r3S2G2L8W2)9J5k6i4m8D9N6#2!0q4y4W2)9^5b7W2!0n7y4#2!0q4y4g2)9^5z5q4!0n7x3p5W2p5b7g2!0q4y4#2)9&6b7g2)9^5y4s2m8D9N6h3N6A6L8Y4y4Q4c8e0N6Q4z5f1u0Q4b7f1g2Q4c8e0g2Q4b7V1c8Q4z5e0g2Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0g2Q4z5o6k6Q4z5p5c8Q4c8e0g2Q4z5f1y4Q4b7e0S2u0c8p5q4Q4c8e0N6Q4z5f1q4Q4z5o6c8H3L8s2g2Y4K9h3&6K6i4K6u0r3M7r3I4#2k6$3W2F1M7#2)9J5k6h3y4X3k6#2!0q4y4W2)9&6y4W2)9^5y4#2!0q4y4q4!0n7b7W2!0n7y4W2!0q4y4q4!0n7z5q4!0m8c8q4!0q4y4W2!0n7y4#2!0n7b7W2!0q4y4g2)9^5b7g2!0m8x3q4!0q4y4g2!0m8y4W2)9^5x3W2!0q4y4q4!0n7z5q4)9^5b7W2!0q4y4g2)9^5y4#2!0m8x3q4!0q4z5q4!0m8x3g2)9^5b7#2!0q4c8W2!0n7b7#2)9^5z5q4!0q4y4W2!0n7y4#2!0n7b7W2!0q4y4q4!0n7z5q4)9^5c8q4!0q4y4W2!0n7y4#2!0n7b7W2!0q4y4g2!0m8y4g2!0n7c8q4!0q4y4g2)9^5x3#2)9^5c8W2!0q4z5g2)9&6y4#2!0m8c8g2!0q4z5g2!0m8x3W2)9&6z5q4!0q4y4q4!0n7z5q4)9^5c8q4!0q4y4g2!0m8y4q4!0m8y4#2!0q4c8W2!0n7b7#2)9^5z5b7`.`.


Execute_Python_File python Alt-9 0


Execute_Python_Statement python Alt-8 1


Execute_Python_ScriptBox python Alt-7 2


这时候IDA的edit菜单的plugins的子菜单下会出现一个IDApython的菜单,你可以通过这里运行你的python for IDA的脚本了。


遗憾的是,IDApython的文档严重缺乏,好在大部分的函数名字跟IDC脚本的函数相类似,新加的函数在源程序里有比较详细的注释,不过就算是这样,也比较让人头疼,没办法,只好自己慢慢摸索了。IDApython有三个py文件,idc.py中定义的函数与idc脚本的函数是对应的,idaapi.py中定义了很多class,使脚本具有了面向对象的特征,idautils.py中定义了一些高等函数,使相当大部分的IDC功能可以简单的表示出来。


下面以一个例子来对比一下IDApython的好处。这个例子搜索一个函数内部的索引,并打印出来,我们先用idc.py中定义的函数来一下:

from idc import *


ea = 0x4011f6 (一个函数的开始地址,这里idapython好像有点问题,应该用ChooseFunction,但老是说不对)
funcend = FindFuncEnd(ea)
for ea in range(ea,funcend):
x = Rfirst0(ea)
while x <> BADADDR :
Message( str(hex(x)) + " refers to " + Name(x) + " : " + str(hex(x)) + " ");
x = Rnext0(ea,x);
Message("End of output. ");



跟标准的IDC脚本比较一下:

#include






static main(){


auto ea,x,f_end;


ea = ChooseFunction("Select a function to parse:");


f_end = FindFuncEnd(ea);


Message(" *** Code References from " + GetFunctionName(ea) + " : " + atoa(ea) + " ");


for ( ea ; ea <= f_end; ea = NextAddr(ea) ) {


x = Rfirst0(ea);



while ( x != BADADDR) {


Message(atoa(ea) + " refers to " + Name(x) + " : " + atoa(x) + " ");


x = Rnext0(ea,x);


}


}


Message("End of output. ");


}






可以看出,idapython写出来的代码漂亮了不少,而且有个更重要的好处,我们可以使用python庞大的函数库,使我们的开发省力不少。

下面我们再用idaapi.py中定义的函数来一遍:

from idaapi import *


func = choose_func("test",1)
print "begin print refs"
for funcea in range(func.startEA,func.endEA):
ref = get_first_fcref_from(funcea)
while ref != BADADDR:
print " called from 0x%x(%s)" % (funcea,get_name(BADADDR,ref))

ref = get_next_fcref_from(funcea, ref)


最后用idautils.py函数来一次:

from idautils import *
func = choose_func("test",1)
print "begin print refs"
for funcea in range(func.startEA,func.endEA):
reflist = CodeRefsFrom(funcea,0)
for ref in reflist :

print " called from 0x%x(%s)" % (funcea,get_name(BADADDR,ref))

恩,好像说服力不够,不过可以看到这个例子还是有些面向对象的特征了。总之,有了idapython,特别是idaapi的面向对象的包装与idautils中的常用函数的使用简化,使我们的工作简单化了。好,下面我们介绍一下idaperl,这个东西难看一些,不过功能也十分强大。





IDAPerl
安装:不是很简单喔,先安装perl for windows,再到一个俄文的网站上去下载IDAperl: 176K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4N6S2M7$3#2Q4x3X3g2J5N6g2)9J5c8Y4m8#2j5W2)9J5c8U0t1K6i4K6u0r3k6X3W2D9k6i4y4Q4x3V1k6H3k6i4u0D9i4K6g2X3M7%4u0U0i4K6u0W2P5X3W2H3i4K6u0o6i4@1f1^5i4@1u0r3i4K6V1&6i4@1f1@1i4@1u0m8i4K6W2n7i4@1f1@1i4@1t1^5i4K6W2o6i4@1f1^5i4@1p5#2i4@1u0r3i4@1f1&6i4K6W2o6i4K6R3H3i4@1f1^5i4@1p5$3i4K6R3I4i4@1f1$3i4K6W2o6i4K6R3&6i4@1f1%4i4K6W2n7i4@1t1^5i4@1f1#2i4@1u0m8i4K6V1@1i4@1f1%4i4K6W2m8i4K6R3@1d9f1c8m8M7$3c8C8i4@1f1$3i4K6R3&6i4K6S2p5i4@1f1^5i4K6R3K6i4@1u0p5i4@1f1%4i4@1u0o6i4K6V1$3i4@1f1^5i4@1q4r3i4K6V1I4i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6R3^5i4K6V1I4i4@1f1%4i4@1u0o6i4K6V1$3i4@1f1^5i4@1q4r3i4K6V1I4i4@1f1#2i4@1p5#2i4@1u0p5i4@1f1@1i4@1u0m8i4K6R3$3i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6V1@1i4@1u0q4i4@1f1#2i4K6R3^5i4@1t1H3i4@1f1@1i4@1u0m8i4K6R3$3K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4c8W2j5h3@1#2x3o6W2Q4x3X3g2U0L8$3#2Q4x3V1k6V1L8%4N6F1L8r3!0S2k6q4)9J5c8Y4c8G2L8$3I4K6i4K6u0r3M7$3g2U0N6i4u0A6N6s2W2Q4x3V1k6A6k6r3q4H3k6i4u0D9i4K6u0W2M7X3q4J5i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6S2m8i4K6S2m8M7r3#2Q4x3V1k6Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0N6Q4z5f1q4Q4z5o6c8Q4c8e0g2Q4z5o6k6Q4z5o6g2Q4c8e0g2Q4b7f1g2Q4b7U0W2Q4c8e0k6Q4z5e0c8Q4b7V1g2Q4c8e0g2Q4z5o6S2Q4b7U0m8H3k6i4u0D9i4@1f1%4i4K6W2m8i4K6R3@1L8r3W2T1i4@1f1&6i4K6R3%4i4K6S2o6i4@1f1#2i4K6S2q4i4@1u0n7i4@1g2r3i4@1u0o6i4K6S2o6i4@1f1$3i4K6S2m8i4K6S2m8M7r3g2J5L8q4)9#2k6X3c8T1k6#2)9J5k6i4m8D9N6#2!0q4y4g2)9&6x3W2)9^5b7%4u0H3i4K6g2X3N6X3y4Q4x3X3g2H3L8s2N6Q4c8e0k6Q4z5p5u0Q4b7U0N6Q4c8e0g2Q4z5o6S2Q4b7U0m8u0c8p5p5@1i4K6u0W2y4#2!0q4y4#2)9&6b7g2)9^5y4s2m8D9N6h3N6A6L8Y4y4Q4c8e0N6Q4z5f1u0Q4b7f1g2Q4c8e0g2Q4b7V1c8Q4z5e0g2Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8f1k6Q4b7V1y4Q4z5p5y4Q4c8e0S2Q4b7V1k6Q4z5e0W2Q4c8e0k6Q4b7e0m8Q4b7U0N6Q4c8e0g2Q4b7U0m8Q4b7U0q4Q4c8e0g2Q4z5p5k6Q4b7f1k6Q4c8e0c8Q4b7V1u0Q4b7e0g2Q4c8e0c8Q4b7V1q4Q4z5o6k6Q4c8e0y4Q4z5o6m8Q4z5o6u0Q4c8e0S2Q4b7V1k6Q4z5e0W2Q4c8e0k6Q4z5e0N6Q4b7U0k6Q4c8e0g2Q4z5o6m8Q4z5e0W2Q4c8e0k6Q4z5o6W2Q4z5e0y4Q4c8e0g2Q4b7V1y4Q4z5o6m8A6k6r3p5@1i4K6u0W2y4#2!0q4y4#2)9&6b7g2)9^5y4q4!0q4y4W2)9&6y4#2!0n7y4W2!0q4y4g2)9^5x3q4)9&6z5g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4z5g2)9^5x3q4)9^5z5g2!0q4y4W2)9^5b7W2!0m8z5g2!0q4y4q4!0n7z5q4)9^5x3q4!0q4y4q4!0n7z5q4!0m8b7i4m8W2i4@1f1%4i4K6W2m8i4K6R3@1N6$3W2F1k6r3!0%4M7#2!0q4y4#2!0m8z5q4)9^5b7W2!0q4y4g2!0n7b7g2)9^5c8W2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4g2!0n7x3q4!0n7x3g2!0q4y4q4!0n7b7#2)9&6b7g2!0q4y4g2!0n7b7#2!0n7z5g2!0q4y4g2)9^5y4#2!0n7b7g2!0q4y4q4!0n7z5q4)9^5x3q4!0q4y4q4!0n7z5q4!0m8b7g2!0q4x3W2)9^5x3q4)9&6c8s2m8W2M7X3H3`. script for


debugger”的对话框,就可以加载你的perl for debugger的脚本了,同时edit菜单的plugins子菜单会有embedded perl 菜单,这里你可以加载一般的非debugger的分析脚本。


使用:由于IDAPerl的主要特长在于debugger脚本的编写,我们也主要介绍这部分功能,其他一般的功能函数与IDC脚本的函数的名称基本上是一样的,就不多做介绍了。IDAperl定义了很多程序运行状态改变时的回调(callback)函数,比如说进程启动的时候它定义了CbProcessStart,你可以写一个函数叫这个名字,同时把你要在进程启动时你要做的工作写到这个函数里。IDAperl一共定义了如下的回调函数:


CbProcessStart (unsigned long p_id)--- 进程启动时


CbProcessExit (unsigned long p_id, int exit_code)--- 进程退出时


CbThreadStart (unsigned long t_id)--- 线程启动时,在主线程启动时,不调用


CbThreadExit(unsigned long t_id, int exit_code) ----线程退出时


CbLibraryLoad(struct deb_module *dm) --- modules加载时


CbLibraryUnload (char *name)--- modules卸载时


CbBpt(unsigned long t_id, unsigned long addr) --- 遇到断点时


CbException(unsigned long t_id, int code, unsigned long ea, char *info) --- 异常抛出时





IDA还定义了很多支撑函数来支撑这些功能:


ProcessQty ? 进程的数量


GetProcessInfo (n, out_hash) ? 进程的一些信息


ThreadQty ? 线程的数量


GetThreadN (n) -返回线程(句柄?)


ProcessState ? 返回进程状态


StartProcess (path, args, dir) ? 等价winexec


SuspendProcess ? 暂停目前调试的进程


ContinueProcess ?继续运行目前调试的进程


Exit_Proсess ? 退出进程


AttachProcess (р_id) ? 加载调试进程

DetachProcess ?卸载调试进程

SelectThread (t_id) ? 激活选择的线程


StepInto ? 步入


StepOver ? 步过


RunTo (addr) ? 运行到


StepUntilRet ? 运行到返回


BptQty ? 断点的数量


GetBptN (n, out_hash) ? 得到断点的一些信息,out_hash的关键字有:


Ea ? 断点地址


Size - 断点大小


Type - 断点类型


Pass_сount - 断点pass多少才激活


Flags - 断点的标志


GetBpt (ea, out_hash) ? 跟上面函数基本一样,不过第一个参数是地址。


AddBpt (ea, size, type) ? 加个断点


DelBpt (ea) ? 删掉断点


EnableBpt (ea) ? 激活断点


DisableBpt (ea) ? 禁止断点


Dbg_module (out_hash) ? 调试模块的信息


Modules_list (out_array) ? 返回调试进程的module信息


ThreadContext (t_id, kind_of_сontext, out_hash) ? 返回线程的上下文信息。


Set_DrX (t_id, reg_value) ?为调试寄存器赋值


Set_Gs (t_id, reg_value) ? 为 Gs 寄存器赋值


Set_Fs (t_id, reg_value) -为 Fs 寄存器赋值


Set_Es (t_id, reg_value) -为 Es 寄存器赋值


Set_Ds (t_id, reg_value) -为 Ds 寄存器赋值

Set_Cs (t_id, reg_value) -为 Cs 寄存器赋值

Set_Ss (t_id, reg_value) -为 Ss 寄存器赋值.


Set_Efl (t_id, reg_value) ? 为标志寄存器赋值


Set_REG (t_id, reg_value) 为通用寄存器(Edi, Esi, Ebx, Edx, Ecx, Eax, Ebp, Esp or Eip)赋值。


怎么样,功能还是很强大吧?下面我们给出个例子来说明这个工具的妙用。


这个例子在程序运行时,在各种条件触发下,往test.log文件里写记录。




use IDA;
use IDADbg;
sub cbBpt
{
my( $tid,$addr) = @_;

printf(FILE "cpBpt instruction:%s ",GetMnem($addr)); #这里可以看出可以调用Idc的处理函数,非常好

my $context;
if ( ThreadContext($t_id, CONTEXT_ALL, $context) ) #得到当时的context信息
{
my $reg;
# dump all registers values
foreach $reg ( keys %$context )
{
printf(FILE "%s .eq. %X ", uc($reg), $context->{$reg} ); #把寄存器信息存入文件
}

}

}



sub cbThreadExit
{
printf(FILE "cbThreadExit ");
}
sub cbThreadStart
{
printf(FILE "cbThreadStart ");
}
sub cbProcessExit
{
printf(FILE "cbProcessExit ");
close(FILE);
}
sub cbProcessStart
{
open(FILE, ">d:test.log") or die("Cannot open test.log");
printf(FILE "cbProcessStart ");


}





从上面的例子可以看到, 在debug脚本里可以调用强大的perl包装的IDC脚本函数,可以对程序进行比较深入的研究了。





参考:


652K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4N6S2M7$3#2Q4x3X3g2J5N6g2)9J5c8X3q4J5N6r3W2U0L8r3g2Q4x3X3g2H3K9s2m8Q4x3@1k6S2M7Y4c8A6j5$3I4W2i4K6y4p5K9h3c8S2i4K6g2X3M7r3g2J5L8l9`.`.



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

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 5275
活跃值: (496)
能力值: (RANK:1170 )
在线值:
发帖
回帖
粉丝
2
好东西
2006-11-23 20:13
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
看来还得学PYTHON了,曾经放弃过。。。。。。。。
2007-5-19 10:57
0
雪    币: 200
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
看来还得学PYTHON了,曾经放弃过。。。。。。。。
2007-5-19 11:12
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
5
我连最丑陋的IDC都还不会
2007-5-21 14:05
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
下载用看看再说
2007-6-9 17:10
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我连什么不会.怎么学呢.
2007-6-29 10:10
0
雪    币: 1925
活跃值: (906)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
8
好东西,支持哈~~
2007-6-29 12:09
0
雪    币: 220
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
楼主:“358K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4c8W2j5h3@1#2x3o6W2Q4x3X3g2U0L8$3#2Q4x3V1k6V1L8%4N6F1L8r3!0S2k6q4)9J5c8Y4c8G2L8$3I4K6i4K6u0r3M7$3g2U0N6i4u0A6N6s2W2Q4x3V1k6A6k6r3q4H3k6i4u0D9i4K6u0W2M7X3q4J5i4@1f1J5i4K6R3H3i4K6W2p5i4@1f1^5i4@1u0r3i4K6V1&6i4@1f1@1i4@1t1^5i4@1q4m8i4@1f1#2i4K6W2o6i4@1t1H3i4@1f1#2i4K6W2p5i4K6R3H3i4@1f1#2i4@1t1%4i4@1t1J5i4@1f1%4i4@1u0n7i4K6S2r3i4@1f1@1i4@1t1^5i4K6S2p5i4@1f1^5i4K6R3K6i4@1u0p5i4@1f1@1i4@1t1^5i4K6S2n7i4@1f1^5i4@1u0p5i4@1u0p5i4@1f1@1i4@1u0m8i4K6R3$3i4@1g2r3i4@1u0o6i4K6R3I4i4@1f1^5i4K6R3K6i4@1u0p5i4@1f1#2i4K6V1H3i4@1p5$3i4@1f1@1i4@1t1^5i4K6S2m8i4@1f1@1i4@1u0o6i4@1p5H3i4@1g2r3i4@1u0o6i4K6W2r3
2007-10-27 14:03
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
thanks
2008-1-22 18:19
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
楼主:“5b5K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4c8W2j5h3@1#2x3o6W2Q4x3X3g2U0L8$3#2Q4x3V1k6V1L8%4N6F1L8r3!0S2k6q4)9J5c8Y4c8G2L8$3I4K6i4K6u0r3M7$3g2U0N6i4u0A6N6s2W2Q4x3V1k6A6k6r3q4H3k6i4u0D9i4K6u0W2M7X3q4J5i4@1f1J5i4K6R3H3i4K6W2p5i4@1f1^5i4@1u0r3i4K6V1&6i4@1f1@1i4@1t1^5i4@1q4m8i4@1f1#2i4K6W2o6i4@1t1H3i4@1f1#2i4K6W2p5i4K6R3H3i4@1f1#2i4@1t1%4i4@1t1J5i4@1f1%4i4@1u0n7i4K6S2r3i4@1f1@1i4@1t1^5i4K6S2p5i4@1f1^5i4K6R3K6i4@1u0p5i4@1f1@1i4@1t1^5i4K6S2n7i4@1f1^5i4@1u0p5i4@1u0p5i4@1f1@1i4@1u0m8i4K6R3$3i4@1g2r3i4@1u0o6i4K6R3I4i4@1f1^5i4K6R3K6i4@1u0p5i4@1f1#2i4K6V1H3i4@1p5$3i4@1f1@1i4@1t1^5i4K6S2m8i4@1f1@1i4@1u0o6i4@1p5H3i4@1g2r3i4@1u0o6i4K6W2r3
2017-1-15 09:52
0
游客
登录 | 注册 方可回帖
返回