前言

这个程序需要我们写出注册机。

思路

没有注册按钮。说明是由定时器来判断输入的。

查看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相关推荐

  1. CrackMe160 学习笔记 之 024

    前言 这个程序和023是一个作者. 说实话,这个作者是真的牛逼,能用汇编写出这样的程序. 每次调他写的程序就很头疼. 然而我还是差不多只花了一天就写出了注册机. 思路 这个程序没有明显的字符串,搜索字 ...

  2. CrackMe160 学习笔记 之 044

    前言 感觉这个题目中规中矩. 都是一些反汇编里常见的函数. 眼睛瞄一下就能看出来了. 思路 和计算出的字符串比较. 分析 看着这个跳转表,注册机写起来也没意义. 00421BAE |. E8 45FC ...

  3. CrackMe160 学习笔记 之 053

    前言 这个题目花了两天还没做出来,其中写注册机的时候涉及了矩阵的运算. 这一块不是很熟,算来算去始终算不对,我裂开了. ] 感觉在这一块花太多的时间没有意义. 现在先存个档,以后等我研究透了线性代数再 ...

  4. CrackMe160 学习笔记 之 054

    前言 做个简单的题目放松一下. 思路 直接分析即可. 分析 OK按钮点击事件 00427B65 |. E8 26E2FEFF call 00415D90 ; 获取name保存到ebp-4 00427B ...

  5. INTERVAL数据类型-007学习笔记

    http://baggio785.itpub.net/post/31233/286119 INTERVAL数据类型用来存储两个时间戳之间的时间间隔. 可以指定years and months,或者da ...

  6. 学习笔记 mysql_MySQL 学习笔记

    MySQL 学习笔记 1 定义 数据库中的表:一行叫一条记录.每一列叫一个属性,或一个字段. 主键:表中的某个特殊字段,具有唯一的确定的值,可以根据该字段唯一的确定一条记录 外键:表中的某个字段的值为 ...

  7. 学习笔记(五)——JavaScript(二)

    文章目录 一.自定义对象 1.1.添加属性 1.2.读取属性 1.3.修改属性 1.4.删除属性 1.5.补充 二.函数对象 2.1.函数创建 2.2.注意事项 2.3.内置对象 三.数组对象 3.1 ...

  8. 菜鸟学习笔记:Java基础篇7(包装类、时间相关类、文件类、异常处理类)

    菜鸟学习笔记:Java其他常用类 基本数据类型包装类 时间处理和文件处理相关类 Date时间类 SimpleDateFormat Calendar日历类 文件类 异常机制 异常的概念 Java异常处理 ...

  9. linux系统管理学习笔记之八---linux文件与目录的管理及权限

    linux系统管理学习笔记之八---linux文件与目录的管理及权限 2010-01-05 09:00:49 标签:权限 管理 文件目录 linx [推送到技术圈] 版权声明:原创作品,允许转载,转载 ...

最新文章

  1. (转载)深入浅出设计模式——桥接模式(Bridge Pattern)
  2. 14种东西帮你治疗口腔溃疡 - 生活至上,美容至尚!
  3. Protocol基本概念
  4. Linux vim剪切/删除命令(结合p粘贴使用就是剪切)
  5. linux 进sqlplus命令,linux下的sqlplus命令
  6. ファイルアップロード関連のjQueryプラグイン10攻略
  7. java定时器_拾遗Timer定时器
  8. php数组排序综合例子,php数组实例之数组排序
  9. 程序包androidx.appcompat.app不存在
  10. java创建线程的5种方法
  11. 在小写与大写之间加下划线
  12. Uni-App实现人脸识别功能
  13. CodeForces 372A Counting Kangaroos is Fun 动物PK
  14. django实现利用邮箱进行登录
  15. 如何学习(1):构建全栈式知识结构
  16. CF538H Summer Dichotomy
  17. MX_Player_Pro_专业精简版AC3/DTS/EAC3 By.SOLDIER-就要应用网91apps.cn
  18. Linux的10个彩蛋
  19. 服务器防护ddos攻击的几种方法
  20. SP4354 TWINSNOW - Snowflakes

热门文章

  1. 虚拟动力数字人技术亮相第六届文创产业大会,探见元宇宙 驱动新文创
  2. 图解推导爬楼梯(跳台阶)问题详细过程
  3. 爬取热榜数据,通过Qt界面显示,代码可直接运行(python3经典编程案例)
  4. YouTube营销活动方案
  5. 摸鱼一小时实现的斗牛Game【Java版】,希望各位友友远离赌博~
  6. 17期-什么是MySQL数据库?看这一篇干货文章就够了!
  7. 复合牛奶的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  8. ios王者荣耀服务器维护31号,王者荣耀iOS还在维护怎么回事 3月31日王者荣耀IOS什么时候能上...
  9. 工业平板电脑选择需要注意的地方
  10. GoJS去除水印方法