Windows逆向分析实战:使用CE+OD获取用户信息

article/2025/10/1 23:16:15

序:

很多想学软件逆向分析的朋友们,初学者往往看到一大堆的技术资料,直接就懵了。本文以一个简单的例子,演示一下使用CE+OD进行内存的获取,然后使用Qt进行界面显示,让初学者简单了解逆向分析的流程,并且一步步自己进行手动实现,让初学者有一些成就感,避免直接上来就是技术文档打击到学习的热情。

一、准备工作:

CheatEngine 简称CE 用来定位数据;
Ollydbg 简称OD 用来动态调试;
微信版本:3.1.0.67
Qt:5.13.0用来开发界面(我喜欢用Qt做界面,习惯使用MFC的朋友们也可以使用MFC,核心部分不影响)
资源可能不太好找,这里放上我使用的逆向分析三件套:CE+OD+IDA

二、使用CE获取找偏移地址

1、登陆电脑微信,打开CE软件,点击电脑图标,选择进程,选中WeChat.exe,点Open按钮;
在这里插入图片描述
2、在微信找到自己的登陆信息:LaoWang
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210316225305252.png

3、选择Value Type为String,将上一步中的用户名输入进去,然后点击First Scan按钮进行查找;
在这里插入图片描述

4、查看搜索结果有绿色的,说明用户名偏移是固定的,此处为10F235FC
在这里插入图片描述

5、查看该偏移地址附近的信息
在这里插入图片描述

6、该偏移地址附近的信息,有电话、地址信息、微信号等,说明个人信息是放在一起的;
在这里插入图片描述

二、使用OD查看更多内存信息

1、打开OD软件,File—>Attach,在弹出界面选择微信进程,然后点击Attach按钮;
在这里插入图片描述
2、我们在CE中搜索到的内存地址是:10F235FC,
(1)在OD界面我们使用dc 10F235FC命令,查找该内存地址附加的文本
在这里插入图片描述
(2)在OD界面我们使用dd 10F235FC命令,查找地址附加的指针所指向的文本(在文本较长的情况下,可能会使用指针)
在这里插入图片描述
在这里插入图片描述
可以看到wxid指针偏移地址是:10F23A18

四、计算偏移地址

1、计算偏移地址的方法:
偏移=内存地址-模块基址

2、在CE中查找模块:按下图步骤,可以看出内存地址所对应的模块为WeChatWin.dll;
在这里插入图片描述
3、在OD中查找模块基址:View—>Executable modules,找到WeChatWin.dll对应的基址为:0F680000

 Base=0F680000Size=01B40000 (28573696.)Entry=10529FDC WeChatWi.<ModuleEntryPoint>Name=WeChatWiFile version=3.1.0.67Path=D:\Program Files (x86)\WeChat\WeChatWin.dll

在这里插入图片描述
4、计算偏移
通过上面我们已经知道:
模块基址:0F680000

那么偏移地址
用户名:10F235FC - 0F680000 = 18A35FC
wxid指针:10F23A18 - 0F680000 = 18A3A18

其他信息可以参考此方法,根据需要进行计算

五、代码实现

1、新建Qt工程
在这里插入图片描述
2、用Qt Designer打开MainWindow.ui,拖入一个QTextBrowser和一个QPushButton,并进行布局;
在这里插入图片描述

3、在mainwindow.h类中添加一个槽和四个方法

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <Windows.h>namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = nullptr);~MainWindow();public slots://按钮点击槽void onPushButtonClicked(bool);private://根据进程名字获取进程idDWORD FindProgressPidByName(const char* progressName);//获取dll基地址DWORD GetDLLBaseAddress(DWORD processID, const wchar_t* moduleName);//获取指针指向的内存DWORD getIntByAddress(HANDLE hProcess, DWORD address);//获取内存地址对应的文本QString getStrByAddress(HANDLE hProcess, DWORD address);private:Ui::MainWindow *ui;
};#endif // MAINWINDOW_H

4、方法的实现
可以使用函数ReadProcessMemory在外部进程内存的读取
(1)根据进程名字获取进程id

/*** @brief 根据进程名字获取进程id* @param progressName* @return*/
DWORD MainWindow::FindProgressPidByName(const char* progressName)
{DWORD processID = 0;PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(PROCESSENTRY32);// 获取所有进程的信息HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);// 拿到第一个进程的信息if (Process32First(hSnapshot, &pe32) == TRUE){do{USES_CONVERSION;// 进程名字是progressName就返回if (strcmp(progressName, W2A(pe32.szExeFile)) == 0){processID = pe32.th32ProcessID;break;}// 进程名字不是progressName,获取下一个进程信息} while (Process32Next(hSnapshot, &pe32));}CloseHandle(hSnapshot);return processID;
}

(2)根据进程ID和模块名获取dll基地址

