[抓紧小长假的尾巴] 分析一个KeyFileMe
系统 : 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的更多相关文章
- 从零开始的程序逆向之路基础篇 第二章——用OllyDbg(OD)分析一个简单的软件
作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43469-1-1.html 0x00知识回顾 (由于笔者省事,没开XP虚拟机,而且没关闭A ...
- 微信小程序应用安全分析及设计
针对微信关于小程序安全设计的分析 针对微信小程序开发配置及部分配置机制分析微信小程序安全设计: AppSecret 管理员生成AppSecret,在与微信后台交互过程中部分接口使用,如 auth.co ...
- 微信小程序开发常见问题分析
距离微信小程序内测版发布已经有十几天的时间了,网上对微信小程序的讨论也异常火爆,从发布到现在微信小程序一直占领着各种技术论坛的头条,当然各种平台也对微信小程序有新闻报道,毕竟腾讯在国内影响力还是很大的 ...
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
小易邀请你玩一个数字游戏,小易给你一系列的整数.你们俩使用这些整数玩游戏.每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字. 例如: 如果{2,1,2 ...
- 分析一个socket通信: server/client
分析一个socket通信: server/client1 server 1. 创建一个server_socket文件,并绑定端口,然后监听端口 (socket, bind, listen) 2. 查询 ...
- C#应用编程小例子-03-展示另一个窗体
C#应用编程小例子-03-展示另一个窗体 using System; using System.Collections.Generic; using System.ComponentModel; us ...
- 分析一个MySQL并发事务示例
小结: 1. https://mp.weixin.qq.com/s/hdDl95a6ayVtCoEc3RiLwQ 分析一个MySQL并发事务示例 性能与架构 1月12日 MySQL实战45讲 从原 ...
- 在Linux下,如何分析一个程序达到性能瓶颈的原因
0.在Linux下,如何分析一个程序达到性能瓶颈的原因,请分别从CPU.内存.IO.网络的角度判断是谁导致的瓶颈?注意现在的机器CPU是多核 1.用sar -n DEV 1 10 2.用iotop命令 ...
- 实验作业:使gdb跟踪分析一个系统调用内核函数
实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ...
随机推荐
- React学习系列一
系列学习react 翻译地址 https://scotch.io/tutorials/learning-react-getting-started-and-concepts 我是初学者,英语也不是很好 ...
- Mongodb 副本集分片(二)---mongodb副本集部署脚本详解
分享下,最近做的一主一从一仲裁的示例,如有需要,大家可以扩展成一主两从一仲裁. 大家可以看到 我的集群名字沿用了默认的neunnm,如果是其他的话 大家注意修改. 需要辅助文件hosts.con ...
- (转)如何用Maven创建web项目(具体步骤)
原文链接:http://blog.csdn.net/chuyuqing/article/details/28879477 使用eclipse插件创建一个web project 首先创建一个Maven的 ...
- 关于WPF程序启动性能
项目里WPF的启动时间太久(>1分钟),显然是不能接受的.超过10秒,连Loading的等待框都会让用户感到厌烦. 1. 症状 项目的结构是1个WPF主进程,启动3个WPF子进程.子进程在启动时 ...
- Eclipse中怎么安装TestNG单元测试框架
在进行使用的eclipse的进行开发的代码中,必然就会需要进行单元测试,在单元测试的情况提供较多的框架单元测试,例如使用junit单元测试,而在国外进行开发较好的单元测试,提供了较好的测试的报告,ju ...
- TCP、UDP、RTP(RTCP)异同与区别
OSI七层模型OSI 中的层 功能 TCP/IP协议族 应 用层 ...
- UIButtonTypeSystem backBarButtonItem
当UIButton是UIButtonTypeSystem类型时,改变UIButton的frame,系统会有一个动画改变效果,不想要这个效果,将类型改为UIButtonTypeCustom. backB ...
- 杭电ACM1004
Let the Balloon Rise Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...
- AX2012导Demo数据
看到这篇文章后http://www.cnblogs.com/duanshuiliu/archive/2012/07/18/2597645.html,为了大家的方便就分享下 关于AX2012的导Demo ...
- It will affect staff as well.
Premier Foods has reduced its number of suppliers dramatically in the last 12 months. In 2013 it mad ...