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

Win32汇编学习笔记03.RadAsm和补丁-C/C++基础-断点社区-专业的老牌游戏安全技术交流社区 - BpSend.net

扫雷游戏啊下补丁

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

img

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

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, 1
  mov     dword ptr [ebp-20], edx
  mov     eax, dword ptr [ebp-20]
  cmp     eax, dword ptr [ebp-1C]
  jge     short 0040161A
  mov     ecx, dword ptr [ebp-20]
  push    ecx
  lea     ecx, dword ptr [ebp-14]
  call    00401900
  movsx   edx, al
  mov     eax, dword ptr [ebp-10]
  add     eax, edx
  mov     dword ptr [ebp-10], eax
  mov     ecx, dword ptr [ebp-20]
  shl     ecx, 8
  mov     edx, dword ptr [ebp-10]
  xor     edx, ecx
  mov     dword ptr [ebp-10], edx
  mov     eax, dword ptr [ebp-20]
  add     eax, 1
  mov     ecx, dword ptr [ebp-1C]
  imul    ecx, dword ptr [ebp-20]
  not     ecx
  imul    eax, ecx
  mov     edx, dword ptr [ebp-10]
  imul    edx, eax
  mov     dword ptr [ebp-10], edx
  jmp 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, 1
  mov     dword ptr [ebp-20], edx
  mov     eax, dword ptr [ebp-20]
  cmp     eax, dword ptr [ebp-1C]
  jge     short 0040161A
  mov     ecx, dword ptr [ebp-20]
  push    ecx
  lea     ecx, dword ptr [ebp-14]
  call    00401900
  movsx   edx, al
  mov     eax, dword ptr [ebp-10]
  add     eax, edx
  mov     dword ptr [ebp-10], eax
  mov     ecx, dword ptr [ebp-20]
  shl     ecx, 8
  mov     edx, dword ptr [ebp-10]
  xor     edx, ecx
  mov     dword ptr [ebp-10], edx
  mov     eax, dword ptr [ebp-20]
  add     eax, 1
  mov     ecx, dword ptr [ebp-1C]
  imul    ecx, dword ptr [ebp-20]
  not     ecx
  imul    eax, ecx
  mov     edx, dword ptr [ebp-10]
  imul    edx, eax
  mov     dword ptr [ebp-10], edx
  jmp 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 sensitive

include Regist.inc

.data
  g_szUserName  db 50 dup(0)  ;用户名  
  g_szSerial    db 50 dup(0)  ;注册码
  g_szFmt       db "%lu" ,0   ;格式化字符串

.code

start:

	invoke GetModuleHandle,NULL
	mov		hInstance,eax

    invoke InitCommonControls
	invoke DialogBoxParam,hInstance,IDD_DIALOG1,NULL,addr DlgProc,NULL
	invoke ExitProcess,0

;########################################################################
Make  proc   hWin:HWND    ;加密
    LOCAL  @dwIdx:DWORD
    LOCAL  @dwCnt:DWORD
    LOCAL  @dwEdp_10:DWORD
    LOCAL  @dwEdp_14:DWORD
   
    ;回去文本输入的值
   invoke GetDlgItemText,hWin,EDT_USERNAME,offset g_szUserName,size g_szUserName  ;获取用户名内容
  
   
   mov  @dwCnt,eax
   mov  @dwIdx,0
  
   mov esi ,offset g_szUserName  
   mov @dwEdp_10,81276345H
   
   jmp  LSATART
 ;对用户名加密解密
 L000:
   mov     edx, @dwIdx
   add     edx, 1
   mov     @dwIdx, edx
   
LSATART:   
   mov     eax, @dwIdx
   cmp     eax, @dwCnt
   jge     LEND
   ;mov     ecx, @dwIdx
   ;push    ecx
   ;lea     ecx, dword ptr [ebp-14]
   ;call    00401900
   lodsb    ;上面四行作用
   movsx   edx, al
   mov     eax, @dwEdp_10
   add     eax, edx
   mov     @dwEdp_10, eax
   mov     ecx, @dwIdx
   shl     ecx, 8
   mov     edx, @dwEdp_10
   xor     edx, ecx
   mov     @dwEdp_10, edx
   mov     eax, @dwIdx
   add     eax, 1
   mov     ecx, dword ptr @dwCnt
   imul    ecx, @dwIdx
   not     ecx
   imul    eax, ecx
   mov     edx, @dwEdp_10
   imul    edx, eax
   mov     @dwEdp_10,edx
 jmp L000
 
 LEND: 
    ;格式化字符串
    invoke wsprintf,offset g_szSerial,offset g_szFmt,@dwEdp_10 
    ;显示到界面
    invoke SetDlgItemText,hWin,EDT_SERUNMBER,offset  g_szSerial  
 

