首页
社区
课程
招聘
[讨论]未知DLL导出函数的参数及传值分析
发表于: 2012-1-29 09:37 12661

[讨论]未知DLL导出函数的参数及传值分析

2012-1-29 09:37
12661
刚学习逆向分析,想找几个DLL练手,分析其导出函数的参数及调用时传递的值。发现一个DLL实在看不懂,请各位帮忙分析看看。非常感谢!

1、这是个MPEG-4解码的DLL,从其导出函数名称来看,应该是基于开源的libxvidcore开发的。但是一般的基于xvidcore的库导出函数原型都是:
XVID_IMPEXP int XVID_CALL xvid_global(void *handle, int opt, void *param1, void *param2);
XVID_IMPEXP int XVID_CALL xvid_decore(void *handle, int opt, void *param1, void *param2);

这是xvidcore解码的关键函数,第1个用于初始化整个库,第2个跟传入的参数不同分别创建解码器、解码和销毁解码器。

2、附件所示的DLL,在IDA中看到有4个导出函数,分别是:
xvid_decore_dll
xvid_encore_dll
xvid_init_dll
DllEntryPoint
想分析其参数,查看xvid_decore_dll函数的实现,如下:
public xvid_decore_dll
xvid_decore_dll proc near
jmp     xvid_decore_dll_0
xvid_decore_dll endp
没看到xvid_decore_dll的参数传递情况,而是直接jmp到另外一个不公开的函数xvid_decore_dll_0了,这个函数实现如下:
xvid_decore_dll_0 proc near

arg_0= dword ptr  4
arg_4= dword ptr  8
arg_8= dword ptr  0Ch
arg_C= dword ptr  10h

mov     eax, [esp+arg_4]
cmp     eax, 2
jg      short loc_100015DB

..... (后面还有很多)
可以看到这个函数有4个参数。想请教一下各位:
xvid_decore_dll是怎么实现的才能出现这种只有一句jmp到另外一个函数的?直接C/C++没办法这么实现吧?另外,xvid_decore_dll是没有参数还是有4个参数?怎么传递到xvid_decore_dll_0的?

初学逆向,如果问题太弱智请各位不要笑话。请帮忙解答一下。如果能帮忙分析一下参数的个数和类型更是感激不尽!谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (11)
雪    币: 217
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个JMP估计是编译器搞出来的,在调试一些高级语言的时候,总会遇到这样的情况,就是一F7进一个call后直接就是一个JMP。
2012-1-29 09:59
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
厚积薄发大哥,我也只会F5让你见笑了。

signed int __cdecl xvid_decore_dll(int a1, signed int a2, int a3, int a4)
{
  return xvid_decore_dll_0(a1, a2, a3, a4);
}
上传的附件:
  • 1.png (2.33kb,404次下载)
2012-1-29 10:06
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼上两位的回复!
刚学逆向,看一般的函数有参数的话,IDA都能显示出来或者就是在实现代码前面会列出去,这个xvid_decore_dll没看到类似的参数列表,完全不知道怎么办了。我用上面Bklang的给出的参数来动态调试和跟踪一下试试看。

非常感谢!
2012-1-29 11:12
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
当前进展情况:
1、通过IDA/OD分析了参数数量和返回值。
2、通过参考AheadLib,编写了一个DLL来劫持原函数调用。
3、通过劫持的DLL中输出信息,了解了具体的调用过程中传递的值。

