[抓紧小长假的尾巴] 分析一个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代码到最新版 ...
随机推荐
- CentOS_7.2安装Redis_3.0
一.安装依赖包和开发工具: yum install vim vim-enhanced wget zip unzip telnet ntsysv compat* apr* nasm* gcc gcc* ...
- Python模块学习笔记
1.作用域 私有private:用'_x'或'__xx'表示,如,_a,__ab; 公有public: 如 a,b; 特殊变量,可被直接引用,如:__author__,__name__,命名变量时一般 ...
- Reveal for mac延长30天试用的简单方法
在iOS逆向过程中经常使用Reveal来远程查看iOS平台应用的UI布局,但Reveal有30天使用限制,经常隔一段时间想使用的时候发现已经过期了,如图: 此时在OS X中打开命令行终端,输入以下命令 ...
- Android的RecyclerView
简介 RecyclerView是support-v7中用来替换ListView的组件.RecyclerView 小组件比 ListView 更高级且更具灵活性. 此小组件是一个用于显示庞大数据集的容器 ...
- Android中的内容提供器
用途 不同于File, SharedPreferences和DataBase,Content Provider主要用于不同的应用程序间共享数据,允许一个程序安全的访问另一个程序中的数据. 用法 通过C ...
- K2新网站(官网和BPM社区)正式上线了
K2新网站(官网和BPM社区)正式上线了 K2新网站(官网和BPM社区)正式上线了 K2新网站(官网和BPM社区)正式上线了 通常重要的事情要讲三遍, 官网:www.k2software.cn 社区: ...
- GridView获取列子段的几种途径
GridView是ASP.NET中功能强大的数据显示控件,它的RowDataBound事件为我们提供了方便的控制行.列数据的途径. 要获取当前行的某个数据列,我在实践中总结有如下几种方法: 1. Ce ...
- js动画之获取元素属性
首先我们要介绍一些知识 offsetWidth element.offsetWidth = width + padding + border; width 我们也知道element.style.wid ...
- PowerMockito 同时mock多个对象
有时候,需要测试的方法内有collections结构,就需要同时mock多个对象 被测方法: public class EmployeeService { public List<Integer ...
- output和returnvalue的作用
贴两段代码. 1> public int ExecuteNonQuery(string pro, MobileOrder or) { SqlParameter ...