Win32汇编学习笔记03.RadAsm和补丁

news/2025/1/7 14:18:26/文章来源:https://www.cnblogs.com/weiyuanzhang/p/18651107

https://bpsend.net/thread-163-1-1.html

补丁

扫雷游戏啊下补丁

在扫雷游戏中,点关闭弹出一个确认框,确认之后再关闭,取消就不关闭

img

  1. 首先第一步就是确认关闭按钮响应的位置,一般都是 WM_CLOSE 的消息 ,消息响应一般都在过程函数,所以就是要定位到过程函数,我们知道 MC 项目中 ,如果是重叠类的窗口,注册窗口类的时候会用到过程函数, 如果是对话框的 那就是调 DialogBox
  2. 先假设扫雷是一个 重叠类窗口 那我们就要知道程序中那个地方调用了 RegisterClass (注册窗口类)
  • 最笨的方法就是一步步跟,但比较耗时间
    
  • 使用OD自带的功能,帮助我们定位在哪些地方,调用了哪些导入函数,只显示当前加载的

img

img

img

img

img

img

img

在所有调用地方设置断点

img

  1. 下好断点后开始调试, F9 运行到断点处

注册窗口类第一个参数是窗口类的地址,

img

窗口类第二个参数是函数地址,第一个是风格

img

img

img

  1. 寻找 WM_CLOSE 消息,可以通过条件断点寻找

img

分析可知 , 参数入栈顺序是 最后一个参数,倒数第二个参数........,第一个参数,返回地址,二消息id是通过 第三个参数 WPARAM 所以参数位置在 esp + 8 处

img

img

  1. 在关闭游戏,这样就可以触发 WM_CLOSE 消息,从而触发断点,在 F8 单步运行,看到哪部跳走

img 可以看出它调用了 默认过程函数,并没有自己处理关闭消息,所以我们只能 自己来 判断是不是WM_CLOSE 消息,然后我们自己来处理 ,如果是 WM_CLOSE ,那么就需要我们去弹窗,不是的话就交给过程函数去处理

  1. 我们要处理 WM_CLOSE 消息,那么就需要去写代码,但是又不能覆盖他原本的代码,因此他们有代码地方我们都不能用,只能找空白的地方写

img

记录一下我们们写代码的地方

我们汇编代码开始位置

01004A60 00 db 00

img

通过之前我们跟代码,可以知道,程序是从该处跳转到 默认过程函数的,因此我们可以将此处改成 跳转到我们的代码处,然后再由我们跳转回来

原来的跳转地址

01001C16 |. /0F85 8D050000 jnz 010021A9

函数退出位置

010021BB |> \5F pop edi

通过空格单击, ,修改汇编代码,来修改跳转位置

img

选中修改后的地址,跳转过去开始写我们的汇编代码

img

img

接下来相等就要弹窗 ,首先要有提示语,需要保存到文本

img

img

img

  1. 调用弹窗函数

img

标题,文本入栈

img

img

窗口句柄入栈

img

调用函数

img

判断点击按钮

img

判断,是确定就挑转到 默认过程处理函数,否则退出函数

img

img

img

但是这个时候我们写的代码还只是在内存里面,程序一旦重启 就都没了,因此我们要保存到可执行文件

img

img

img

  1. 保存文件运行

这是点击退出,发现出现了弹窗提示

img

img

注意: 找空白位置不要到最后,不然按可能报错,位置有规律,但是要学pe

img

通过OD 下断点/取消断点 alt +b

img

如果有断点 ,选中 del

程序 F9 运行后

img

img

img

img

img

在Crack Me 下补丁

使其提示成功

Brad Soblesky.1.zip(4 KB)

image.png

方法1: 定位 command 消息

image.png

image.png

或者

image.png

image.png

f9 运行 到断点 ,在 f8 单步运行

image.png

可以看到,运行到系统的 dll 中,所以这不是一个 重叠类窗口,所以过程函数不是自己的,无法用上面方法,所以要换个f方法

因为 他失败成功都会弹出一个对话框,里面有字符串,因此我们可以通过 OD 的字符串查找功能

image.png

image.png

image.png

image.png

查看上面的代码

image.png

在此处下点,就可以看到比较的字符串,即正确的字符串

image.png

或者直接去掉比较,那么不管输出字符串是啥,都可以成功

image.png

image.png

将文件保存

image.png

运行我们保存的文件,发下不管输入什么字符串都可以通过了,即破解成功了

