系统 : Windows xp

程序 : keyfileme

程序下载地址 :http://pan.baidu.com/s/1qYVfvu0

要求 : 编写KeyFile

使用工具 : OD

可在看雪论坛中查找关于此程序的破文:传送门

趁着小长假还没结束,赶紧来个CM暖暖手。废话不多说,直接用DIE查看程序。

提示MASM编写,没有保护壳。

再用OD载入,发现关键子串:no keyfile found!

0040113E   .  E8 F0010000   call
. 803D 2C604000>cmp byte ptr [40602C],
0040114A . je short 0040116C
0040114C . 803D 2C604000>cmp byte ptr [40602C],
. 2C je short
. 803D 2C604000>cmp byte ptr [40602C],
0040115C . je short
0040115E . 803D 2C604000>cmp byte ptr [40602C],
. je short 004011AB
. E9 C1010000 jmp 0040132D
0040116C > push ; /no keyfile found!
. FF35 push dword ptr [] ; |hWnd = NULL
. E8 5A030000 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA
0040117C . E9 AC010000 jmp 0040132D
> push ; /wrong size!
. FF35 push dword ptr [] ; |hWnd = NULL
0040118C . E8 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA
. E9 jmp 0040132D
> 6F624000 push 0040626F ; /invalid keyfile!
0040119B . FF35 push dword ptr [] ; |hWnd = NULL
004011A1 . E8 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA
004011A6 . E9 jmp 0040132D
004011AB > push ; /registered! good job!
004011B0 . FF35 push dword ptr [] ; |hWnd = NULL
004011B6 . E8 1B030000 call <jmp.&user32.SetWindowTextA> ; \SetWindowTextA

可见结果是由Call直接产生,右击Call指令,选择Follow:

  /$  6A          push                                    ; /hTemplateFile = NULL
