Win32汇编学习笔记05
定位关键点3种方法: 过程函数 api 字符串
但是不确定用要哪一种方法,可以3种方法都用一下,因为在不同的程序,实用的方法是不一样的
窗口程序看控件信息
1.通过OD去看

还可以用 spy ++ 查看

还可以用vs2019 ,打开软件,找到对应控件直接看属性

一般拿句柄没用,因为按钮是响应 WM_COMMAND 消息,因此需要知道控件id
可以修改控件属性的软件: eXeScope Restorato
OD 没有查看资源的功能
OD没有通过控件ID下断点功能 ,可在在 WM_COMMAND 消息 下条件断点
COM注册机
- 第一件事情就是定位关键点
关键点一般还是看它弹得什么窗扣,然后通过窗口上的字符串取OD查找字符串,找到字符串后下断点,运行程序,看看有没有断下来
- 寻找关键分支
找到关键点后,找到函数开头,然后看一下所有条件跳转,因为肯定存在校验后的失败和成功跳转,在所有跳转下断点后,重新运行软件,看看失败后执行那些分支执行了跳转,没执行的 就说明不是
- 查看关键分支最近的 call ,因此这个 调用校验算法 一般是通过调用函数 实现的
可以通过删除该段代码,看看程序是否提示失败,如果没有就说明该出是调用校验算法,验证完就撤销修改
- 校验算法一般移位和算术运算用的很多
找到关键代码复制出来,然后去分析算法,分析算法主中函数的功能传入和传出,即参数和返回值,猜出其大概作用,然后用自己的代码去替换
xor esi, esi
mov dword ptr [esp+20], esi
L002:
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 L050
mov eax, esi
xor edx, edx
mov ecx, 3
div ecx
test edx, edx
jnz L050
push 004640F8
lea ecx, dword ptr [esp+14]
call 0042F273
L050:
inc esi
cmp esi, 9
jb L002

说明存在一个全局的字符传 "0123456789"

这几个寄存器是直接赋值,所以没有保存什么特殊的值,分析时可以不用管
跟我们输入字符串长度一样,所以猜测可能会是字符串长度


有点像是取字符串

取用户名

观察call执行前后的变化,发现他在拼接字符

观察此处 call 发现他在拼接 '-'

