前言

在OD1.1中, 需要将选择好的内存数据转成在工程中需要的C数组.
用Winhex打开进程, 是有这个功能的, 但是这有点繁琐.
今天自己打造了一个OD1.1的插件, 帮我将选择好的内存数据存到剪贴板或附加到OD目录中的LsMem2CAry.log.
我就可以直接将转换好的C数组贴到工程中用了.

工程下载点

srcOllyDbg110PluginMem2CAry.zip

UI

实现

// @file MyDll.cpp
// @brief Ollydbg 1.10's plugin LsMem2CAry.dll by LostSpeed@csdn
//      on cpu dump window, select memory range
//      copy select bytes as C Language Array text
//      * copy array text define to clipboard
//      * or copy array text to default file <OllyDbgDir>\\LsMem2CAry.log#include "stdafx.h"
#include "MyDll.h"// include ollydbg's sdk
// 从http://www.ollydbg.de/下载的plug110.zip中带的OLLYDBG.LIB编译不过...
// 报错 : error LNK2001: unresolved external symbol _Readmemory
// 用的pediy上osc_092_src.rar中的Plugin.h和OLLYDBG.LIB编译通过#include "Plugin.h"
#pragma comment(lib, "OLLYDBG.LIB")#define PROG_NAME "LsMem2CAry"#define OPT_TYPE_BASE 0x1000
#define OPT_TYPE_TO_CLIPBOARD (OPT_TYPE_BASE + 1)
#define OPT_TYPE_TO_FILE (OPT_TYPE_BASE + 2)BOOL MemOptByType(DWORD dwAddrBegin, DWORD dwAddrEnd, int iType);
BOOL MemOptToClipBoard(const char* pBuf, DWORD dwBufLen);
BOOL MemOptToFile(const char* pcFileName, const char* pBuf, DWORD dwBufLen);BOOL APIENTRY DllMain(HANDLE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call) {case DLL_PROCESS_ATTACH:case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}MYDLL_API int foo(void)
{return 42;
}// 必须存在ODBG_Plugininit, 才会调用ODBG_Plugindata
extc int _export cdecl ODBG_Plugindata(char shortname[32])
{strcpy(shortname, PROG_NAME);      // Name of pluginreturn PLUGIN_VERSION;
};extc int _export cdecl ODBG_Plugininit(int ollydbgversion, HWND hw, ulong* features)
{if (ollydbgversion < PLUGIN_VERSION) {return -1;}return 0;
};extc int  _export cdecl ODBG_Pluginmenu(int origin, char data[4096], void* item)
{int iRc = FALSE;char szBuf[MAXBYTE] = {'\0'};switch (origin) {case PM_CPUDUMP: {if (NULL != data) {// main menu namestrcpy(data, "#copy select memory range byte content as C array text {");// sub menu id = 0, is "copy to clipboard"strcat(data, "0 copy to clipboard,");// sub menu id = 1, is "append to default file[LsMem2CAry.log]"strcat(data, "1 append to default file[<OllyDbgDir>\\LsMem2CAry.log]");strcat(data, "}");iRc = TRUE; // !}}break;default:break;                    // Any other window};return iRc;                            // Window not supported by plugin
}extc void _export cdecl ODBG_Pluginaction(int origin, int action, void* item)
{char szBuf[MAXBYTE] = {'\0'};t_dump* pItemInfo = (t_dump*)item;switch (origin) {case PM_CPUDUMP: {if (0 == action) {// copy to clipboardif (NULL != pItemInfo) {// pItemInfo->base : 所在内存区(section)开始地址// pItemInfo->size : 所在内存区(section)的size// pItemInfo->addr : 可见窗格的开始地址// pItemInfo->lastaddr : 可见窗格的结束地址(不包含)// pItemInfo->sel0 : 已经选择的字节范围开始地址(已经排序)// pItemInfo->sel1 : 已经选择的字节范围结束地址(已经排序, 不包含)// pItemInfo->startsel : 开始选择字节范围的开始地址MemOptByType(pItemInfo->sel0, pItemInfo->sel1 - 1, OPT_TYPE_TO_CLIPBOARD);}} else if (1 == action) {MemOptByType(pItemInfo->sel0, pItemInfo->sel1 - 1, OPT_TYPE_TO_FILE);}}break;default:break;};
}BOOL MemOptByType(DWORD dwAddrBegin, DWORD dwAddrEnd, int iType)
{// append to default file[LsMem2CAry.log]BOOL bRc = FALSE;DWORD dwIndex = 0;DWORD dwModPos = 0;BYTE ucAryToReadByte[2] = {'\0'};char* pcContainer = NULL;DWORD dwContainerLen = 0;char szBuf[MAXBYTE] = {'\0'};try {if (dwAddrEnd >= dwAddrBegin) {// 0x100字节 用来写修饰内容// 每个字节显示出来, 最多要占用7个字节(0xXX,\r\n)dwContainerLen = (dwAddrEnd - dwAddrBegin) * 7 + 0x100;pcContainer = new char[dwContainerLen];ZeroMemory(pcContainer, dwContainerLen);// array beginsprintf(szBuf, "unsigned char szMemAry_0x%X_0x%X[%ld] = {\r\n",dwAddrBegin,dwAddrEnd,dwAddrEnd - dwAddrBegin + 1);strcat(pcContainer, szBuf);/***/// format a byte one by one, append to pcContainerdwModPos = 0;for (dwIndex = dwAddrBegin; dwIndex <= dwAddrEnd; dwIndex++) {Readmemory(ucAryToReadByte, dwIndex, sizeof(char), MM_RESILENT);// 加缩进if (0 == dwModPos) {strcat(pcContainer, "    ");}// 加字节内容sprintf(szBuf, "0x%2.2X", ucAryToReadByte[0]);strcat(pcContainer, szBuf);if (dwIndex != dwAddrEnd) {strcat(pcContainer, ", ");}// 一行8个元素if ((7 == dwModPos) && (dwIndex != dwAddrEnd)) {strcat(pcContainer, "\r\n");dwModPos = 0;} else {dwModPos++;}}// array endsprintf(szBuf, "};\r\n\r\n");strcat(pcContainer, szBuf);// depend iType do diffrent taskif (OPT_TYPE_TO_CLIPBOARD == iType) {bRc = MemOptToClipBoard(pcContainer, strlen((const char*)pcContainer));sprintf(szBuf, "%s : copy memory [0x%X] ~ [0x%X] to clipboard",bRc ? "success" : "failed",dwAddrBegin,dwAddrEnd);} else if (OPT_TYPE_TO_FILE == iType) {bRc = MemOptToFile("LsMem2CAry.log", pcContainer, strlen((const char*)pcContainer));sprintf(szBuf, "%s : copy memory [0x%X] ~ [0x%X] append to file [<OllyDbgDir>\\%s]",bRc ? "success" : "failed",dwAddrBegin,dwAddrEnd,"LsMem2CAry.log");} else {sprintf(szBuf, "%s", "功能未实现");}} else {sprintf(szBuf, "%s", "软件BUG1, 请联系作者");}} catch (...) {sprintf(szBuf, "%s", "发生了异常, 请联系作者");}Infoline(szBuf);Updatelist();Flash(szBuf);if (NULL != pcContainer) {delete [] pcContainer;pcContainer = NULL;}return TRUE;
}BOOL MemOptToClipBoard(const char* pBuf, DWORD dwBufLen)
{BOOL bRc = FALSE;HGLOBAL hglbCopy = NULL;BYTE* pcBufForClipBoard = NULL;do {if (!OpenClipboard(NULL)) {break;}if ((NULL == pBuf) || (0 == dwBufLen) || (0xffffffff == dwBufLen)) {break;}hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (dwBufLen + 1) * sizeof(char));if (NULL == hglbCopy) {break;}EmptyClipboard();pcBufForClipBoard = (BYTE*)GlobalLock(hglbCopy);pcBufForClipBoard[dwBufLen] = '\0';memcpy(pcBufForClipBoard, pBuf, dwBufLen);GlobalUnlock(pcBufForClipBoard);SetClipboardData(CF_TEXT, hglbCopy);bRc = TRUE;} while (0);CloseClipboard();return bRc;
}BOOL MemOptToFile(const char* pcFileName, const char* pBuf, DWORD dwBufLen)
{BOOL bRc = FALSE;HANDLE hFile = INVALID_HANDLE_VALUE;DWORD dwFileSizeHigh = 0;DWORD dwFileSizeLow = 0;DWORD dwNumberOfBytesWritten = 0;try {do {if (NULL == pcFileName) {break;}hFile = ::CreateFileA(pcFileName,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);if (INVALID_HANDLE_VALUE == hFile) {break;}// append to file taildwFileSizeLow = GetFileSize(hFile, &dwFileSizeHigh);if ((0 != dwFileSizeLow) || (0 != dwFileSizeHigh)) {SetFilePointer(hFile, 0, NULL, FILE_END);}// &dwNumberOfBytesWritten 不能给NULL, 有异常被捕获WriteFile(hFile, pBuf, dwBufLen, &dwNumberOfBytesWritten, NULL);bRc = TRUE;} while (0);} catch (...) {}if ((NULL != hFile) && (INVALID_HANDLE_VALUE != hFile)) {CloseHandle(hFile);hFile = NULL;}return bRc;
}

Ollydbg 1.10's plugin LsMem2CAry.dll相关推荐

  1. OllyDBG 1.10汉化第二版

    汉化第二版主要更新: 1.界面采用 BoOMBoX/TSRh2004 制作的美化界面,主要为了好看一点. 2.绝大部分句子都重新翻译过,力求做到准确. 3.配置文件中除字体.语法高亮.颜色这几个部分保 ...

  2. 计算机丢失wswool.dll什么意思,如何修复Windows 10中丢失的DLL文件

    对于使用Windows 10的用户来说,丢失DLL文件的问题并不新鲜.出现这个问题时要如何修复错误?如果没有安装正确的.dll文件,则无法运行许多应用程序. 什么是.dll文件? .dll文件是一个动 ...

  3. 使命召唤10计算机丢失,Win7系统玩使命召唤10幽灵提示msvcr100.dll丢失如何解决

    使命召唤10幽灵是一款第一人称设计游戏,深受广大游戏玩家的喜爱,而在win7系统中玩使命召唤10幽灵的时候难免会遇到一些问题,就有用户反映说玩使命召唤10幽灵提示msvcr100.dll丢失,这是怎么 ...

  4. 近300个 Windows 10 可执行文件易受 DLL 劫持攻击

     聚焦源代码安全,网罗国内外最新资讯! 编译:奇安信代码卫士团队 一个简单的 VBScript就能使用户获得管理员权限并完全绕过Windows 10 的 UAC. 英国普华永道公司的安全研究员 Wie ...

  5. 福昕阅读器 5.4.4.1128 Firefox Plugin npFoxitReaderPlugin.dll Stack Buffer Overflow

    之前在 ISCC2013 线上赛的时候,这个溢出题没能做出来,现在正好在学习溢出,想重现下漏洞. http://www.exploit-db.com/exploits/23944/ exploit-d ...

  6. 风影版OllyDBG 1.10 2016-12-09修改版

    此版本在残影大哥的帮助下进行修改,主要修改范围 Patch几处错误代码 增加快捷方式菜单 修改标题避免检测 修改载入文件后标题避免检测 附加两个外部DLL完善功能 下载地址 http://pan.ba ...

  7. WIN 10系统丢失MSVCR110.dll和MSVCP110.dll问题

    解决方案一: 丢失MSVCR110.dll文件是不少单机游戏尤其是绿色免安装版的游戏常见问题,这个问题与丢失MSVCP110.dll文件的问题经常结伴而行.原因都是一个,系统没有安装VC运行库. 正确 ...

  8. Notepad++ 提示:An exception occurred due to plugin: HexEditor.dll 出错

    二进制插件坏了,有时候是自动升级时引起的 解决: 找到安装路径,进入插件目录(plugins),删除目录:HexEditor 重新运行Notepad++ ,出错提示不再显示 再安装上HexEditor ...

  9. c++ dll继续使用然后强制删除dll文件_Windows 10系统安全风险,近300个系统执行文件容易遭受劫持攻击...

    一个简单的VBScript足以让用户获得管理权限并完全绕过Windows 10上的UAC. 在普华永道英国安全研究人员Wietze Beukema的最新报告中,我们了解到将近300个Windows 1 ...

  10. OllyDBG完美教程(超强入门级)

    OllyDBG 视频教程:https://www.bilibili.com/video/av6889190 动态调试工具之OllyDbg(OD)教程:https://www.bilibili.com/ ...

最新文章

  1. 企业的覆灭,我监视你的Exchange邮件!
  2. CV之IS:利用pixellib库基于deeplabv3_xception模型对《庆余年》片段实现语义分割/图像分割简单代码全实现
  3. C#总结项目《影院售票系统》编写总结二
  4. C++学习成长的四个层次
  5. 文件到集合改进版【应用】
  6. 自己使用的一个.NET轻量开发结构
  7. hdu 4454 Stealing a Cake 三分法
  8. ffmpeg 推流同时录像命令_ffmpeg推流命令
  9. http 访问mysql数据库_04.Http协议之GET请求与访问MySQL数据库
  10. CKEditor 5 v17.0.0 发布,新增表格样式和特殊字符支持
  11. 【深入理解Java虚拟机学习笔记】第二章 Java 内存区域与内存溢出异常
  12. 穷人变富的过程中,最大的阻碍是什么?
  13. Linux CentOS安装JDK
  14. POI的word表格居中
  15. macd的顶背离和底背离
  16. 用js屏蔽脚本加载的广告
  17. 使用wait函数获取子进程终止状态
  18. 七张图总结了我的2021年,心依然热,情依然真----感谢2021年的自己,感谢CSDN
  19. BUUCTF Misc 被劫持的神秘礼物
  20. android 高德地图 删除多边形,高德地图多边形覆盖物添加、获取、删除

热门文章

  1. php小写转大写,php怎么实现英文小写转大写
  2. MeGUI中文版2112稳定版发布
  3. win7下megui压片无声、卡死、音画不同步、无法转码、无法硬解的解决办法!
  4. tp6+vue-element-admin 制作后台登录验证码
  5. cst自学教材_CST微波工作室入门与应用详解
  6. CF1009F Dominant Indices
  7. LeetCode 34. 在排序数组中查找元素的第一个和最后一个位置 Find First and Last Position of Element in Sorted Array
  8. 吃鸡显示服务器资源不足,Win10系统玩绝地求生提示虚拟内存不足的解决方法教程[多图]...
  9. linux流量监控分析工具,Linux网络流量监控与分析工具Ntopng
  10. 网络流量监控(局域网)