首页
社区
课程
招聘
[原创][原创]XX某个函数应该补ret多少的问题
发表于: 2015-8-13 17:12 7699

[原创][原创]XX某个函数应该补ret多少的问题

2015-8-13 17:12
7699

回过头看发现自己写错了,现在改过来
想要不执行某个函数(比如弹出窗口)怎么操作
思路1 将该函数的call改为
add esp,x
mov eax,返回值
错误因为硬编码大小不一样,会影响后面的函数
思路2, 将要屏蔽的函数作为被调用函数,向上找到调用者的开始处,屏蔽调用者
push ebp
mov ebp,esp
。。。。
改为
mov eax,返回值
ret x
其中求返回值:找到调用者的call,就在push ebp前面一个入栈的eip的上面,在调用者的call那下断点,然后正常执行,看eax的值
由于是stdcall调用,所以函数用ret x平栈,可以直接找到最后的ret,也可以步过调用者的call,观察esp的变化量,还可以直接看call之前的push,哪个行得通就用哪个

以上是逆向核心原理11章内容的总结,关于思路2,“mov eax,返回值”这个是自己添的
之前没有弄懂,还有错误希望指出

另外附两种调用方法的笔记
cdcel主要是c语言中使用的,是调用者平栈,add esp,n。n是被调用函数参数所占字节数

int main(int argc, char *argv[])
    {
    push        ebp
    mov         ebp,esp
    sub         esp,40h
    push        ebx
    push        esi
    push        edi
    lea         edi,[ebp-40h]
    mov         ecx,10h
    mov         eax,0CCCCCCCCh
    rep stos    dword ptr [edi]
       return add(1,2);
    push        2
    push        1
    call        @ILT+35(abc5) (00401028)
    add         esp,8     
    }
    pop         edi
    pop         esi
    pop         ebx
    add         esp,40h
    cmp         ebp,esp
    call        __chkesp (004013e0)
    mov         esp,ebp
    pop         ebp
    ret

_stdcall
是被调用函数自己平栈,ret n,n为被调用者的函数参数所占字节数
int main(int argc, char *argv)
   {
  push        ebp
  mov         ebp,esp
  sub         esp,40h
  push        ebx
  push        esi
  push        edi
  lea         edi,[ebp-40h]
  mov         ecx,10h
  mov         eax,0CCCCCCCCh
  rep stos    dword ptr [edi]
        return add(1,2);
  push        2
  push        1
call        @ILT+40(abc5) (0040102d)
    }
   pop         edi
   pop         esi
   pop         ebx
   add         esp,40h
   cmp         ebp,esp
   call        __chkesp (004013e0)
   mov         esp,ebp
   pop         ebp
   ret

int _stdcall add(int a, int b)
   {
    push        ebp
    mov         ebp,esp
    sub         esp,40h
    push        ebx
    push        esi
    push        edi
    lea         edi,[ebp-40h]
    mov         ecx,10h
    mov         eax,0CCCCCCCCh
    rep stos    dword ptr [edi]
         return a+b;
    mov         eax,dword ptr [ebp+8]
    add         eax,dword ptr [ebp+0Ch]
     }
    pop         edi
    pop         esi
    pop         ebx
    mov         esp,ebp
    pop         ebp
    ret         8


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

收藏
免费 3
支持
分享
最新回复 (12)
雪    币: 261
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
add         esp,8是平printf的。。。
2015-8-13 17:58
0
雪    币: 357
活跃值: (3418)
能力值: ( LV3,RANK:25 )
在线值:
发帖
回帖
粉丝
3
看看经过call ,esp变了多少

直接在函数尾找ret x, 照抄就行了, 还回去跑一趟干嘛
2015-8-13 18:41
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
4
同意~  另外,二楼的只是其中一个例子而已,所有_cdecl函数都是这么平栈的
2015-8-13 18:57
0
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
这个是凑巧的,可以看一下
#include "stdio.h"
int add(int a, int b, int c)
{
        return a+b+c;
}
void main()
{
        printf("%d", add(1,2,3));
}
这个是cdecl的,可以看到反汇编中在call后面立即加了0xc,而printf又另加0x8
00401068   push        3
0040106A   push        2
0040106C   push        1
0040106E   call        @ILT+10(_add@12) (0040100f)
00401073   add         esp,0Ch
00401076   push        eax
00401077   push        offset string "%d" (0042201c)
0040107C   call        printf (004010b0)
00401081   add         esp,8
2015-8-13 19:03
0
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢,这个是书上的方法,我觉得有一个好处,就是能够比较快比较精准的找到,因为在od中,而之后的函数还有跳转,并不能确定哪个ret才是。
还有关于stdcall和cdecl,在vc6中各自写含三个参数的做个试验,应该更清晰
2015-8-13 19:11
0
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
我表达能力不行啊,可以自己调试下stdcall和cdecl
2015-8-13 19:14
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
只要是同一个函数,stdcall的,不管有几个ret,ret后的数值都是一样的吧!
2015-8-14 22:44
0
雪    币: 10
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
int _stdcall add(int a, int b)
3:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
4:        return a+b;
00401038   mov         eax,dword ptr [ebp+8]
0040103B   add         eax,dword ptr [ebp+0Ch]
5:    }
0040103E   pop         edi
0040103F   pop         esi
00401040   pop         ebx
00401041   mov         esp,ebp
00401043   pop         ebp
00401044   ret         8

int _stdcall add(int a, int b, int c)
3:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
4:        return a+b+c;
00401038   mov         eax,dword ptr [ebp+8]
0040103B   add         eax,dword ptr [ebp+0Ch]
0040103E   add         eax,dword ptr [ebp+10h]
5:    }
00401041   pop         edi
00401042   pop         esi
00401043   pop         ebx
00401044   mov         esp,ebp
00401046   pop         ebp
00401047   ret         0Ch
能调试后再说话吗?
2015-8-17 15:20
0
雪    币: 79
活跃值: (184)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
为什么会加关注呢?
2015-8-18 00:28
0
雪    币: 172
活跃值: (212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
额 压几个参数就ret几就是了,这算小白问题吗。。。
2015-8-20 21:27
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
你举的例子和我说的有矛盾吗?
我说的是同一函数,而你举的例子是两个函数,只是函数名一样而已。
2015-8-23 21:36
0
雪    币: 105
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
int _stdcall add(int a, int b)
3:    {
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,40h
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-40h]
0040102C   mov         ecx,10h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
4:        return a+b;
00401038   mov         eax,dword ptr [ebp+8]
0040103B   add         eax,dword ptr [ebp+0Ch]
                   cmp         eax,0
                   jz          xxxxxxx
                   pop         edi
                   pop         esi
                   pop         ebx
                   mov         esp,ebp
                   pop         ebp
                   ret         8         //----------------
5:    }
xxxxxxx    pop         edi
0040103F   pop         esi
00401040   pop         ebx
00401041   mov         esp,ebp
00401043   pop         ebp
00401044   ret         8        //----------------
2015-8-23 21:41
0
游客
登录 | 注册 方可回帖
返回
//