|. push ; |Attributes = NORMAL
0040133A |. 6A push ; |Mode = OPEN_EXISTING
0040133C |. 6A push ; |pSecurity = NULL
0040133E |. 6A push ; |ShareMode = FILE_SHARE_READ
|. push ; |Access = GENERIC_READ
|. push ; |keyfile.dat
0040134A |. E8 call <jmp.&kernel32.CreateFileA> ; \CreateFileA
0040134F |. A3 mov dword ptr [], eax
|. 83F8 FF cmp eax, -
|. 0F84 DB000000 je
0040135D |. 6A push ; /pFileSizeHigh = NULL
0040135F |. FF35 push dword ptr [] ; |hFile = NULL
|. E8 8A010000 call <jmp.&kernel32.GetFileSize> ; \GetFileSize
0040136A |. 83F8 cmp eax, ; 长度一定要是32个字符
0040136D |. 0F85 CE000000 jnz ; ↓读取前十六个字符
|. 6A push ; /pOverlapped = NULL
|. push ; |pBytesRead = keyfilem.00406348
0040137A |. 6A push ; |BytesToRead = 10 (16.)
0040137C |. 3E604000 push 0040603E ; |Buffer = keyfilem.0040603E
|. FF35 push dword ptr [] ; |hFile = NULL
|. E8 call <jmp.&kernel32.ReadFile> ; \ReadFile
0040138C |. FF35 push dword ptr [] ; /hObject = NULL
|. E8 call <jmp.&kernel32.CloseHandle> ; \CloseHandle
|. 33C9 xor ecx, ecx
|. 33D2 xor edx, edx
0040139B |. BA 0F000000 mov edx, 0F
004013A0 |> 0FBE8A 3E6040>/movsx ecx, byte ptr [edx+40603E] ; 循环迭代字符串
004013A7 |. 4A |dec edx
004013A8 |. 83F9 |cmp ecx, ; 是否是空格?
004013AB |. |jnz short 004013B6 ; 发现不是空格则跳转
004013AD |. C682 3F604000>|mov byte ptr [edx+40603F],
004013B4 |.^ EB EA \jmp short 004013A0
004013B6 |> E9 A1000000 jmp 0040145C
004013BB |> 6A push ; /hTemplateFile = NULL
004013BD |. push ; |Attributes = NORMAL
004013C2 |. 6A push ; |Mode = OPEN_EXISTING
004013C4 |. 6A push ; |pSecurity = NULL
004013C6 |. 6A push ; |ShareMode = FILE_SHARE_READ
004013C8 |. push ; |Access = GENERIC_READ
004013CD |. push ; |keyfile.dat
004013D2 |. E8 0B010000 call <jmp.&kernel32.CreateFileA> ; \CreateFileA
004013D7 |. A3 mov dword ptr [], eax ; ↓读取文件后半部分
004013DC |. A7624000 push 004062A7 ; /pOverlapped = keyfilem.004062A7
004013E1 |. push ; |pBytesRead = keyfilem.00406348
004013E6 |. 6A push ; |BytesToRead = 10 (16.)
004013E8 |. 4E604000 push 0040604E ; |Buffer = keyfilem.0040604E
004013ED |. FF35 push dword ptr [] ; |hFile = NULL
004013F3 |. E8 1A010000 call <jmp.&kernel32.ReadFile> ; \ReadFile
004013F8 |. FF35 push dword ptr [] ; /hObject = NULL
004013FE |. E8 D9000000 call <jmp.&kernel32.CloseHandle> ; \CloseHandle
|. 33C9 xor ecx, ecx
|. 33D2 xor edx, edx
|. BA 0F000000 mov edx, 0F
0040140C |> 0FBE8A 4E6040>/movsx ecx, byte ptr [edx+40604E] ; 把多余的空格部分去除
|. 4A |dec edx
|. 83F9 |cmp ecx,
|. |jnz short
|. C682 4F604000>|mov byte ptr [edx+40604F],
|.^ EB EA \jmp short 0040140C
|> push ; /String2 = ""
|. 4E604000 push 0040604E ; |String1 = ""
0040142C |. E8 ED000000 call <jmp.&kernel32.lstrcmpA> ; \lstrcmpA
|. 83F8 cmp eax,
|. 1D je short
|. jnz short 0040144A
|> C605 2C604000>mov byte ptr [40602C],
0040143F |. EB jmp short 004014A4
|> C605 2C604000>mov byte ptr [40602C],
|. EB 5A jmp short 004014A4
0040144A |> C605 2C604000>mov byte ptr [40602C],
|. EB jmp short 004014A4
|> C605 2C604000>mov byte ptr [40602C],
0040145A |. EB jmp short 004014A4
0040145C |> push ebx
0040145D |. push edi
0040145E |. 3E604000 push 0040603E ; /String = ""
|. E8 BC000000 call <jmp.&kernel32.lstrlenA> ; \lstrlenA
|. 8BD0 mov edx, eax
0040146A |. 33C9 xor ecx, ecx
0040146C |. 33DB xor ebx, ebx
0040146E |> 0FB681 3E6040>/movzx eax, byte ptr [ecx+40603E] ; 循环迭代字符串
|. 83C0 0F |add eax, 0F
|. 83F0 |xor eax,
0040147B |. 03D8 |add ebx, eax
0040147D |. |inc ecx ; 循环变量自增
0040147E |. 3BCA |cmp ecx, edx ; 是否遍历完毕?
|.^ EC \jnz short 0040146E
|. 33C9 xor ecx, ecx
|. 69DB 697A0000 imul ebx, ebx, 7A69
0040148A |. push ebx ; /<%X>
0040148B |. push ; |%x
|. push ; |s = keyfilem.00406287
|. E8 0C000000 call <jmp.&user32.wsprintfA> ; \wsprintfA
0040149A |. 83C4 0C add esp, 0C
0040149D |. 5F pop edi
0040149E |. 5B pop ebx
0040149F |.^ E9 17FFFFFF jmp 004013BB
004014A4 \> C3 retn

