Win32汇编学习笔记05

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

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

窗口程序看控件信息

1.通过OD去看

img

还可以用 spy ++ 查看

img

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

img

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

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

OD 没有查看资源的功能

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

COM注册机

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

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

  1. 寻找关键分支

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

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

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

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

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

xor     esi, esimov     dword ptr [esp+20], esi
L002:mov     ebp, dword ptr [463E48]or      ecx, FFFFFFFFmov     edi, ebpxor     eax, eaxrepne   scas byte ptr es:[edi]not     ecxdec     ecxmov     eax, esixor     edx, edxmov     edi, ebpdiv     ecxmov     ecx, dword ptr [esp+14]mov     eax, esimovsx   ebx, byte ptr [edx+ebp]xor     edx, edxdiv     ecxmovsx   eax, byte ptr [edx+469968]lea     edx, dword ptr [eax+eax*2]lea     eax, dword ptr [eax+edx*4]mov     edx, esiimul    edx, esiimul    edx, esiimul    edx, ecxadd     ebx, eaxor      ecx, FFFFFFFFxor     eax, eaxadd     ebx, edxrepne   scas byte ptr es:[edi]not     ecxdec     ecxmov     eax, ebxxor     edx, edxdiv     ecxlea     ecx, dword ptr [esp+10]mov     al, byte ptr [edx+ebp]push    eaxcall    0042F29Atest    esi, esije L050mov     eax, esixor     edx, edxmov     ecx, 3div     ecxtest    edx, edxjnz L050push    004640F8lea     ecx, dword ptr [esp+14]call    0042F273
L050:inc     esicmp     esi, 9jb L002

image.png

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

image.png

这几个寄存器是直接赋值,所以没有保存什么特殊的值,分析时可以不用管

跟我们输入字符串长度一样,所以猜测可能会是字符串长度

image.png

image.png

有点像是取字符串

image.png

取用户名

image.png

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

image.png

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

image.png

把执行后的结果拿去测试,看看是否成功没,如果成功后面就不需要看了,说明上面就是生成注册码的算法

 
.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

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年,勇敢探索,才能突破困境

新年第一篇文章,不聊技术,聊聊今年的计划,以及未来的发展趋势。 在24年的第一篇文章中,我用“苟住求活”这个词形容了我当时的判断,如今回过头再看2024年,大家都过的很挣扎。经济环境进一步恶化,就业机会越发的稀少,降本增效降薪裁员,是去年很多人的真实经历。 今年的…

Java集合 —— LinkedList详解(源码)

在学习LinkedList之前先来了解一下链表链表 概念链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序通过链表中的指针链接次序实现的图中的1、2、3、4、5都是结构体,称为结点;结构体包含所存的数据和下一结点的地址。顺序表中的地址是连续的,而链表中的…

菜单

扫雷菜单准备写一个基于C的扫雷游戏,这是第一篇,内容:扫雷的主菜单 思路 显示菜单->用户选择->判断用户选项 实现 显示菜单 首先在main函数内显示菜单,菜单显示部分实现在 MainMenu 函数内 int main(void) {while (true){int iChoose = -1;MainMenu();//加载菜单} } …

如何解决数据库扩容后宝塔面板显示旧容量的问题?

当您完成数据库扩容后,发现宝塔面板仍然显示旧的容量,这可能是由于系统未能及时刷新磁盘信息或配置文件未更新所致。为了确保宝塔面板正确显示新的磁盘容量,请参考以下详细步骤进行处理:确认磁盘扩容成功:首先,确保磁盘扩容操作已经成功完成。可以通过命令行工具如lsblk或…

20241312《计算机基础与程序设计》课程总结

20241312《计算机基础与程序设计》课程总结 第一周作业: 简要内容:①课程概论②工业革命与浪潮之巅③信息与信息安全④计算机系统概论⑤计算机安全⑥计算的限制⑦计算思维 二维码: 第三周作业: 简要内容:①数字分类与计数法 ②位置计数法③进制转换④模拟数据与数字数据⑤…

云服务器根目录扩容后磁盘空间未增加

问题描述: 我已经升级了云服务器的配置,但根目录的空间大小并未增加。请帮我检查并解决这个问题。 详情回答: 您好!感谢您使用我们的云服务器服务。根据您的描述,您已经升级了云服务器的配置,但根目录的空间大小并未增加。这种情况通常是由于磁盘挂载或分区设置不当引起的…

如何解决BT面板无法登录的问题?

当您遇到无法登录BT面板的情况时,可能是由多种原因引起的。以下是一些常见的排查步骤和解决方案,帮助您快速解决问题:检查用户名和密码:首先,确认您使用的用户名和密码是否正确。默认情况下,BT面板的登录用户名通常是 admin 或 cp,密码则是您在安装时设置的初始密码。如…

响应式设计进阶 - 修改网站手机版模板的实用方法与技巧

随着移动设备使用的增加,确保网站在小屏幕设备上有良好的用户体验变得至关重要。以下是关于如何修改网站手机版模板的一些基本指导和高级技巧:理解响应式设计理念响应式设计是一种使网页能够在不同设备上自适应的技术。它通过使用流式网格布局、弹性图片和媒体查询等手段,确…

Mingw64下载及各版本区别

地址:https://github.com/niXman/mingw-builds-binaries/releases 一般来说下这个就行

2025.1.5

Buy One, Get One Free 题解Buy One, Get One Free 题解One Last Kiss & Beautiful World 初めてのルーブルは なんてことはなかったわ 私だけのモナリザ もうとっくに出会ってたから 初めてあなたを見た あの日動き出した歯車 止められない喪失の予感 もういっぱいあるけれ…

如何删除不必要的DNS记录?

用户在管理域名解析时,遇到了一些不再需要的DNS记录,如TXT记录或CNAME记录,不确定是否可以删除这些记录。用户希望了解如何安全地删除这些记录,以及删除后是否会影响现有服务。 解决方案:问题 解决方案删除不必要的DNS记录 在确认不再需要特定DNS记录后,可以直接在域名解…

如何解决网站无法打开的问题

用户反馈其网站无法正常访问,具体表现为浏览器提示错误信息或页面加载失败。用户尝试了清除缓存、更换浏览器等操作,但问题依旧存在。 解决方案: 当遇到网站无法打开的情况时,首先需要确认是服务器端问题还是客户端问题。以下是详细的排查步骤:检查域名解析:确保域名正确…