CrackMe160 学习笔记 之 023
前言
这个程序需要我们写出注册机。
思路
没有注册按钮。说明是由定时器来判断输入的。
查看API。
找到获取name输入和获取key输入的函数。
在验证函数可以看到如下语句。
004012AE |> \A2 67314000 mov byte ptr [403167], al ; [403167] = al
004012B3 |. 83F8 10 cmp eax, 10 ; 得到的结果和0x10作比较
而当输入错误的值时,结果才为8。
猜测还有其他对al赋值的语句。搜索指令。
一共四条。全部满足就能注册成功了。
分析
接下来我是按顺序分析的。
第一处:获取name
00401069 . 6A 14 push 14 ; /Count = 14 (20.)
0040106B . 68 8C314000 push 0040318C ; |Buffer = Chafe_1.0040318C
00401070 . FF35 74314000 push dword ptr [403174] ; |hWnd = 0082033E (class='Edit',parent=008302CA)
00401076 . E8 7D040000 call <jmp.&USER32.GetWindowTextA> ; \返回值为name的长度
0040107B . B9 14000000 mov ecx, 14 ; ecx = 14
00401080 . 2BC8 sub ecx, eax ; ecx = ecx - eax
00401082 . 8DB8 8C314000 lea edi, dword ptr [eax+40318C] ; 0x40318C为name首地址,edi初始化为字符串结尾
00401088 > C607 00 mov byte ptr [edi], 0 ; 清零
0040108B . 47 inc edi ; edi 指向下一个字符
0040108C . 49 dec ecx ; 计数器减一
0040108D .^ 75 F9 jnz short 00401088
0040108F . 85C0 test eax, eax
00401091 . 74 10 je short 004010A3 ; name长度为0则跳转
00401093 . 8005 66314000>add byte ptr [403166], 4 ; 加4
0040109A . C605 68314000>mov byte ptr [403168], 0 ; 清零
004010A1 . EB 06 jmp short 004010A9
004010A3 > 8825 66314000 mov byte ptr [403166], ah
004010A9 > C9 leave
004010AA . C3 retn
第二处:获取key
00401475 . 6A 00 push 0 ; /IsSigned = FALSE
00401477 . 8D45 FC lea eax, dword ptr [ebp-4] ; |
0040147A . 50 push eax ; |pSuccess
0040147B . 6A 64 push 64 ; |ControlID = 64 (100.)
0040147D . FF35 70314000 push dword ptr [403170] ; |hWnd = 008302CA ('TEXme v1.0',class='TEXcls')
00401483 . E8 64000000 call <jmp.&USER32.GetDlgItemInt> ; \GetDlgItemInt
00401488 . A3 88314000 mov dword ptr [403188], eax ; 返回输入的序列号int值
0040148D . 837D FC 00 cmp dword ptr [ebp-4], 0
00401491 . 74 07 je short 0040149A
00401493 . 8005 66314000>add byte ptr [403166], 4
0040149A > C9 leave
0040149B . C3 retn
第三处:循环计算
00401361 . 8D3D 8C314000 lea edi, dword ptr [40318C] ; 取输入name的地址
00401367 . 0FBE05 683140>movsx eax, byte ptr [403168] ; 计数器的值赋给eax
0040136E . 03F8 add edi, eax
00401370 . FE05 68314000 inc byte ptr [403168] ; 计数器加一
00401376 . A1 88314000 mov eax, dword ptr [403188] ; 取出序列号的int值放入eax中
0040137B . 8B25 A0314000 mov esp, dword ptr [4031A0]
00401381 . 40 inc eax ; eax = eax + 1
00401382 . FF05 88314000 inc dword ptr [403188] ; 序列号int值加一
00401388 . 3307 xor eax, dword ptr [edi] ; 做异或操作
0040138A . A3 88314000 mov dword ptr [403188], eax ; 用异或后新的值覆盖原来的int值
0040138F . 803D 68314000>cmp byte ptr [403168], 10 ; 计数器和0x10比较
00401396 . 75 07 jnz short 0040139F
00401398 . 8005 66314000>add byte ptr [403166], 4
0040139F > C9 leave
004013A0 . C3 retn
第四处:
0040149C . A1 88314000 mov eax, dword ptr [403188]
004014A1 . 05 78241109 add eax, 9112478
004014A6 . 85C0 test eax, eax ; 只有溢出才会为0
004014A8 . 75 09 jnz short 004014B3
004014AA . 8005 66314000>add byte ptr [403166], 4
004014B1 . EB 07 jmp short 004014BA
004014B3 > C605 66314000>mov byte ptr [403166], 0
004014BA > 8B25 A0314000 mov esp, dword ptr [4031A0]
004014C0 . C9 leave
004014C1 . C3 retn
验证函数
00401299 |. 0FBE05 663140>movsx eax, byte ptr [403166] ; 从[403166]取出eax
004012A0 |. 3A05 67314000 cmp al, byte ptr [403167]
004012A6 |. 75 06 jnz short 004012AE ; 不相等则跳转
004012AE |> \A2 67314000 mov byte ptr [403167], al ; [403167] = al
004012B3 |. 83F8 10 cmp eax, 10 ; 得到的结果和0x10作比较
004012B6 |. 74 16 je short 004012CE ; 关键跳
004012B8 |. 68 65304000 push 00403065 ; /Text = "Your serial is not valid."
004012BD |. FF35 7C314000 push dword ptr [40317C] ; |hWnd = 00090352 ('Your serial is not valid.',class='Edit',parent=008302CA)
004012C3 |. E8 66020000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
004012C8 |. 33C0 xor eax, eax
004012CA |. C9 leave
004012CB |. C2 1000 retn 10
004012CE |> 68 7F304000 push 0040307F ; /Text = "YES! You found your serial!!"
004012D3 |. FF35 7C314000 push dword ptr [40317C] ; |hWnd = 00090352 ('Your serial is not valid.',class='Edit',parent=008302CA)
004012D9 |. E8 50020000 call <jmp.&USER32.SetWindowTextA> ; \SetWindowTextA
004012DE |. 33C0 xor eax, eax
004012E0 |. C9 leave
004012E1 |. C2 1000 retn 10
其中,每一处都会走验证函数。
注册机代码
#include<stdio.h>
#include<limits.h>
#define real_v(x) (x)>len? (0):(name[x])
int main()
{char name[20];int count=0x10;int len=0;unsigned int key=UINT_MAX-0x9112478+1;printf("name:");scanf("%[^\n]",name);len=strlen(name);while(count>0){count--;key^=real_v(count)+(real_v(count+1)<<8)+(real_v(count+2)<<16)+(real_v(count+3)<<24);key--;//printf("key=%x %x\n",key,real_v(count)+(real_v(count+1)<<8)+(real_v(count+2)<<16)+(real_v(count+3)<<24));}printf("key=%u \n",key);return 0;
}
CrackMe160 学习笔记 之 023相关推荐
- CrackMe160 学习笔记 之 024
前言 这个程序和023是一个作者. 说实话,这个作者是真的牛逼,能用汇编写出这样的程序. 每次调他写的程序就很头疼. 然而我还是差不多只花了一天就写出了注册机. 思路 这个程序没有明显的字符串,搜索字 ...
- CrackMe160 学习笔记 之 044
前言 感觉这个题目中规中矩. 都是一些反汇编里常见的函数. 眼睛瞄一下就能看出来了. 思路 和计算出的字符串比较. 分析 看着这个跳转表,注册机写起来也没意义. 00421BAE |. E8 45FC ...
- CrackMe160 学习笔记 之 053
前言 这个题目花了两天还没做出来,其中写注册机的时候涉及了矩阵的运算. 这一块不是很熟,算来算去始终算不对,我裂开了. ] 感觉在这一块花太多的时间没有意义. 现在先存个档,以后等我研究透了线性代数再 ...
- CrackMe160 学习笔记 之 054
前言 做个简单的题目放松一下. 思路 直接分析即可. 分析 OK按钮点击事件 00427B65 |. E8 26E2FEFF call 00415D90 ; 获取name保存到ebp-4 00427B ...
- INTERVAL数据类型-007学习笔记
http://baggio785.itpub.net/post/31233/286119 INTERVAL数据类型用来存储两个时间戳之间的时间间隔. 可以指定years and months,或者da ...
- 学习笔记 mysql_MySQL 学习笔记
MySQL 学习笔记 1 定义 数据库中的表:一行叫一条记录.每一列叫一个属性,或一个字段. 主键:表中的某个特殊字段,具有唯一的确定的值,可以根据该字段唯一的确定一条记录 外键:表中的某个字段的值为 ...
- 学习笔记(五)——JavaScript(二)
文章目录 一.自定义对象 1.1.添加属性 1.2.读取属性 1.3.修改属性 1.4.删除属性 1.5.补充 二.函数对象 2.1.函数创建 2.2.注意事项 2.3.内置对象 三.数组对象 3.1 ...
- 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)
菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...
- linux系统管理学习笔记之八---linux文件与目录的管理及权限
linux系统管理学习笔记之八---linux文件与目录的管理及权限 2010-01-05 09:00:49 标签:权限 管理 文件目录 linx [推送到技术圈] 版权声明:原创作品,允许转载,转载 ...
最新文章
- (转载)深入浅出设计模式——桥接模式(Bridge Pattern)
- 14种东西帮你治疗口腔溃疡 - 生活至上,美容至尚!
- Protocol基本概念
- Linux vim剪切/删除命令(结合p粘贴使用就是剪切)
- linux 进sqlplus命令,linux下的sqlplus命令
- ファイルアップロード関連のjQueryプラグイン10攻略
- java定时器_拾遗Timer定时器
- php数组排序综合例子,php数组实例之数组排序
- 程序包androidx.appcompat.app不存在
- java创建线程的5种方法
- 在小写与大写之间加下划线
- Uni-App实现人脸识别功能
- CodeForces 372A Counting Kangaroos is Fun 动物PK
- django实现利用邮箱进行登录
- 如何学习(1):构建全栈式知识结构
- CF538H Summer Dichotomy
- MX_Player_Pro_专业精简版AC3/DTS/EAC3 By.SOLDIER-就要应用网91apps.cn
- Linux的10个彩蛋
- 服务器防护ddos攻击的几种方法
- SP4354 TWINSNOW - Snowflakes
热门文章
- 虚拟动力数字人技术亮相第六届文创产业大会,探见元宇宙 驱动新文创
- 图解推导爬楼梯(跳台阶)问题详细过程
- 爬取热榜数据,通过Qt界面显示,代码可直接运行(python3经典编程案例)
- YouTube营销活动方案
- 摸鱼一小时实现的斗牛Game【Java版】,希望各位友友远离赌博~
- 17期-什么是MySQL数据库?看这一篇干货文章就够了!
- 复合牛奶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- ios王者荣耀服务器维护31号,王者荣耀iOS还在维护怎么回事 3月31日王者荣耀IOS什么时候能上...
- 工业平板电脑选择需要注意的地方
- GoJS去除水印方法