VC运行时复制函数代码的注意事项

VC运行时复制函数代码的注意事项

搬运自我的百度空间

     

    参考了http://www.docin.com/p-472081682.html这篇论文。

    本文为原创,转载请注明出处。

    在反破解中可能需要把一段已经在内存中的函数代码拷贝出来,到另一个地方运行。在远程注入中也会遇到拷贝内存中的代码作为shellcode的情况。比如这段代码:

    long __stdcall  TrulyUnloadDLL(long a)

    {

             long c=1;

            

             printf("\nKKK\n");

            

             return a+c;

    }

     

    void  LoadHooks()

    {

             void* p=malloc(100);

             memcpy(p,TrulyUnloadDLL,100);

             DWORD oldpro;

             VirtualProtect(p,100,PAGE_EXECUTE_READWRITE,&oldpro);       

             typedef  long (__stdcall *ptFun)(long a);

             ptFun pFun=(ptFun)p;

             pFun(1);

    }

     

    VS2010中默认情况下会运行失败。有两个注意点:

    1 关闭增量连接开关

    通常认为函数指针直接指向内存中的函数体指令。但是在vs中,如果打开了增量编译,函数指针指向的是一个跳转表,由跳转表的jmp指令跳转到真正的地址。(这个跳转表叫做ILT,增量连接表,为了方便编译而存在)。

    在工程的属性-连接器-启用增量连接-关闭之。

     

    2 关闭基本运行时检查-堆栈帧检查

    在调用函数后,VC编译器会自动加上调用_CRT_checkESP检查堆栈。但是在我们的代码副本中的_CRT_checkESP地址竟然是错误的(原因未知,是地址重定位过了?)

    属性-C/C++ - 基本运行时检查选择未初始化变量(也就是去掉了堆栈帧检查)

    • 0
      点赞
    • 0
      收藏
      觉得还不错? 一键收藏
    • 0
      评论

    “相关推荐”对你有帮助么?

    • 非常没帮助
    • 没帮助
    • 一般
    • 有帮助
    • 非常有帮助
    提交
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值