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时钟 ...
随机推荐
- HDP集群部署
一.环境准备 centos7 安装和系统环境处理 1)运行初始化脚本 !/bin/bash ------------------------------------- 系统环境初始化脚本 本脚本仅支持 ...
- 异步编程——CompletableFuture详解
Future JDK5 新增了Future接口,用于描述一个异步计算的结果. 虽然 Future 以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,我们必须使用Future.g ...
- @SpringBootApplication自动配置原理
@EnableAutoConfiguration 是核心,他会调用一个@Import注解.我们已知Import自动配置得实现是通过创建ImportSelector 接口的实现类并重写里面selectI ...
- 【Pre】预习测试-Logisim/Verilog/MIPS
好家伙,开门挂 T2 字符自动机cscore 1.审题·惯性思维:直接输出了当前连续数,题目要求是最大连续数 -> [重新读题解决] 2.非阻塞赋值运用:若在always块内通过if(out1 ...
- 基于DotNetty实现自动发布 - 背景篇
故事背景 小公司,单体项目,接口和页面都在一起,生产和测试环境都是 Windows 服务器和 IIS, 本地编译完成,把相关的页面和程序集拷贝到服务器上,尤其是涉及到多个页面,一个个页面找到对应的位置 ...
- 【python-日期和时间处理】datetime模块基本使用
1. 获取datetime对象 获取当前datetime对象 方法:datetime.now(cls, tz=None) -> datetime 参数说明: tz:时区信息,不传该参数时,默认使 ...
- 阿里云ECS下安装的MySQL无法远程连接?
场景重现 在阿里云ECS下, Ubuntu系统上通过以下命令安装的MySQL数据库, 本地连接正常, 但远程死活连接不上. # 安装MySQL apt-get install mysql-server ...
- PDA自带有红外扫描头,不用点击焦点就能超高速超精准的扫条码、扫二维码
参考牛人DelphiTeacher的<PDA扫码?不要慌,只要20行代码!> 摘要: 实现监听器接口 然后在系统中注册该监听器,注册时指定只接收名称为com.kte.scan.result ...
- 无耳 Solon Ai MCP,发布工具服务,使用工具服务。效果预览!
solon-ai-mcp 是 solon-ai 的扩展特性.提供 mcp 协议的支持.通过它,可以方便的发布 Tool Service,方便的使用 Tool Service. 引入依赖包 <de ...
- Unity中检查重复的资源
目的:检查Unity中资源是否重复,例如有两张贴图,明明是一张,却被复制为两份放在工程中,名字或者所在目录位置不同,这对于资源管理来说是很浪费的.因此需要写一个检查工具来检查项目中是否存在重复的资源. ...