能力值:
( LV2,RANK:10 )
|
-
-
2 楼
这个JMP估计是编译器搞出来的,在调试一些高级语言的时候,总会遇到这样的情况,就是一F7进一个call后直接就是一个JMP。
|
能力值:
( 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);
}
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
谢谢楼上两位的回复!
刚学逆向,看一般的函数有参数的话,IDA都能显示出来或者就是在实现代码前面会列出去,这个xvid_decore_dll没看到类似的参数列表,完全不知道怎么办了。我用上面Bklang的给出的参数来动态调试和跟踪一下试试看。
非常感谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
当前进展情况:
1、通过IDA/OD分析了参数数量和返回值。
2、通过参考AheadLib,编写了一个DLL来劫持原函数调用。
3、通过劫持的DLL中输出信息,了解了具体的调用过程中传递的值。
下一步需要进行的分析:
1、有些参数应该是传入的指针类型,并且很可能是结构体指针,还需要进一步通过IDA/OD分析参数指针指向的内容的长度、结构等信息。
2、跟上面的分析结果,构造结构体来分析调用时传递值对应的具体内容。
|
能力值:
( LV5,RANK:70 )
|
-
-
6 楼
支持厚积薄发大哥
|
能力值:
( 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个参数的值很有可能是解码器的配置信息(解码能力、版本号、帧率之类的信息),还需要进一步跟踪属主程序才能知晓。
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
另外,通过分析旧版本的dll中的导出函数的参数,也已验证了分析结果。
|
能力值:
( 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的调用次数来比对,以此确定其大概的功能。
|
能力值:
( 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。
接下来还需要结合逆向分析、内存地址搜索/分析来判断具体的不同参数的具体含义。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
问题已经解决了,请版主帮忙关闭讨论贴。谢谢!
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
有没有工具直接可以得到啊。。。。
|