注册机

当遇到非明码比较时,上面的方法就行不通,因为密码是通过 加密解密得到的

image.png

输入2行字符串,验证通过

Brad Soblesky.2.zip(4 KB)

首先定位到字符串,下断点

image.png

往上找代码,在函数入口出下断点

image.png

跟一下大体流程,通过跟代码,我们可以知道

image.png

image.png

image.png

F4 运行到光标处,运行完循环 ,继续运行

image.png

image.png

断点继续跟

image.png

image.png

image.png

加注释于0040163B

image.png

因此可以分析出,程序是那我们输入的字符串做一系列运算,再把结果格式化后去跟第二个字符串 作比较,我们把上面格式化后的字符串拿去测试,可以发现通过了,所以猜想是正确的

image.png

上面软件已经提供了加密算法,因此写该软件的注册机可以直接把他的代码复制出来来就可以了

image.png

L000:mov     edx, dword ptr [ebp-20]add     edx, 1mov     dword ptr [ebp-20], edxmov     eax, dword ptr [ebp-20]cmp     eax, dword ptr [ebp-1C]jge     short 0040161Amov     ecx, dword ptr [ebp-20]push    ecxlea     ecx, dword ptr [ebp-14]call    00401900movsx   edx, almov     eax, dword ptr [ebp-10]add     eax, edxmov     dword ptr [ebp-10], eaxmov     ecx, dword ptr [ebp-20]shl     ecx, 8mov     edx, dword ptr [ebp-10]xor     edx, ecxmov     dword ptr [ebp-10], edxmov     eax, dword ptr [ebp-20]add     eax, 1mov     ecx, dword ptr [ebp-1C]imul    ecx, dword ptr [ebp-20]not     ecximul    eax, ecxmov     edx, dword ptr [ebp-10]imul    edx, eaxmov     dword ptr [ebp-10], edxjmp L000

上面还有很多参数,必须我们去分析

image.png

新建工程

image.png

模板,根据自己需要选择

剩下的不用动,一直下一步完成就行

image.png

GIST\REGIST.ASM

image.png

S\ADMINISTRATOR\DESKTOP\03 补丁\REGIST\REGIST.ASM]

image.png

编译和链接,链接之前记得编译资源脚本,或者直接构建

添加资源

image.png

如果给控件添加名字需要自己手动加到头文件

image.png

image.png

下面就开始写注册机了

L000:mov     edx, dword ptr [ebp-20]add     edx, 1mov     dword ptr [ebp-20], edxmov     eax, dword ptr [ebp-20]cmp     eax, dword ptr [ebp-1C]jge     short 0040161Amov     ecx, dword ptr [ebp-20]push    ecxlea     ecx, dword ptr [ebp-14]call    00401900movsx   edx, almov     eax, dword ptr [ebp-10]add     eax, edxmov     dword ptr [ebp-10], eaxmov     ecx, dword ptr [ebp-20]shl     ecx, 8mov     edx, dword ptr [ebp-10]xor     edx, ecxmov     dword ptr [ebp-10], edxmov     eax, dword ptr [ebp-20]add     eax, 1mov     ecx, dword ptr [ebp-1C]imul    ecx, dword ptr [ebp-20]not     ecximul    eax, ecxmov     edx, dword ptr [ebp-10]imul    edx, eaxmov     dword ptr [ebp-10], edxjmp L000

首选要对函数进行分析

通过跟代码发现 ebp-20 是一个局部变量,作用是计数器

ebp-1c   是输入字符长度

img

这里是去字符串读取 所以可以用 lodsb 替换

几位下来就剩 ebp-10 ,ebp-1c .找到最开始出现的地方,来观察数据变化

img

通过几次不同测试,发现值 是固定的

img

img

注册机源码

