前言

做个简单的题目放松一下。

思路

直接分析即可。

分析

OK按钮点击事件

00427B65  |.  E8 26E2FEFF   call    00415D90                         ;  获取name保存到ebp-4
00427B6A  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
00427B6D  |.  E8 3EBCFDFF   call    004037B0                         ;  获取name长度
00427B72  |.  48            dec     eax                              ;  长度减一
00427B73  |.  7C 30         jl      short 00427BA5                   ;  判断长度是否大于1
00427B75  |.  8D55 FC       lea     edx, dword ptr [ebp-4]
00427B78  |.  8B83 EC010000 mov     eax, dword ptr [ebx+1EC]
00427B7E  |.  E8 0DE2FEFF   call    00415D90                         ;  获取key保存到ebp-4
00427B83  |.  8B45 FC       mov     eax, dword ptr [ebp-4]
00427B86  |.  50            push    eax
00427B87  |.  8D55 F8       lea     edx, dword ptr [ebp-8]
00427B8A  |.  8B83 DC010000 mov     eax, dword ptr [ebx+1DC]
00427B90  |.  E8 FBE1FEFF   call    00415D90                         ;  获取name保存到ebp-8
00427B95  |.  8B45 F8       mov     eax, dword ptr [ebp-8]
00427B98  |.  5A            pop     edx
00427B99  |.  E8 82FEFFFF   call    00427A20                         ;  验证函数
00427B9E  |.  3D 4E61BC00   cmp     eax, 0BC614E
00427BA3  |.  7D 1E         jge     short 00427BC3                   ;  关键跳

验证函数

00427A59  |.  E8 52BDFDFF   call    004037B0                         ;  返回name长度
00427A5E  |.  8BF0          mov     esi, eax
00427A60  |.  85F6          test    esi, esi
00427A62  |.  7E 3C         jle     short 00427AA0                   ;  长度小于等于0则跳转
00427A64  |.  B8 01000000   mov     eax, 1                           ;  eax = 1
00427A69  |>  8BD0          /mov     edx, eax                        ;  edx 保存计数器值
00427A6B  |.  8B4D FC       |mov     ecx, dword ptr [ebp-4]          ;  取name
00427A6E  |.  0FB64C11 FF   |movzx   ecx, byte ptr [ecx+edx-1]       ;  挨个取name字符
00427A73  |.  03D9          |add     ebx, ecx                        ;  ebx = ebx + ecx
00427A75  |.  71 05         |jno     short 00427A7C                  ;  不溢出跳转
00427A77  |.  E8 B4AFFDFF   |call    00402A30                        ;  只要小于0,就会乘-1,这里应该走不到
00427A7C  |>  C1E3 08       |shl     ebx, 8                          ;  左移8位
00427A7F  |.  8B0D 80884200 |mov     ecx, dword ptr [428880]         ;  eKH_1.004279FC
00427A85  |.  0FB65411 FF   |movzx   edx, byte ptr [ecx+edx-1]       ;  从固定字符串取出字符
00427A8A  |.  0BDA          |or      ebx, edx                        ;  ebx = ebx | edx
00427A8C  |.  85DB          |test    ebx, ebx
00427A8E  |.  7D 0C         |jge     short 00427A9C                  ;  大于等于0则跳转
00427A90  |.  6BD3 FF       |imul    edx, ebx, -1                    ;  edx = ecx * -1
00427A93  |.  71 05         |jno     short 00427A9A
00427A95  |.  E8 96AFFDFF   |call    00402A30
00427A9A  |>  8BDA          |mov     ebx, edx
00427A9C  |>  40            |inc     eax                             ;  指向下一个字符
00427A9D  |.  4E            |dec     esi                             ;  esi为0时结束循环
00427A9E  |.^ 75 C9         \jnz     short 00427A69
00427AA0  |>  81F3 78563412 xor     ebx, 12345678                    ;  ebx = ebx ^ 0x12345678
00427AA6  |.  8D55 F0       lea     edx, dword ptr [ebp-10]
00427AA9  |.  8BC3          mov     eax, ebx
00427AAB  |.  E8 44E9FDFF   call    004063F4                         ;  转成10进制保存到ebp-10中
00427AB0  |.  8B45 F0       mov     eax, dword ptr [ebp-10]
00427AB3  |.  E8 F8BCFDFF   call    004037B0                         ;  返回新字符串的长度
00427AB8  |.  8BF0          mov     esi, eax
00427ABA  |.  85F6          test    esi, esi
00427ABC  |.  7E 38         jle     short 00427AF6                   ;  判断新字符串长度是否小于等于0
00427ABE  |>  8BC3          /mov     eax, ebx                        ;  从ebx取出
00427AC0  |.  B9 0A000000   |mov     ecx, 0A
00427AC5  |.  99            |cdq
00427AC6  |.  F7F9          |idiv    ecx                             ;  除以10
00427AC8  |.  6215 3C7B4200 |bound   edx, qword ptr [427B3C]         ;  edx为除法余数
00427ACE  |.  8A92 84884200 |mov     dl, byte ptr [edx+428884]
00427AD4  |.  8D45 F0       |lea     eax, dword ptr [ebp-10]
00427AD7  |.  E8 FCBBFDFF   |call    004036D8                        ;  转成字符保存到ebp-10中
00427ADC  |.  8B55 F0       |mov     edx, dword ptr [ebp-10]
00427ADF  |.  8D45 F4       |lea     eax, dword ptr [ebp-C]
00427AE2  |.  E8 D1BCFDFF   |call    004037B8                        ;  连接字符串保存到ebp-C中
00427AE7  |.  8BC3          |mov     eax, ebx
00427AE9  |.  B9 0A000000   |mov     ecx, 0A
00427AEE  |.  99            |cdq
00427AEF  |.  F7F9          |idiv    ecx                             ;  除以10
00427AF1  |.  8BD8          |mov     ebx, eax                        ;  保存到ebx中
00427AF3  |.  4E            |dec     esi                             ;  计数器减一
00427AF4  |.^ 75 C8         \jnz     short 00427ABE
00427AF6  |>  8B45 F4       mov     eax, dword ptr [ebp-C]
00427AF9  |.  8B55 F8       mov     edx, dword ptr [ebp-8]
00427AFC  |.  E8 BFBDFDFF   call    004038C0                         ;  字符串比较函数

