首页
社区
课程
招聘
[旧帖] 求助]请问如何准确获得函数传递的参数? 0.00雪花
发表于: 2010-10-11 12:07 4411

[旧帖] 求助]请问如何准确获得函数传递的参数? 0.00雪花

2010-10-11 12:07
4411
0663FE90  /.  55            push    ebp
0663FE91  |.  8BEC          mov     ebp, esp
0663FE93  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
0663FE96  |.  50            push    eax
0663FE97  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
0663FE9A  |.  51            push    ecx
0663FE9B  |.  8B55 10       mov     edx, dword ptr [ebp+10]
0663FE9E  |.  52            push    edx
0663FE9F  |.  E8 06018DFF   call    05F0FFAA
0663FEA4  |.  83C4 0C       add     esp, 0C
0663FEA7  |.  8B45 18       mov     eax, dword ptr [ebp+18]
0663FEAA  |.  50            push    eax
0663FEAB  |.  8B4D 14       mov     ecx, dword ptr [ebp+14]
0663FEAE  |.  51            push    ecx
0663FEAF  |.  8B55 0C       mov     edx, dword ptr [ebp+C]
0663FEB2  |.  52            push    edx
0663FEB3  |.  8B45 10       mov     eax, dword ptr [ebp+10]
0663FEB6  |.  50            push    eax
0663FEB7  |.  E8 04FEFFFF   call    0663FCC0                         ;  这里是我要分析的函数
0663FEBC  |.  83C4 10       add     esp, 10
0663FEBF  |.  5D            pop     ebp
0663FEC0  \.  C3            retn

该函数位于一个模块中,我想返回上层来获得 [ebp+18] 参数的值,想了解下该参数具体是谁传入的,结果返回上层后,是这个

06D0F5C2    22B4F4 E2287CA9 and     dh, byte ptr [esp+esi*8+A97C28E2>
06D0F5C9    8B6D AE         mov     ebp, dword ptr [ebp-52]
06D0F5CC    838E 7CA320D0 1>or      dword ptr [esi+D020A37C], 1D
06D0F5D3    E9 63410000     jmp     06D1373B
06D0F5D8    68 ADB3D707     push    7D7B3AD   ----------------------------返回后就跳转到这里了,上面看起来根本没调用过该函数,何解,我该如何找到传入参数的代码块。
06D0F5DD  ^ E9 F3F2ECFF     jmp     06BDE8D5
06D0F5E2    68 37B6D707     push    7D7B637
06D0F5E7  ^ E9 E9F2ECFF     jmp     06BDE8D5
06D0F5EC    71 6F           jno     short 06D0F65D
06D0F5EE    DF59 B5         fistp   word ptr [ecx-4B]
06D0F5F1    B6 28           mov     dh, 28
06D0F5F3    90              nop
06D0F5F4    CC              int3

每次遇到这种问题就很无奈,辗转反侧无法搞定,求大虾们给个思路

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

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
[QUOTE=马里奥;870176]0663FE90  /.  55            push    ebp
0663FE91  |.  8BEC          mov     ebp, esp
0663FE93  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
066...[/QUOTE]

可能是使用push jmp 的方式调用子程序的,push入返回地址,再jmp到模块中,这样的话返回地址可能不在调用代码附近。

如果你用OD,鼠标点到代码地址 0663FE90 处
在代码框下面应该有:跳转来自 ********,这样可以帮助你追溯到调用代码,或者用IDA静态分析上面的代码也会给出调用地址。
2010-10-11 12:52
0
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
或者在代码中搜索:
jmp 0663FE90  ;是否是直接硬跳过来的
push 06D0F5D8  ;是否有针对返回地址的压栈操作,当然很可能是将返回地址传到变量或者寄存器再压栈的,可以搜索所有与返回地址06D0F5D8相关的指令,这个就自己想法了
2010-10-11 12:58
0
雪    币: 411
活跃值: (252)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
[QUOTE=马里奥;870176]0663FE90  /.  55            push    ebp
0663FE91  |.  8BEC          mov     ebp, esp
0663FE93  |.  8B45 0C       mov     eax, dword ptr [ebp+C]
066...[/QUOTE]

当然还可以使用指令记录的方法

再不然先记下[ebp+18]处的地址,然后下写断点,重新运行程序后一步步分析看在哪儿会对其进行赋值操作!
2010-10-11 13:01
0
雪    币: 100
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢楼上的仁兄,确实提了不少好办法,我试试
2010-10-11 17:21
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
很明显,程序被加密或者混淆了。
2010-10-11 23:22
0
游客
登录 | 注册 方可回帖
返回
//