定位关键点3种方法: 过程函数 api 字符串

但是不确定用要哪一种方法,可以3种方法都用一下,因为在不同的程序,实用的方法是不一样的

窗口程序看控件信息

1.通过OD去看

还可以用 spy ++ 查看

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

一般拿句柄没用,因为按钮是响应 WM_COMMAND 消息,因此需要知道控件id

可以修改控件属性的软件: eXeScope Restorato

OD 没有查看资源的功能

OD没有通过控件ID下断点功能 ,可在在 WM_COMMAND 消息 下条件断点

COM注册机

  1. 第一件事情就是定位关键点

关键点一般还是看它弹得什么窗扣,然后通过窗口上的字符串取OD查找字符串,找到字符串后下断点,运行程序,看看有没有断下来

  1. 寻找关键分支

找到关键点后,找到函数开头,然后看一下所有条件跳转,因为肯定存在校验后的失败和成功跳转,在所有跳转下断点后,重新运行软件,看看失败后执行那些分支执行了跳转,没执行的 就说明不是

  1. 查看关键分支最近的 call ,因此这个 调用校验算法 一般是通过调用函数 实现的

可以通过删除该段代码,看看程序是否提示失败,如果没有就说明该出是调用校验算法,验证完就撤销修改

  1. 校验算法一般移位和算术运算用的很多

找到关键代码复制出来,然后去分析算法,分析算法主中函数的功能传入和传出,即参数和返回值,猜出其大概作用,然后用自己的代码去替换

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的更多相关文章

  1. 汇编学习笔记(11)int指令和端口

    格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...

  2. Win32汇编学习(4):绘制文本

    这次,我们将学习如何在窗口的客户区"绘制"字符串.我们还将学习关于"设备环境"的概念. 理论: "绘制"字符串 Windows 中的文本是一 ...

  3. 机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归

    机器学习实战(Machine Learning in Action)学习笔记————05.Logistic回归 关键字:Logistic回归.python.源码解析.测试作者:米仓山下时间:2018- ...

  4. C++ GUI Qt4学习笔记05

    C++ GUI Qt4学习笔记05   qtc++正则表达式 QIntValidator           --  只让用户输入整数 QDoubleValidator     --  只让用户输入浮 ...

  5. 汇编学习笔记(3)[bx]和loop

    本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...

  6. Win32汇编学习(5):绘制文本2

    这次我们将学习有关文本的诸多属性如字体和颜色等. 理论: Windows 的颜色系统是用RGB值来表示的,R 代表红色,G 代表绿色,B 代表蓝色.如果您想指定一种颜色就必须给该颜色赋相关的 RGB ...

  7. Win32汇编学习(1):基本概念

    背景知识 Windows 把每一个 Win32 应用程序放到分开的虚拟地址空间中去运行,也就是说每一个应用程序都拥有其相互独立的 4GB 地址空间,当然这倒不是说它们都拥有 4GB 的物理地址空间,而 ...

  8. 罗云彬win32汇编教程笔记 子函数的声明, 定义与调用

    在主程序中用call指令来调用子程序. Win32汇编中的子程序也采用堆栈来传递参数,这样就可以用invoke伪指令来进行调用和语法检查工作. 一. 子程序的定义 子程序的定义方式如下所示. 子程序名 ...

  9. [Golang学习笔记] 05 程序实体2 作用域访问权限和变量重声明

    作用域访问权限: 程序实体访问权限(作用域)有三种:1. 包级私有(代码包)2. 模块级私有(代码包)3. 公开(全域). 一个函数是一个代码块.一个程序实体的作用域总是会被限制在某个代码块中.好处: ...

  10. stm32寄存器版学习笔记05 PWM

    STM32除TIM6和TIM7外都可以产生PWM输出.高级定时器TIM1和TIM8可以同时产生7路PWM,通用定时器可以产生4路PWM输出. 1.TIM1 CH1输出PWM配置步骤 ①开启TIM1时钟 ...

随机推荐

  1. Zookeeper - 客户端常用命令

    查看客户端命令帮助信息 查看Zookeeper的版本 查看使用过的历史命令 查看根目录下的znode 创建znode 查看节点信息 修改znode的内容 删除znode 关闭连接 连接客户端 退出客户 ...

  2. Flink学习(十四) Flink 窗口、时间和水位线

    Flink 框架中支持事件时间.摄入时间和处理时间三种.而当我们在流式计算环境中数据从 Source 产生,再到转换和输出,这个过程由于网络和反压的原因会导致消息乱序.因此,需要有一个机制来解决这个问 ...

  3. Flink学习(九) Sink到Kafka

    package com.wyh.streamingApi.sink import java.util.Properties import org.apache.flink.api.common.ser ...

  4. 视频笔记软件JumpVideo技术解析一:Electron案例-调用VLC播放器

    大家好,我是TheGodOfKing,是 最强考研学习神器,免费视频笔记应用JumpVideo,可以快速添加截图时间戳,支持所有笔记软件,学习效率MAX!的开发者之一,分享技术的目的是想找到更多志同道 ...

  5. Golang 入门 : 浮点数

    浮点数介绍 Go语言提供了两种精度的浮点数:float32 和 float64.它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持. 这些浮点数类型的范围可以从很微小 ...

  6. 同一局域网下,远程连接另一台电脑的Mysql数据库

    博客地址:https://www.cnblogs.com/zylyehuo/ 参考链接 同一局域网,远程连接别人的Mysql数据库 用电脑A去远程电脑B的数据库,那我们要先在电脑B上设置一下: ste ...

  7. Hack The Box-Chemistry靶机渗透

    通过信息收集访问5000端口,cif历史cve漏洞反弹shell,获取数据库,利用低权限用户登录,监听端口,开放8080端口,aihttp服务漏洞文件包含,获取root密码hash值,ssh指定登录 ...

  8. 适配器设计模式--java进阶day03

    1.设计模式 通俗来讲,设计模式就是其他程序员遇到某些问题时的解决经验,我们学习设计模式,在遇到了同样的问题后便可解决 2.适配器设计模式 有人可能会感到疑惑,接口和实现类会有什么问题,我们举两个例子 ...

  9. 快戳进来!PostgreSQL实战型系列文章来了!

    快戳进来!PostgreSQL实战型系列文章来了! Whoami:6年+金融.政府.医疗领域工作经验的DBA Certificate:PGCM.OCP.YCP Skill:Oracle.Mysql.P ...

  10. javaWeb之路径

    一. 路径写法: 1. 路径分类 a. 相对路径:通过相对路径不可以确定唯一资源 * 如:./index.html * 不以/开头,以.开头路径 * 规则:找到当前资源和目标资源之间的相对位置关系 * ...