Make endp


DlgProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM

	mov		eax,uMsg
	.if eax==WM_INITDIALOG

	.elseif eax==WM_COMMAND
	   mov eax,wParam
	   .if eax == BTN_MAKE
	      invoke Make,hWin
	   .endif

	.elseif eax==WM_CLOSE
		invoke EndDialog,hWin,0
	.else
		mov		eax,FALSE
		ret
	.endif
	mov		eax,TRUE
	ret

DlgProc endp

end 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, FFFFFFFF
  mov     edi, ebp
  xor     eax, eax
  repne   scas byte ptr es:[edi]
  not     ecx
  dec     ecx
  mov     eax, esi
  xor     edx, edx
  mov     edi, ebp
  div     ecx
  mov     ecx, dword ptr [esp+14]
  mov     eax, esi
  movsx   ebx, byte ptr [edx+ebp]
  xor     edx, edx
  div     ecx
  movsx   eax, byte ptr [edx+469968]
  lea     edx, dword ptr [eax+eax*2]
  lea     eax, dword ptr [eax+edx*4]
  mov     edx, esi
  imul    edx, esi
  imul    edx, esi
  imul    edx, ecx
  add     ebx, eax
  or      ecx, FFFFFFFF
  xor     eax, eax
  add     ebx, edx
  repne   scas byte ptr es:[edi]
  not     ecx
  dec     ecx
  mov     eax, ebx
  xor     edx, edx
  div     ecx
  lea     ecx, dword ptr [esp+10]
  mov     al, byte ptr [edx+ebp]
  push    eax
  call    0042F29A
  test    esi, esi
  je L048
  mov     eax, esi
  xor     edx, edx
  mov     ecx, 3
  div     ecx
  test    edx, edx
  jnz L048
  push    004640F8
  lea     ecx, dword ptr [esp+14]
  call    0042F273
L048:
  inc     esi
  cmp     esi, 9
  jb L000

img

img

img

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入Android架构(从线程到AIDL)_08 认识Android的主线程

目录 3、 认识Android的主线程(又称UI线程) 复习: 各进程(Process)里的主线程​编辑 UI线程的责任: 迅速处理UI事件 举例 3、 认识Android的主线程(又称UI线程) 复习: 各进程(Process)里的主线程 UI线程的责任: 迅速处理UI事…

4.CSS文本属性

4.1文本颜色 div { color:red; } 属性值预定义的颜色值red、green、blue、pink十六进制#FF0000,#FF6600,#29D794RGB代码rgb(255,0,0)或rgb(100%,0%,0%) 4.2对齐文本 text-align 属性用于设置元素内文本内容的水平对齐方式。 div{ text-align:center; } 属性值解释left左对齐ri…

数据挖掘——支持向量机分类器

数据挖掘——支持向量机分类器 支持向量机最小间隔面推导基于软间隔的C-SVM非线性SVM与核变换常用核函数 支持向量机 根据统计学习理论,学习机器的实际风险由经验风险值和置信范围值两部分组成。而基于经验风险最小化准则的学习方法只强调了训练样本的经验风险最小…

慧集通iPaaS集成平台低代码培训-基础篇

训练使用素材: 1.数据源: 单号业务日期工厂仓库物料单位数量批次0100012022-5-1210031001030001kg500202304150100012022-5-1210031001030001kg122202304150100012022-5-1210031001030001kg1250202304150100012022-5-1210031001030002kg130202304110100…

深入理解计算机系统—虚拟内存(一)

一个系统中的进程是与其他进程共享 CPU 和主存资源的。然而,共享主存会形成特殊的挑战。随着对 CPU 需求的增长,进程以某种合理的平滑方式慢了下来。但是如果太多的进程需要太多的内存,那么它们中的一些就根本无法运行。 为了更加有效地管理内…

Unresolved plugin: ‘org.apache.maven.plugins:maven-site-plugin:3.12.1‘

问题 使用idea 社区办加载项目提示下面问题: Unresolved plugin: org.apache.maven.plugins:maven-site-plugin:3.12.1 问题解决 maven插件地址: https://maven.apache.org/plugins/maven-dependency-plugin/plugins.html Maven 中央仓库地址&#…

如何在 Windows 10/11 上录制带有音频的屏幕 [3 种简单方法]

无论您是在上在线课程还是参加在线会议,您都可能需要在 Windows 10/11 上录制带有音频的屏幕。互联网上提供了多种可选方法。在这里,本博客收集了 3 种最简单的方法来指导您如何在 Windows 10/11 上使用音频进行屏幕录制。请继续阅读以探索! …