/*** @brief 根据进程ID和模块名获取dll基地址* @param processID* @param moduleName* @return*/
DWORD MainWindow::GetDLLBaseAddress(DWORD processID, const wchar_t *moduleName)
{DWORD moduleBaseAddress = 0;// 获取进程ID processID 对应的进程信息HANDLE hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32, processID);if (hProcessSnapshot == INVALID_HANDLE_VALUE) return moduleBaseAddress;MODULEENTRY32 me32;SecureZeroMemory(&me32, sizeof(MODULEENTRY32));me32.dwSize = sizeof(MODULEENTRY32);// 遍历进程的模块信息while (Module32Next(hProcessSnapshot, &me32)){me32.dwSize = sizeof(MODULEENTRY32);// 判断是不是目标模块moduleNameif (!_tcscmp(me32.szModule, moduleName)){moduleBaseAddress = (DWORD)me32.modBaseAddr;break;}}CloseHandle(hProcessSnapshot);return moduleBaseAddress;
}

(3)根据进程和指针地址获取内存地址

/*** @brief 根据进程和指针地址获取内存地址* @param hProcess* @param address* @return*/
DWORD MainWindow::getIntByAddress(HANDLE hProcess, DWORD address)
{DWORD intValue = 0;ReadProcessMemory(hProcess, (LPVOID)address, &intValue, 4, 0);return intValue;
}

(4)获取内存地址对应的文本

/*** @brief 获取内存地址对应的文本* @param hProcess* @param address* @return*/
QString MainWindow::getStrByAddress(HANDLE hProcess, DWORD address)
{QString csValue = "";char cValue[500] = { 0 };if (ReadProcessMemory(hProcess, (LPVOID)address, cValue, 500, 0)){csValue = QString(cValue);}return csValue;
}

小结

流程是
1、通过CE+OD获取偏移地址
2、通过ReadProcessMemory接口读取内存数据
3、使用Qt开发界面,显示读取的信息

上边写的很详细,源码注释也很详细,相信读者读懂难度不大,这里放上源码


http://chatgpt.dhexx.cn/article/qanoPblH.shtml

相关文章

OD教程(去除NAG窗口--PE文件结构)

nag本意是烦人的意思&#xff0c;nag窗口是软件设计者用来时不时提醒用户购买正版的警告窗口。 软件设计者可能认为当用户忍受不了试用版中的这些烦人的窗口时&#xff0c;就会考虑购买正式版本。 PE文件结构 为什么需要了解PE文件结构&#xff1f; 大家想象一下&#xff0…

OD使用说明

目录 功能下载使用界面说明工具栏介绍快捷键 功能 ollydbg是一种动态反汇编工具&#xff0c;可以对运行的代码进行调试 下载 我下载了吾爱破解专版&#xff0c;因为它集成了多种插件 使用 软件运行以后就是下面的界面 界面说明 工具栏介绍 加载上一次的调试程序 关闭调…

小甲鱼OD使用教程七----破解VisualSite Designer

学习了小甲鱼OD使用教程之后的记录&#xff0c;仅供学习参考使用 一&#xff0c;程序分析 打开 关闭 这个程序无壳&#xff0c;需要破解的有两个点&#xff1a;1.使用次数限制 2.广告 第一点甲鱼叔在视频中介绍了两种方法&#xff0c;在次数耗尽之前和之后 1.次数耗尽之前 …

OD插件编写

前言 本教程主旨用于编写一个OD插件修复部分问题或者解析反调试问题. 官方文档 异常过滤器的反调试插件 当触发异常时首先会将异常交付给SEH然后再交付到 SetUnhandledExceptionFilter&#xff0c;不管是哪个阶段当存在调试器时&#xff0c;首先会交付给调试器&#xff0c;…

OD实战(1)

软件暴力破解 软件破解 软件 TraceMe下载地址&#xff1a;https://pan.baidu.com/s/1bWWm3L6cZ0gOqFIsKXQqkw 提取码&#xff1a;uqcd 破解 软件运行以后需要输入用户名和序列号&#xff0c;通过文本比较&#xff0c;只有正确的账号信息才能够进入&#xff0c;我们所要作的就…

Od软件破解

【文章标题】&#xff1a;算法分析与注册机编写 【文章作者】&#xff1a;hahaya 【软件名称】&#xff1a;Free Internet Window Washer 【软件大小】&#xff1a;1177KB 【保护方式】&#xff1a;注册码 【软件介绍】&#xff1a;无 【下载地址】&#xff1a;http://download…

简单详细的OD破解教程

2007-08-04 15:46作者&#xff1a;CCDebuger注&#xff1a;昨天在网上见到了这篇文章&#xff0c;但缺少插图&#xff0c;从另外一篇文章中也看到了类似的的教程文章&#xff0c;里面的插图质量实在不敢恭维。在一个论坛中正好下载了文章中所介绍的破解软件CRACKME3&#xff0c…

通过一个例子来介绍OD的简单使用

