ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c/c++ 生成debug函数,使用API会检查堆栈平衡

2021-04-09 12:35:03  阅读:192  来源: 互联网

标签:代码 pBuf c++ 钩取 API APIAddr debug DWORD LoadLibraryA


  今天我使用的代码钩取的技术手段钩取了loadLibaryA,但是却报错了,查看汇编代码,发现在调用loadLibaryA后还会调用一个检查堆栈平衡的函数,这个是编译器在debug版本自动加的。

详细说明请看:

  本次案例代码为钩取函数的代码,编译环境为:vs2010,字符集为unicode,运行环境windos7 32位,如下图所示

  

#include <stdio.h>
#include <Windows.h>
#include <tchar.h>
#include <locale.h>
/**     
     名称:hookByCode
     功能:    在某个API下钩子
     参数:PVOID APIAddr 被钩取的函数地址  PVOID hookProc 钩子函数 PBYTE pBuf  保存前五个字节的缓冲区
     返回值:PBYTE 返回被下钩子的API的前5个字节 用于脱钩
**/
VOID hookByCode(PVOID APIAddr,PVOID hookProc,PBYTE pBuf){
    memcpy(pBuf,APIAddr,5);
    //计算跳转距离
    // 若已经被钩取则返回FALSE  
    if( ((PBYTE)APIAddr)[0] == 0xE9 )  
        return ; 
    //目标位置
        DWORD desPos = (DWORD)hookProc;
    //源位置
        DWORD srcPos = (DWORD)APIAddr+5;
        DWORD jmpDistance = desPos-srcPos;
    //取得可写权限
        DWORD lpflOldProtect;
        VirtualProtect(APIAddr,5,PAGE_READWRITE,&lpflOldProtect);
    //设置跳转语句

        memcpy((byte *)APIAddr+1,&jmpDistance,4);
        *(BYTE *)APIAddr = 0xE9;
        
        VirtualProtect(APIAddr,5,lpflOldProtect,&lpflOldProtect);
}
HMODULE myload(LPCSTR lpLibFileName){
    printf("惊喜吗!!!");
    return 0;
}

void main(){
    /*BYTE bytes1[4] = {0x00,0x10,0x40,0x00};
    BYTE bytes2[4] = {0x05,0x20,0x40,0x00};
    DWORD b1 = *(DWORD *)bytes1;
    DWORD b2 = *(DWORD *)bytes2;
    DWORD result = b1-b2;

    printf("%X-%X=%X",b1,b2,result);*/
    //loadW("user32.dll");
    //printf("0x%X",(int)p);
    BYTE pBuf[5]={0,};
    //hookByCode("kernel32.dll","LoadLibraryA",(FARPROC)myload,pBuf);
    //unhook_by_code("kernel32.dll","LoadLibraryA",pBuf);
    //    HMODULE (*loadW)(LPCSTR);
    //loadW = (HMODULE (*)(LPCSTR))getAPIAddress(L"kernel32.dll",L"LoadLibraryA");
    hookByCode(LoadLibraryA,myload,pBuf);
    //unhookByCode(LoadLibraryA,pBuf);
    system("pause");
    myload("a");
    LoadLibraryA("user32.dll");
    printf("12");
    system("pause");
}

debug版本,的汇编代码,如下图所示

 

 

 红圈的是LoadLibrary的汇编代码,而蓝圈的是检查堆栈平衡,就是因为它我钩取Loadlibrary后才会报错,效果图如下

 

 

 release版本,的汇编代码,如下图所示

 

 只剩下红圈里LoadLibrary的汇编代码,而蓝圈的检查代码消失了,果然不报错了,效果图如下

 

标签:代码,pBuf,c++,钩取,API,APIAddr,debug,DWORD,LoadLibraryA
来源: https://www.cnblogs.com/czlnb/p/14636574.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有