spring中使用@Validated,什么是JSR 303数据校验,spring boot中怎么使用数据校验

文章目录 一、JSR 303后台数据校验1.1 什么是 JSR303?1.2 为什么使用 JSR 303? 二、Spring Boot 中使用数据校验2.1 基本注解校验2.1.1 使用步骤2.1.2 举例Valid注解全局统一异常处理 2.2 分组校验2.2.1 使用步骤2.2.2 举例Validated注解Validated和Vali…

AWS K8s 部署架构

Amazon Web Services(AWS)提供了一种简化的Kubernetes(K8s)部署架构,使得在云环境中管理和扩展容器化应用变得更加容易。这个架构的核心是AWS EKS(Elastic Kubernetes Service),它是…

设计模式 结构型 适配器模式(Adapter Pattern)与 常见技术框架应用 解析

适配器模式(Adapter Pattern)是一种结构型设计模式,它允许将一个类的接口转换成客户端所期望的另一个接口,从而使原本因接口不兼容而无法一起工作的类能够协同工作。这种设计模式在软件开发中非常有用,尤其是在需要集成…

MCU芯片是什么意思_有哪些作用?

MCU(Microcontroller Unit)芯片,即微控制单元,是一种集成了中央处理器(CPU)、存储器(ROM、RAM)以及各种外设接口(如输入输出引脚、定时器、串口等)的集成电路芯片。它通过超大规模集成电路技术,将具有数据处理能力的中央处理器、随机存储器、…

如何免费解锁 IPhone 网络

您是否担心 iPhone 上的网络锁定?如果您的 iPhone 被锁定到特定运营商,解锁它可以连接到不同的运营商。好吧,我们为您准备了一份指南。 iPhone运营商免费解锁将是小菜一碟。在我们的解锁运营商 iphone 免费指南中。我们为您提供了一份简介&am…

Spring Security(maven项目) 3.0.2.4版本

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

计算机的错误计算(二百)

摘要 用三个大模型计算 exp(123.456). 结果保留10位有效数字。三个大模型的输出均是错误的,虽然其中一个给出了正确的 Python代码。 例1. 计算 exp(123.456). 保留10位有效数字。 下面是与第一个大模型的对话。 以上为与一个大模型的对话。 下面是与另外一个大模…

Golang的缓存一致性策略

Golang的缓存一致性策略 一致性哈希算法 在Golang中,缓存一致性策略通常使用一致性哈希算法来实现。一致性哈希算法能够有效地解决缓存节点的动态扩容、缩容时数据重新分布的问题,同时能够保证数据访问的均衡性。 一致性哈希算法的核心思想是将节点的哈希…

.e01, ..., .e0n的分卷压缩包怎么解压

用BandiZip,这些分卷压缩中还有一个.exe的文件,这个不是可执行文件,是一个解压缩的开头。 安装好bandiZip后,右键这个.exe文件 点击打开就是开始解压了: 最后解压后是这些。然后一个个再次解压.

微机接口课设——基于Proteus和8086的打地鼠设计(8255、8253、8259)Proteus中Unknown 1-byte opcode / Unknown 2-byte opcode错误

原理图设计 汇编代码 ; I/O 端口地址定义 IOY0 EQU 0600H IOY1 EQU 0640H IOY2 EQU 0680HMY8255_A EQU IOY000H*2 ; 8255 A 口端口地址 MY8255_B EQU IOY001H*2 ; 8255 B 口端口地址 MY8255_C EQU IOY002H*2 ; 8255 C 口端口地址 MY8255_MODE EQU IOY003H*2 ; …

密码学精简版

密码学是数学上的一个分支,同时也是计算机安全方向上很重要的一个原理,设置密码的目的是保证信息的机密性、完整性和不可抵赖性,安全方向上另外的功能——可用性则无法保证。 密码的发展也已由来已久,最早的密码可追溯到罗马时期…

在 macOS 上,你可以使用系统自带的 终端(Terminal) 工具,通过 SSH 协议远程连接服务器

文章目录 1. 打开终端2. 使用 SSH 命令连接服务器3. 输入密码4. 连接成功5. 使用密钥登录(可选)6. 退出 SSH 连接7. 其他常用 SSH 选项8. 常见问题排查问题 1:连接超时问题 2:权限被拒绝(Permission denied&#xff09…

【书籍连载】《软件测试架构实践与精准测试》| 有关软件测试模型的调查结果

各位软件领域的精英们,今天小编邀请你继续深入学习《软件测试架构实践与精准测试》。 《软件测试架构实践与精准测试》是作者李龙(安畅检测首席技术专家)基于软件测试“川模型”的著作。本书结合作者首次提出的软件测试新的模型“川模型”测试…