注册机代码

/*004279FC  4C 41 4E 4E 59 44 49 42 41 4E 44 49 4E 47 49 4E  LANNYDIBANDINGIN00427A0C  41 4E 41 4B 45 4B 48 59 41 4E 47 4E 47 45 4E 54  ANAKEKHYANGNGENT00427A1C  4F 54                                            OT
*//*00428884  4C 41 4E 4E 59 35 36 34 36 35 32 31 00           LANNY5646521.
*/#include<stdio.h>
int main()
{char* name;char* s="LANNYDIBANDINGINANAKEKHYANGNGENTOT";char* t="LANNY5646521";int len=0;unsigned int ebx=0;printf("name:");scanf("%[^\n]",name);if((len=strlen(name))<=0)return 0;for(int i=0;i<len;i++){ebx+=name[i];ebx<<=8;ebx|=s[i];if(ebx>=0x80000000)ebx*=-1;}ebx^=0x12345678;sprintf(name,"%d",ebx);len=strlen(name);printf("key:");for(int i=0;i<len;i++){printf("%c",t[ebx%10]);ebx/=10;}return 0;
}

CrackMe160 学习笔记 之 054相关推荐

  1. CrackMe160 学习笔记 之 023

    前言 这个程序需要我们写出注册机. 思路 没有注册按钮.说明是由定时器来判断输入的. 查看API. 找到获取name输入和获取key输入的函数. 在验证函数可以看到如下语句. 004012AE |&g ...

  2. CrackMe160 学习笔记 之 024

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

  3. CrackMe160 学习笔记 之 044

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

  4. CrackMe160 学习笔记 之 053

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

  5. 随笔——Docker学习笔记

    Docker学习笔记 一.Docker 安装 二.Docker常用命令 注意事项 1.删除容器 2.删除镜像 3.容器中命令 4.容器的生命周期 5.Dockerfile构建镜像 6.docker两个 ...

  6. 34.Oracle深度学习笔记——12C的AWR初步解读

    34.Oracle深度学习笔记--12C的AWR初步解读 关于AWR,蛤蟆也经常看.因为经常看别人给出的建议,很难有深刻体会.对此,计划花费几个晚上时间好好体会一把并记录下来.此处以单实例为例.列出目 ...

  7. Flash/Flex学习笔记(51):3维旋转与透视变换(PerspectiveProjection)

    Flash/Flex学习笔记(49):3D基础 里已经介绍了3D透视的基本原理,不过如果每次都要利用象该文中那样写一堆代码,估计很多人不喜欢,事实上AS3的DisplayObject类已经内置了z坐标 ...

  8. 《机器学习实战》学习笔记(七):利用AdaBoost 元算法提高分类性能

    欢迎关注WX公众号:[程序员管小亮] [机器学习]<机器学习实战>读书笔记及代码 总目录 https://blog.csdn.net/TeFuirnever/article/details ...

  9. MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01

    MySQL技术内幕-InnoDB存储引擎第2版-学习笔记-01 1. MySQL体系结构和存储引擎 1.1 定义数据库和实例 数据库database: 物理操作系统文件或其他形式文件类型的集合. 当使 ...

最新文章

  1. Exchange数据库无法装载的问题
  2. linux数据流重定向
  3. win32api.sendmessage模拟鼠标点击_安卓模拟器一键宏设置教程
  4. REST、RESTful 与 RESTful API
  5. 前端开发中的一些js小技巧
  6. (百万浏览量!)超详细MySQL安装及基本使用教程(史上最详细)
  7. python实现语音播放_用Python实现语音播报
  8. MySQL数据库创建用户root@%
  9. 从数据库读写RadioButtonList选中的值
  10. Oracle笔记:创建表空间、创建用户、授权
  11. 20155207实验2 Windows口令破解
  12. 网易考拉:已与雅诗兰黛各自撤销法院在诉案件
  13. DirectX 初始化DirectX(手写和红龙书里面的方式)
  14. UOS桌面操作系统专业版字体
  15. 对DSP的基本了解(一)--DSP是什么?
  16. linux中ftp禁止匿名,linux下禁止root和匿名用户登录ftp
  17. 如何设置或更改代理?这些方法你知道吗?
  18. html5ify插件,漂亮的jQuery对话框插件Dialogify
  19. 专注儿童编程,核桃编程招人啦~
  20. 网站服务器选择什么操作系统,网站服务器选择哪种操作系统比较好

热门文章

  1. 【数学】C019_LC_三锥形的表面积(减重叠面积)
  2. Unity中人物移动的几种方式
  3. MySQL表结构导出
  4. 数组类型参数传递问题:$.ajax传递数组的traditional参数传递必须true
  5. [DBT-11211] 当物理内存总量大于4GB时,不允许使用自动内存管理选项
  6. spring-session整合redis原理 排查失效原因
  7. 使用PyTorch实现对花朵的分类
  8. 均值归一化_数据归一化
  9. freeswitch实现监听、三方通话的两种方法
  10. 三本计算机专业考研能考985,2020考研:985院校真的难考吗?为什么三本院校的学生连试都不敢?...