OllyDbg是一个32位的动态调试器&#xff0c;在平常做逆向的题中用的比较多&#xff0c;下面用bugku一个简单的例子Eazy-Re来介绍一下OllyDbg的使用。 首先打开程序&#xff0c;看一下是干什么的&#xff0c;他提示你输入flag&#xff0c;这里我随便输入几个字母&#xff0c;提…

OD基本介绍及快捷键讲解

OD简介 Ollydbg&#xff08;简称OD&#xff09;是Windows平台下Ring3级的程序调试利器。程序调试有静态调试和动态调试两种。静态调试是指将程序源代码编译成可执行程序之前&#xff0c;用手工或编译程序等方法对程序源代码进行测试&#xff0c;来查找和修正程序中的语法错误和…

OD修改软件

一、打开软件&#xff0c;查看正常运行的程序 二、打开OD&#xff0c;拖入要调试的程序 三、分析汇编代码 title是"Hello world"&#xff0c;内存地址是0x00403000 四、数据窗口跳转到该地址&#xff0c;快捷键ctrlG 五、修改数据 点击要修改的地方&#xff0c;按…

简单详细的OD破解教程(转)

简单详细的OD破解教程 2007-08-04 15:46作者&#xff1a;CCDebuger注&#xff1a;昨天在网上见到了这篇文章&#xff0c;但缺少插图&#xff0c;从另外一篇文章中也看到了类似的的教程文章&#xff0c;里面的插图质量实在不敢恭维。在一个论坛中正好下载了文章中所介绍的破解软…

OD教程(汇编基础)

一、call有以下几种方式&#xff1a; call 404000h ;直接跳到函数或过程的地址 call eax ;函数或过程地址存放在eax call dword ptr [eax] call dword prt[eax ] call dword ptr [eax5] call dword prt[eax5] calldword ptr [<&API>] ;执行一个系统API 二、关于…

小甲鱼解密系列调试篇——OD使用教程笔记(持续更新中)

目录 一点铺垫&#xff1a;基础知识 1.汇编语言 2.NAG窗口 3.SEH 4.断点类型 一、MessageBox.exe修改程序标题内容——修改函数传入值 二、TraceMe.exe暴力破解程序登陆界面——搜索函数、寻找附近调用取值的地方 三、reverseMe.exe暴力破解/打补丁实现注册——分析文件…

第52篇:OD使用教程2-设置API函数断点去除软件对话框及过期校验

Part1 前言 大家好&#xff0c;我是ABC_123。之前分享过一篇Ollydbg逆向分析入门教程《第50篇&#xff1a;使用OD逆向破解流光Fluxay扫描器各种限制》&#xff0c;这篇文章主要讲解了在使用OD逆向分析时&#xff0c;如何按照编程人员的思维去解除软件的各种限制。方法有点麻烦…

od的简单使用--(1)

od的简单使用——&#xff08;1&#xff09; 一&#xff0c;本教程需要的工具OllyDBG 下载&#xff1a; OllyDBG 中各个窗口的功能如上图。简单解释一下各个窗口的功能&#xff0c;更详细的内容可以参考 TT 小组翻译的中文帮助&#xff1a;反汇编窗口&#xff1a;显示被调试程…

PyCharm 社区版(Community)能不能商用?

其实官方博客已经给出了答案&#xff0c;截图如下&#xff1a; PyCharm社区版是专业版的阉割版&#xff0c;PYcharm专业版增加了Web开发、Python We框架、Python分析器、远程开发、支持数据库与SQL等更多高级功能。两者区分如下&#xff1a; 所以&#xff0c;大胆放心的用PyC…

Pycharm社区版下载及安装教程

下载&#xff1a; 下载地址&#xff1a;https://www.jetbrains.com/pycharm/download/#sectionwindows 安装&#xff1a; 打开你下载的路径&#xff0c;双击.exe文件&#xff0c;点击运行 默认点击next之后&#xff0c;选择路径&#xff0c;尽量不要选择在C盘&#xff0c;然后…

Pycharm社区版安装教程(永久免费,随时升级)

首先进入JetBrain的官网(国内正常访问): https://www.jetbrains.com/ 第一眼看到的界面如下图所示: 然后找到我们的Pycharm专题页: 进入Pycharm的专题页面之后,点击下载按钮(这里有两个按钮,点任何一个都行): 然后进入到真正的下载页面你会发现有两个版本的Pycharm,一个…

pycharm安装-社区版

下载地址 Download PyCharm: Python IDE for Professional Developers by JetBrains https://www.jetbrains.com/pycharm/download/#sectionwindows 下载社区版 安装过程 双击安装包 开始安装 安装过程 首次启动 双击桌面图标 选风格 深色保护视力 新建项目 新建文件

如何用Pycharm社区版连接数据库

用Pycharm社区版连接数据库 Pycharm 社区版安装过程 Pycharm 社区版 Pycharm社区版是比专业少了一些功能&#xff0c;直接并没有连接数据库的工具&#xff0c;所以需要自行下载安装。 安装过程 1.file->settings 2.在Plugins中搜索database 3.点击搜素 4.选中要下载的…