.386
.model flat, stdcall  ;32 bit memory model
option casemap :none  ;case sensitiveinclude Regist.inc.datag_szUserName  db 50 dup(0)  ;用户名  g_szSerial    db 50 dup(0)  ;注册码g_szFmt       db "%lu" ,0   ;格式化字符串.codestart:invoke GetModuleHandle,NULLmov		hInstance,eaxinvoke InitCommonControlsinvoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULLinvoke ExitProcess,0;########################################################################
Make  proc   hWin:HWND    ;加密LOCAL  @dwIdx:DWORDLOCAL  @dwCnt:DWORDLOCAL  @dwEdp_10:DWORDLOCAL  @dwEdp_14:DWORD;回去文本输入的值invoke GetDlgItemText,hWin,EDT_USERNAME,offset g_szUserName,size g_szUserName  ;获取用户名内容mov  @dwCnt,eaxmov  @dwIdx,0mov esi ,offset g_szUserName  mov @dwEdp_10,81276345Hjmp  LSATART;对用户名加密解密L000:mov     edx, @dwIdxadd     edx, 1mov     @dwIdx, edxLSATART:   mov     eax, @dwIdxcmp     eax, @dwCntjge     LEND;mov     ecx, @dwIdx;push    ecx;lea     ecx, dword ptr [ebp-14];call    00401900lodsb    ;上面四行作用movsx   edx, almov     eax, @dwEdp_10add     eax, edxmov     @dwEdp_10, eaxmov     ecx, @dwIdxshl     ecx, 8mov     edx, @dwEdp_10xor     edx, ecxmov     @dwEdp_10, edxmov     eax, @dwIdxadd     eax, 1mov     ecx, dword ptr @dwCntimul    ecx, @dwIdxnot     ecximul    eax, ecxmov     edx, @dwEdp_10imul    edx, eaxmov     @dwEdp_10,edxjmp L000LEND: ;格式化字符串invoke wsprintf,offset g_szSerial,offset g_szFmt,@dwEdp_10 ;显示到界面invoke SetDlgItemText,hWin,EDT_SERUNMBER,offset  g_szSerial  Make endpDlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAMmov		eax,uMsg.if eax==WM_INITDIALOG.elseif eax==WM_COMMANDmov eax,wParam.if eax == BTN_MAKEinvoke Make,hWin.endif.elseif eax==WM_CLOSEinvoke EndDialog,hWin,0.elsemov		eax,FALSEret.endifmov		eax,TRUEretDlgProc endpend start

作业

📎作业文件.zip

1. 修改机器码指令对照表.exe的字体

思路:

\1. sendmessage给callwindow发消息 然后绘制界面,sendmessage的第一个消息就是设置字体的

\2. 调用 CreateFontA 它有个设置字体的那块 设置完毕后会发个消息 找消息循环上面的发消息那块 就能看见有个函数,在获取系统字体 然后把这个函数换掉,换成跳转到自己的代码处 改完再跳回来

HFONT CreateFontA([in] int    cHeight,  [in] int    cWidth,[in] int    cEscapement,[in] int    cOrientation,[in] int    cWeight,[in] DWORD  bItalic,[in] DWORD  bUnderline,[in] DWORD  bStrikeOut,[in] DWORD  iCharSet,[in] DWORD  iOutPrecision,[in] DWORD  iClipPrecision,[in] DWORD  iQuality,[in] DWORD  iPitchAndFamily,[in] LPCSTR pszFaceName
);

image.png

image.png

  1. COM Explorer_Setup 注册机,汇编实现。

详情见 day05 补课

思路: 根据弹窗标题搜字符串,往上找到分支跳,定位到关键函数,找到算法代码,(算法代码使用四则运算和位运算比较多),然后把代码抽出来去分析,失败分支那里肯定有校验的算法

image.png

image.png

找到成功或失败分支

image.png

L000:mov     ebp, dword ptr [463E48]or      ecx, FFFFFFFFmov     edi, ebpxor     eax, eaxrepne   scas byte ptr es:[edi]not     ecxdec     ecxmov     eax, esixor     edx, edxmov     edi, ebpdiv     ecxmov     ecx, dword ptr [esp+14]mov     eax, esimovsx   ebx, byte ptr [edx+ebp]xor     edx, edxdiv     ecxmovsx   eax, byte ptr [edx+469968]lea     edx, dword ptr [eax+eax*2]lea     eax, dword ptr [eax+edx*4]mov     edx, esiimul    edx, esiimul    edx, esiimul    edx, ecxadd     ebx, eaxor      ecx, FFFFFFFFxor     eax, eaxadd     ebx, edxrepne   scas byte ptr es:[edi]not     ecxdec     ecxmov     eax, ebxxor     edx, edxdiv     ecxlea     ecx, dword ptr [esp+10]mov     al, byte ptr [edx+ebp]push    eaxcall    0042F29Atest    esi, esije L048mov     eax, esixor     edx, edxmov     ecx, 3div     ecxtest    edx, edxjnz L048push    004640F8lea     ecx, dword ptr [esp+14]call    0042F273
L048:inc     esicmp     esi, 9jb L000

