小隐的博客

人生在世,笑饮一生
随笔 - 304, 文章 - 0, 评论 - 349, 阅读 - 50万
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

学习c++ (八) 关于inline hook时执行自己 的代码

Posted on   隐客  阅读(430)  评论(0编辑  收藏  举报

几个小问题,汇总一下

一、关于读出内存时,如果是中文的字符,请注意字符编码的问题,比如最近做的一个程序拿出来的一直是乱码,那不妨这样试试

复制代码
char* charToGBK(const char* str)
{    
    int    textlen = 0;
    wchar_t* result;
    textlen = MultiByteToWideChar(CP_UTF8, 0, str, -1, NULL, 0);
    result = (wchar_t*)malloc((textlen + 1) * sizeof(wchar_t));
    memset(result, 0, (textlen + 1) * sizeof(wchar_t));
    MultiByteToWideChar(CP_UTF8, 0, str, -1, (LPWSTR)result, textlen);

    textlen = WideCharToMultiByte(CP_ACP, 0, result, -1, NULL, 0, NULL, NULL);
    char* strGBK = new char[textlen];
    WideCharToMultiByte(CP_ACP, 0, result, -1, strGBK, textlen, NULL, NULL);
     
    return    strGBK;
}
复制代码

二、在内存中植入代码时,执行自己的代码

复制代码
_declspec(naked) void OnCall() {
    __asm {
        //mov EXesp, esp
        //pushfd
        pushad

        push 0x11
        push 0x22
        call addsum
        
        add esp, 0x8;
        popad
        
        //popfd
        call calloriaddr
        jmp jmbback
    }
}
复制代码

addsum是c++写的,然后直接在asm中执行,并且传了两个参数,参数的传递顺序是,先push的,是后面的参数,比如上面的就表示 addsum(22,11)

执行完了之后,有一个堆栈平衡的问题,所以我在后面执行了一个add esp,0x8,这是一个固定写法,但0x8是按你传的参数来的,一个参数为4,两个参数为8,三个就是C了

第三个问题是如何打印调试信息,正常调试时,可以在ide里看到调试信息,但是已经成exe或dll时,可以考虑用另外的办法

复制代码
#define IS_USE_OUTPUT_DEBUG_PRINT   1
#if  IS_USE_OUTPUT_DEBUG_PRINT 

#define  OUTPUT_DEBUG_PRINTF(str)  OutputDebugPrintf(str)
void OutputDebugPrintf(const char* strOutputString, ...)
{
#define PUT_PUT_DEBUG_BUF_LEN   1024
    char strBuffer[PUT_PUT_DEBUG_BUF_LEN] = { 0 };
    va_list vlArgs;
    va_start(vlArgs, strOutputString);
    _vsnprintf_s(strBuffer, sizeof(strBuffer) - 1, strOutputString, vlArgs);  //_vsnprintf_s  _vsnprintf
    //vsprintf(strBuffer,strOutputString,vlArgs);
    va_end(vlArgs);
    OutputDebugStringA(strBuffer);  //OutputDebugString    // OutputDebugStringW

}
#else 
#define  OUTPUT_DEBUG_PRINTF(str) 
#endif

调用:
OutputDebugPrintf("DEBUG_INFO | result: %s", itc);
复制代码

然后用DebugView查看,过滤一下DEBUG_INFO,即可以看到了

 

编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
历史上的今天:
2009-06-09 一步一步识别验证码(二值化处理)
QQ交流
点击右上角即可分享
微信分享提示