首页 > 编程语言 >Win32汇编学习笔记03.RadAsm和补丁

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

时间:2025-01-03 22:55:24浏览次数:1  
标签:03 mov Win32 eax RadAsm ebp edx ptr ecx

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, 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

作业

标签:03,mov,Win32,eax,RadAsm,ebp,edx,ptr,ecx
From: https://www.cnblogs.com/weiyuanzhang/p/18651107

相关文章

  • Diary - 2025.01.03
    今天简直是唐完了,糖糖。晚上想啥啥不会,看了题解还写不出来。我去我是不是没救了???今天的事没有办法,就鸽到明天去吧(。whk结束啦!!!看来pku还是挺良心的,有优异的还能直接打,太感动了!!!比较意外的是我居然去年pkusc也是优异,毕竟我觉得那场打的还是有点差的(。明天看起来是没有模......
  • 03-C++类和对象(中)
    一、初始化列表1.对象成员对象成员即一个类的对象作为另外一个类的成员。代码演示classA{private:inta;public:A(){a=0;cout<<"A的无参构造被调用"<<endl;}A(inta1){a=a1;cout<<"A......
  • 03-C++类和对象(上)
    一、类的概述1.类的引入类的封装:将数据和方法封装在一起,加以权限区分,用户只能通过公共方法访问私有数据。为什么要将数据和方法封装在一起呢,而且还要通过公共方法才能访问私有数据?C语言中数据和方法分开可能产生的问题://定义一个狗结构体structDog{charname[......
  • 高级java每日一道面试题-2025年01月03日-并发篇-什么是Callable和Future?
    如果有遗漏,评论区告诉我进行补充面试官:什么是Callable和Future?我回答:Callable定义与功能:Callable是Java5引入的一个接口,用于定义可并发执行的任务。它类似于Runnable接口,但提供了更多的功能。Callable可以在执行完成后返回结果,而Runnable无法返回任何结果。Call......
  • 高级java每日一道面试题-2025年01月03日-并发篇-索引是什么?
    如果有遗漏,评论区告诉我进行补充面试官:索引是什么?我回答:在Java高级面试中,“索引”这个概念可以涉及到多个方面,包括但不限于数据库中的索引、Java集合框架中的索引(如List接口)、以及某些数据结构或算法中的索引。为了提供一个详尽的解释,我们将从不同角度来探讨“......
  • 01.03 CW 模拟赛 T2. game
    思路先把赛时的思路搬一下你发现确定两个人的起始点,其实是可以确定\(\rm{Alice}\)的选点可能的,考虑写个代码验证一下具体的,就是分成两个弧,\(\rm{Alice}\)可以选择一个弧的优势(过半),然后其他的劣势感觉现在是猜结论,全靠感性,我也不知道怎么解释这个问题那么......
  • 25.01.03
    喜欢我\(O(n^2\log^2n)\)过\(2e5\)吗......
  • C++期末总复习last day 20250103
    内容主体来自于QJH先生,向其表示敬意。C++高级程序设计题目类型简述题(5题、25分)什么是数据抽象与封装?相比于过程抽象与封装,数据抽象与封装有什么好处?……(不用死记硬背)程序分析题(5题、40分)指出下面程序的错误和错误原因写出下面程序的运行结果。写出下面程序的运行......
  • CH32V203F6P6-TSSOP20测试之03---三种烧录方式
      CH32V203F6P6-TSSOP20支持三种下载方式:USB下载、串口下载(用串口2即8脚PA2为TX2接下载的RX,9脚PA3为RX2接下载的TX)和SWD两线下载。  CH32V203F6P6-TSSOP20的BOOT1内置接GND,而BOOT0外露,用户可以选择两种启动模式,因而支持USB下载和串口下载。接法可以选择下面两种方法的其......
  • 微机原理与接口技术——期末笔记 实验总结 侧重Win32汇编代码实现
    微机原理与接口技术声明:本篇文章是在复习期末考试的过程中根据教材与实验所总结的复习资料,参考书目为*《微机原理与接口技术(第2版)——Win汇编、接口及设备驱动》郭兰英赵祥模编著*。文章只重点总结了前两章、第五章、五大芯片、键盘、AD转换的具体代码示例。所有代码均来......