把执行后的结果拿去测试,看看是否成功没,如果成功后面就不需要看了,说明上面就是生成注册码的算法
.386 .model flat, stdcall ;32 bit memory model option casemap :none ;case sensitive include Register.inc .data g_szUserName db 128 dup(0) g_szNumber db "0123456789", 0 ;常量字符串 g_szSerNumb db "6769-", 32 dup(0) ;注册码 g_ch db 2 dup(0) ;拼接的字符 g_szGang db "-", 0 ;拼接的字符 g_dwCnt dd 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 uses esi ecx edi ebx hWin:HWND LOCAL @dwCnt:DWORD invoke GetDlgItemText, hWin, EDT_USERNAME, offset g_szUserName, size g_szUserName mov g_dwCnt, eax ;将字符串长度给 g_dwCnt ;算法解析开始 push ebp ;因为改变了 edp,所以需要先入栈 xor esi, esi L002: lea ebp, g_szNumber ;获取字符串地址 or ecx, 0FFFFFFFFh 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, g_dwCnt ;这里换全局变量是因为 ebp的值发生了改变 mov eax, esi movsx ebx, byte ptr [edx+ebp] xor edx, edx div ecx movsx eax, byte ptr [edx + offset g_szUserName] 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, 0FFFFFFFFh xor eax, eax add ebx, edx repne scas byte ptr es:[edi] not ecx dec ecx mov eax, ebx xor edx, edx div ecx mov al, byte ptr [edx+ebp] mov g_ch,al ;将 al转成字符串 invoke crt_strcat, offset g_szSerNumb, offset g_ch ;字符拼接 test esi, esi je L050 mov eax, esi xor edx, edx mov ecx, 3 div ecx test edx, edx jnz L050 invoke crt_strcat, offset g_szSerNumb, offset g_szGang ;拼接字符串 L050: inc esi cmp esi, 9 jb L002 pop ebp ;出栈 ;显示到界面 invoke SetDlgItemText,hWin, EDT_SERNUMBER, offset g_szSerNumb ret 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 ax == 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
注册成功删除 注册表重新注册 搜索 4Developers
Win32汇编学习笔记05的更多相关文章
- 汇编学习笔记(11)int指令和端口
格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...
- Win32汇编学习(4):绘制文本
这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...
- 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归
机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...
- C++ GUI Qt4学习笔记05
C++ GUI Qt4学习笔记05 qtc++正则表达式 QIntValidator -- 只让用户输入整数 QDoubleValidator -- 只让用户输入浮 ...
- 汇编学习笔记(3)[bx]和loop
本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...
- Win32汇编学习(5):绘制文本2
这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...
- Win32汇编学习(1):基本概念
背景知识 Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而 ...
- 罗云彬win32汇编教程笔记 子函数的声明, 定义与调用
在主程序中用call指令来调用子程序. Win32汇编中的子程序也采用堆栈来传递参数,这样就可以用invoke伪指令来进行调用和语法检查工作. 一. 子程序的定义 子程序的定义方式如下所示. 子程序名 ...
- [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明
作用域访问权限: 程序实体访问权限(作用域)有三种:1. 包级私有(代码包)2. 模块级私有(代码包)3. 公开(全域). 一个函数是一个代码块.一个程序实体的作用域总是会被限制在某个代码块中.好处: ...
- stm32寄存器版学习笔记05 PWM
STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...
随机推荐
- 读论文-基于序列模式的电子商务推荐系统综述(A Survey of Sequential Pattern Based E-Commerce Recommendation Systems)
前言 今天读的论文为一篇于2023年10月3日发表在<算法>(Algorithms)的论文,这篇文章综述了基于序列模式的电子商务推荐系统,强调了通过整合用户购买和点击行为的序列模式来提高推 ...
- WPF如何使用WebView,并且禁用F12和F5。
客户端套浏览器壳,是如今比较浏览的客户端客户端开发方式.这篇文字简单来介绍一下如何在WPF中使用WebView 安装WebView的nuget包 可以直接执行安装命令 Install-Package ...
- 【Abaqus】*Solid Section定义复合材料
*SOLID SECTION 介绍 *solid section 用来定义单元的材料属性,材料方向等信息: solid (continuum) elements infinite elements a ...
- Anaconda使用记录
1 安装 windows下,安装完添加环境变量(哦安装时勾选添加环境变量选项就是加这些变量的) ## (记anaconda软件目录为%ANACONDA3%) %ANACONDA3%\ %ANACOND ...
- 导出和导入word样式模板
对于自己配置过之后常用的word样式可以导出作为样式模板, 可以重复使用. 举例说一下哪些是常用的word样式, 例如: (常见的): 中文的内容的样式, 中英文分别设置不同的样式 (比较高级的)多级 ...
- Bringing machine 'default' up with 'virtualbox' provider... Your VM has become "inaccessible." Unfortunately, this is a critical error with VirtualBox that Vagrant can not cleanly recover from.
启动虚拟机报错 vagrant up Bringing machine 'default' up with 'virtualbox' provider...Your VM has become &qu ...
- PLSQL中查询数据的时候查询结果显示中文乱码
要需要很努力才能看起来毫不费力.....1.在PLSQL中查询数据的时候查询结果显示中文乱码这里写图片描述2.需要在环境变量中新建两个环境变量:第一个:设置 NLS_LANG=SIMPLIFIED C ...
- python-argparse用法简介
1. argparse介绍 argparse是Python标准库中用于解析命令行参数的模块.它提供了一种简洁而灵活的方式来处理命令行参数,包括选项(可选参数)和位置参数(必需参数) 2. argpar ...
- Open diary(每天更新)
.col-md-8 img { display: none } .comment img { display: unset } 这是一个open diary,就是公开日记. 为什么标题用英文呢?因为觉 ...
- 【Linux】3.7 定时任务调度
3.7定时任务调度 1. 任务调度原理 crond任务调度:crontab进行定时任务调度 使用方法:crontab [选项] crontab [选项] -e:编辑crontab定时任务 -i:查询c ...