几个小问题,汇总一下
一、关于读出内存时,如果是中文的字符,请注意字符编码的问题,比如最近做的一个程序拿出来的一直是乱码,那不妨这样试试
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,即可以看到了
分类:
学习C++
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
2009-06-09 一步一步识别验证码(二值化处理)