KeyFile长度必须为32,前面写着用户名,后面是密码。而CM的计算方式是简单的F(用户名) = 密码。

给出可用的KeyFIle内容:

DreamCracker    26F86D8         

运行效果:

[抓紧小长假的尾巴] 分析一个KeyFileMe的更多相关文章

  1. 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件

    作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...

  2. 微信小程序应用安全分析及设计

    针对微信关于小程序安全设计的分析 针对微信小程序开发配置及部分配置机制分析微信小程序安全设计: AppSecret 管理员生成AppSecret,在与微信后台交互过程中部分接口使用,如 auth.co ...

  3. 微信小程序开发常见问题分析

    距离微信小程序内测版发布已经有十几天的时间了,网上对微信小程序的讨论也异常火爆,从发布到现在微信小程序一直占领着各种技术论坛的头条,当然各种平台也对微信小程序有新闻报道,毕竟腾讯在国内影响力还是很大的 ...

  4. 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和

    小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...

  5. 分析一个socket通信: server/client

    分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...

  6. C#应用编程小例子-03-展示另一个窗体

    C#应用编程小例子-03-展示另一个窗体 using System; using System.Collections.Generic; using System.ComponentModel; us ...

  7. 分析一个MySQL并发事务示例

    小结: 1. https://mp.weixin.qq.com/s/hdDl95a6ayVtCoEc3RiLwQ 分析一个MySQL并发事务示例 性能与架构 1月12日   MySQL实战45讲 从原 ...

  8. 在Linux下,如何分析一个程序达到性能瓶颈的原因

    0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...

  9. 实验作业:使gdb跟踪分析一个系统调用内核函数

    实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ...

随机推荐

  1. 验证控件jQuery Validation Engine简单自定义正则表达式

    首先上控件的地址http://code.ciaoca.com/jquery/validation-engine/ 具体使用方式网站里说的很清楚,我写这篇文章主要是用于记录如何自己添加自定义正则表达式, ...

  2. Shell Script (2) - global.sh

    cd web/ui npm run e2e-dev -- -i 1 "should be able to add function with argument to a ingredient ...

  3. 如何更换centos6源

    1.wget http://mirrors.163.com/.help/CentOS6-Base-163.repo 2.根据教程:http://mirrors.163.com/.help/centos ...

  4. Linq to xml 小例

    static void Main(string[] args)        {            string strXml = @"<?xml version='1.0' en ...

  5. session_id 恢复 session的内容

    php的session是可以程序恢复的,这个和java不太一样.session的恢复机制可以实现多个应用程序session的共享,因为php的session都是以文件形式或者数据库存储的.首先是ses ...

  6. Flapper Bird的学习笔记(三)

    因为我有一个超屌的梦想,所以就绝不会做一个孬种的追梦人! 完成音效的添加 单例模式 游戏的状态切换 1. 单例模式 首先呢,说一下单例模式.何为单例?单例模式是一种常用的软件设计模式.在它的核心结构中 ...

  7. 【Python④】python恼人的字符串,格式化输出

    恼人的字符串 计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码 ...

  8. T-Shirt 估算法

    T-Shirt Size Estimation (2015-05-11 22:58:18) 转载▼     产出:产品经理会对每一条需求评估上业务影响力的尺寸,如:XXXL 影响一千万人以上或是可以占 ...

  9. html5移动web开发笔记(一)Web 存储

    localStorage - 没有时间限制的数据存储 localStorage 方法 localStorage 方法存储的数据没有时间限制.第二天.第二周或下一年之后,数据依然可用. 用户访问页面的次 ...

  10. 【初级】linux mkdir 命令详解及使用方法实战

    mkdir命令详解及使用方法实战 名称 MKDIR 是 make directories 的缩写 使用方法 mkdir [选项(如-p)] ...目录名称(及子目录注意用分隔符隔开)...    如使 ...