下一步需要进行的分析:
1、有些参数应该是传入的指针类型,并且很可能是结构体指针,还需要进一步通过IDA/OD分析参数指针指向的内容的长度、结构等信息。
2、跟上面的分析结果,构造结构体来分析调用时传递值对应的具体内容。
2012-1-30 16:48
0
雪    币: 27
活跃值: (831)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
6
支持厚积薄发大哥
2012-1-30 19:14
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
当前进展,基本完成对第一个函数的分析
通过修改劫持后的DLL,分析第一个导出函数xvid_init_dll的传入参数,并对可能是指针(通过逆向判断肯定是指针)的第3个参数开始的100个4字节地址做搜索,判断函数调用前后的修改情况,得出情况如下:
xvid_init_dll传入参数 param1:0,param2:0,param3:12E78C,param4:0
param3第1个参数被修改:从0修改为79.
param3第2个参数被修改:从14103464修改为131073.
param3第3个参数被修改:从14114824修改为1000.
其中131073对应的16进制为0x20001,即高字节为0x0002h,低字节为0x0001h.
从IDA逆向的代码来看,param3的第2和第3个结构体成员根本没被使用,而是直接被赋值。通过在劫持后的DLL中修改传入xvid_init_dll函数之前的param3的3个成员全为0做测试,发现一切正常。
由此可见,xvid_init_dll的函数参数及调用时的赋值已经搞清楚了。调用后返回的第3个参数的值很有可能是解码器的配置信息(解码能力、版本号、帧率之类的信息),还需要进一步跟踪属主程序才能知晓。
2012-1-30 23:21
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
另外,通过分析旧版本的dll中的导出函数的参数,也已验证了分析结果。
2012-1-30 23:23
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
接下来的关键是分析xvid_decore_dll函数,下面是劫持后中间DLL的日志输出:
xvid_init_dll param1:0,param2:0,param3:12E78C,param4:0
第1个参数被修改:从0修改为79.
第2个参数被修改:从14103464修改为131073.
第3个参数被修改:从14114824修改为1000.
第1次调用xvid_decore_dll,param1:0H,param2:1,param3:D73654H,param4:12E788H
第2次调用xvid_decore_dll,param1:2D90050H,param2:255,param3:12E76CH,param4:0H
第3次调用xvid_decore_dll,param1:2D90050H,param2:255,param3:12E76CH,param4:0H
第4次调用xvid_decore_dll,param1:2D90050H,param2:2,param3:0H,param4:0H
第5次调用xvid_decore_dll,param1:0H,param2:1,param3:D73654H,param4:31DFEA0H
第6次调用xvid_decore_dll,param1:2D90050H,param2:255,param3:31DFE84H,param4:0H
第7次调用xvid_decore_dll,param1:2D90050H,param2:255,param3:31DFE84H,param4:0H
第8次调用xvid_decore_dll,param1:2D90050H,param2:0,param3:D73630H,param4:0H
....
第189次调用xvid_decore_dll,param1:2D90050H,param2:0,param3:D73630H,param4:0H
第190次调用xvid_decore_dll,param1:2D90050H,param2:2,param3:0H,param4:0H

xvid_init_dll函数在前面已经做了说明。接下来的关键是判断xvid_decore_dll函数的参数类型及含义。
从xvid_init_dll调用时的指针地址传递来看,param3和param4肯定有时候是指针类型的(地址都是12E7xxx),但是不清楚D73630这个是什么东西。但是xvid_init_dll中第3个参数的第2个和第3个子项传入时的值,转成16进制后是D733A8和D76008,可以看出,跟param3肯定是一个性质的(指针或者某种序列?)。不知道有没有熟悉的人能指点一下?

我下一步的思路就是通过自己写的MPEG-4解码程序来判断实际解码同一个视频文件需要调用decore的次数,然后跟xvid_decore_dll的调用次数来比对,以此确定其大概的功能。
2012-1-31 00:28
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
本帖变成记录我分析过程的笔记了,一直没看到高手们来指点,不知道为什么?

从xvid_decore_dll的调用次数来看,其被调用共计190次,而测试用的视频文件只有182帧,但是xvid通常使用同名函数的不同参数来创建/销毁解码器、实际解码等,因此做如下推测:
1、第9次到第189次调用为正常解码,每次调用解码一帧视频图像。
2、第190次调用为销毁解码器。对比第4次和第9次调用可以看出,第4次调用应该也是销毁解码器。
3、第1次调用应该是创建解码器。对比第5次调用的参数传递可以看出,第5次调用应该也是创建解码器(第4次调用时销毁解码器了)。
4、综合上述分析,第1-4次调用很可能是用于检测解码器是否能正常解码,若能正常解码再真正的创建解码器做具体的解码。第2个参数是用于解码器调用类型(创建、解码、销毁、探测/获取信息)的参数,取值分别是0,1,2,255。

接下来还需要结合逆向分析、内存地址搜索/分析来判断具体的不同参数的具体含义。
2012-1-31 10:34
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
问题已经解决了,请版主帮忙关闭讨论贴。谢谢!
2012-2-11 10:22
0
雪    币: 195
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
有没有工具直接可以得到啊。。。。
2012-7-10 20:45
0
游客
登录 | 注册 方可回帖
返回
//