img

img

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/863611.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

六. 哈希表

哈希表 哈希表又称散列表,通过建立键 key 与值 value 之间的映射,实现高效的元素查询。当对哈希表输入键 key 时,即可查询到对应的值 value,其时间复杂度仅为 O(1)。1. 哈希表 1.1. 哈希表常用操作 1.1.1. 基础操作 基础操作包括初始化、查询、添加键值对和删除键值对 # 初…

文件对比工具:Beyond Compare 下载与安装教程(无需激活,便捷使用)

前言 Beyond Compare是一款功能强大的文件与文件夹对比工具,广泛应用于文件同步、版本管理、差异对比等场景。它支持文件夹、压缩包、FTP网站之间的差异对比,能够帮助用户快速识别和解决文件间的不同。通过内置的文件浏览器,用户可以轻松比较并同步文件内容。 Beyond Compar…

第九章习题

学号后四位:3018 9.2:点击查看代码 import numpy as np from scipy.stats import shapirodata = np.array([15.0, 15.8, 15.2, 15.1, 15.9, 14.7, 14.8, 15.5, 15.6, 15.3,15.1, 15.3, 15.0, 15.6, 15.7, 14.8, 14.5, 14.2, 14.9, 14.9,15.2, 15.0, 15.3, 15.6, 15.1, 14.9, 14…

Diary - 2025.01.03

今天简直是最糖的一次阿!!!今天简直是唐完了,糖糖。 晚上想啥啥不会,看了题解还写不出来。 我去我是不是没救了??? 今天的事没有办法,就鸽到明天去吧(。whk 结束啦!!! 看来 pku 还是挺良心的,有优异的还能直接打,太感动了!!! 比较意外的是我居然去年 pkusc 也…

【汇编靶场】CEmu:一款轻量级多平台架构汇编训练场

关于CEmu CEmu是一款轻量级多平台架构的汇编训练场,广大研究人员可以利用该工具研究和学习汇编语言,以便快速编写和测试汇编语言代码。 编写汇编语言很有趣,汇编语言是与计算机通信的最低级语言(人类可理解),对于理解任何机器的内部机制都至关重要。不幸的是,为各种架构…

『矩阵树定理,LGV引理,行列式』Day9 略解

我抓不住世间的美好,所以只能装作万事顺遂的模样前言我抓不住世间的美好,所以只能装作万事顺遂的模样第二个链接,做是做不起一点的,只能乞讨别考这些**东西。 A 最小带权生成树计数板题。(其实没这么多戏份) 首先先求出任意一颗最小生成树,如果没有直接输出 \(0\)。 对于…

使用Cursor + Qwen2.5 大模型 零经验研发微信小程序:自由构建个性化节拍器应用实战

使用Cursor + Qwen2.5 大模型 零经验研发微信小程序:自由构建个性化节拍器应用实战" description = "本文介绍了如何利用Cursor工具结合Qwen2.5大模型快速开发一款个性化的微信小程序——老牛同学节拍器。通过详细的步骤,我们展示了从零开始创建一个功能完备的小程…

【金融安全】详解红筹架构的搭建

#金融与法律 #红筹架构 什么是红筹架构 红筹架构通常是指中国内地企业在境外(如中国香港、开曼群岛、英属维尔京群岛等地)设立特殊目的公司(SPV),然后将境内企业的资产或权益注入到这些SPV中,最终通过这些境外控股公司在境外交易所上市。红筹架构允许企业绕开国内直接上…

【金融安全】金融行业该如何保障数据安全?

近日,为规范银行业保险业数据处理活动,保障数据安全、金融安全,促进数据合理开发利用,维护社会公共利益和金融消费者合法权益,金融监管总局制定《银行保险机构数据安全管理办法》(以下简称《办法》)。《办法》强调了数据分类分级与安全管理的重要性,而身份数据作为最具…

IDEA 2024.3.1.1完整的安装教程(激活至2099年,以及常见问题处理)

卸载老版本 IDEA 首先,如果小伙伴的电脑上有安装老版本的 IDEA , 需要将其彻底卸载掉,如下所示(没有安装则不用管,直接安装即可): TIP:如果你之前使用过本站提供的 激活到 2025 年版本脚本,需要执行对应卸载脚本 /适用2024版本/JetBrains 2023 最新全家桶/jetbra /scrip…