CrackMe--cffo-3
来源:互联网 发布:手机商城网页源码下载 编辑:程序博客网 时间:2024/06/05 04:28
打开软件,一看是要输入 用户名和序列号,随便输一个。然后点击 register。 弹出错误。
关键字出现了: Wrong Serial,try again!
OD 载入 ,搜索字符串得到两处结果、
中文搜索引擎, 条目 593
地址=00440F79
反汇编=mov edx,CrackMe3.0044108C
文本字符串=Wrong Serial,try again!中文搜索引擎, 条目 595
地址=00440F93
反汇编=mov edx,CrackMe3.0044108C
文本字符串=Wrong Serial,try again!
发现两处地址较近,直接在反汇编窗口中查看。、
向上找,找到了两处关键call、
00440F2C |. 8B45 FC mov eax,[local.1]00440F2F |. BA 14104400 mov edx,CrackMe3.00441014 ; Registered User00440F34 |. E8 F32BFCFF call CrackMe3.00403B2C00440F39 |. 75 51 jnz short CrackMe3.00440F8C ; 跳了就完蛋
另一处:
00440F49 |. 8B45 FC mov eax,[local.1]00440F4C |. BA 2C104400 mov edx,CrackMe3.0044102C ; GFX-754-IER-95400440F51 |. E8 D62BFCFF call CrackMe3.00403B2C00440F56 |. 75 1A jnz short CrackMe3.00440F72 ; 跳了就完蛋
这两处call执行后如果 jnz发生了跳转就会产生失败。所以call函数要返回ZF=0
在第一处函数下断,F9运行,用户名为 testuser 序列号为 754-GFX-IER-954
压入两个参数,eax为 testuser ,edx为 Registered User
F7跳入函数内
00403B2C /$ 53 push ebx00403B2D |. 56 push esi00403B2E |. 57 push edi00403B2F |. 89C6 mov esi,eax00403B31 |. 89D7 mov edi,edx ; CrackMe3.0044101400403B33 |. 39D0 cmp eax,edx ; CrackMe3.0044101400403B35 |. 0F84 8F000000 je CrackMe3.00403BCA ; 地址 相同则跳 显然不同00403B3B |. 85F6 test esi,esi ; 检查字符串a是否为空、00403B3D |. 74 68 je short CrackMe3.00403BA700403B3F |. 85FF test edi,edi ; 检查字符串b是否为空00403B41 |. 74 6B je short CrackMe3.00403BAE00403B43 |. 8B46 FC mov eax,dword ptr ds:[esi-0x4] ; 输入 字符串长度00403B46 |. 8B57 FC mov edx,dword ptr ds:[edi-0x4] ; 参考字符串00403B49 |. 29D0 sub eax,edx ; 相减00403B4B |. 77 02 ja short CrackMe3.00403B4F ; 输入字符串a长度比较长 则跳转 根据后文edx可以得出是取短值00403B4D |. 01C2 add edx,eax ; 如果字符串a比较短的话就让edx为字符串a的长度00403B4F |> 52 push edx ; 短值压入栈00403B50 |. C1EA 02 shr edx,0x2 ; 右移两位 就是除4,因为要进行字符串比较 4个字符一起比较效率高00403B53 |. 74 26 je short CrackMe3.00403B7B ; 如果字符串长度小于4就会变成0 然后就挂了、00403B55 |> 8B0E /mov ecx,dword ptr ds:[esi] ; CrackMe3.0043EB7000403B57 |. 8B1F |mov ebx,dword ptr ds:[edi] ; 比较esi edi所指向的四个字符00403B59 |. 39D9 |cmp ecx,ebx00403B5B |. 75 58 |jnz short CrackMe3.00403BB5 ; 比较字符串 前四个字符 不相等就完蛋00403B5D |. 4A |dec edx ; 字符串长度减一00403B5E |. 74 15 |je short CrackMe3.00403B75 ; 比完了 就跳出去 没比完继续00403B60 |. 8B4E 04 |mov ecx,dword ptr ds:[esi+0x4]00403B63 |. 8B5F 04 |mov ebx,dword ptr ds:[edi+0x4]00403B66 |. 39D9 |cmp ecx,ebx00403B68 |. 75 4B |jnz short CrackMe3.00403BB5 ; 不相等就滚出去00403B6A |. 83C6 08 |add esi,0x800403B6D |. 83C7 08 |add edi,0x800403B70 |. 4A |dec edx ; 又比较了4个字符了 每次循环比较8个字符00403B71 |.^ 75 E2 \jnz short CrackMe3.00403B55 ; 还有字符没比就继续00403B73 |. EB 06 jmp short CrackMe3.00403B7B00403B75 |> 83C6 04 add esi,0x4 ; 剩下不足4个字符了 不能在循环里面比了00403B78 |. 83C7 04 add edi,0x400403B7B |> 5A pop edx ; CrackMe3.00440F3900403B7C |. 83E2 03 and edx,0x300403B7F |. 74 22 je short CrackMe3.00403BA300403B81 |. 8B0E mov ecx,dword ptr ds:[esi] ; CrackMe3.0043EB7000403B83 |. 8B1F mov ebx,dword ptr ds:[edi]00403B85 |. 38D9 cmp cl,bl ; 比较剩下几个中的第一个00403B87 |. 75 41 jnz short CrackMe3.00403BCA00403B89 |. 4A dec edx ; -100403B8A |. 74 17 je short CrackMe3.00403BA300403B8C |. 38FD cmp ch,bh00403B8E |. 75 3A jnz short CrackMe3.00403BCA ; -100403B90 |. 4A dec edx ; CrackMe3.0044101400403B91 |. 74 10 je short CrackMe3.00403BA300403B93 |. 81E3 0000FF00 and ebx,0xFF000000403B99 |. 81E1 0000FF00 and ecx,0xFF000000403B9F |. 39D9 cmp ecx,ebx ; -100403BA1 |. 75 27 jnz short CrackMe3.00403BCA00403BA3 |> 01C0 add eax,eax00403BA5 |. EB 23 jmp short CrackMe3.00403BCA00403BA7 |> 8B57 FC mov edx,dword ptr ds:[edi-0x4]00403BAA |. 29D0 sub eax,edx ; CrackMe3.0044101400403BAC |. EB 1C jmp short CrackMe3.00403BCA00403BAE |> 8B46 FC mov eax,dword ptr ds:[esi-0x4]00403BB1 |. 29D0 sub eax,edx ; CrackMe3.0044101400403BB3 |. EB 15 jmp short CrackMe3.00403BCA00403BB5 |> 5A pop edx ; CrackMe3.00440F3900403BB6 |. 38D9 cmp cl,bl00403BB8 |. 75 10 jnz short CrackMe3.00403BCA00403BBA |. 38FD cmp ch,bh00403BBC |. 75 0C jnz short CrackMe3.00403BCA00403BBE |. C1E9 10 shr ecx,0x1000403BC1 |. C1EB 10 shr ebx,0x1000403BC4 |. 38D9 cmp cl,bl00403BC6 |. 75 02 jnz short CrackMe3.00403BCA00403BC8 |. 38FD cmp ch,bh00403BCA |> 5F pop edi ; CrackMe3.00440F3900403BCB |. 5E pop esi ; CrackMe3.00440F3900403BCC |. 5B pop ebx ; CrackMe3.00440F3900403BCD \. C3 retn
其实这个函数的功能是检查两个字符串是否相同,
它首先比较两个字符串的地址是否相同,如果相同就返回失败。
然后比较两个字符串的第一个字符是否为 \0, 也就是检查字符串长度,如果为空,返回失败
接下来就可以进行比较了。 因为一个字符是8位,而eax寄存器变量是32位,所以每次比较4个字符,
最后不足4个字符单个比,当然如果字符串不同的话,肯定最后也会返回失败的。。
所以这个函数的参数是两个字符串,功能是比较两个字符串是否相同,如果相同的话,就返回1.
这两处关键call用的是同一处函数,所以只要找到题目中检查的第二个参数就行了。分别为;
Registered User
GFX-754-IER-954
- CrackMe--cffo-3
- Crackme 3
- Duelist's Crackme #3
- CrackMe等级自测(3)
- 160crackme-3
- 170526 逆向-CrackMe(3)
- CrackMe技术等级自测3级一个CrackMe分析
- CRACKME练习3(原创)
- CrackMe破解【3】- 简单级别
- 160个CrackMe 029 Cosh.3
- 日拱一卒——160个crackme之#3
- Triangle CrackMe
- CrackMe-crackhead
- crackme 网站
- Crackme 1
- Crackme 2
- Crackme 4
- Crackme 20
- iOS由ImageIO.framework实现gif的系统解码
- 本地导入的项目或从svn上导入的项目不是maven结构,且不能添加进tomcat部署问题的解决
- Android-自定义可滑动开关控件之SlidingSwitchView
- RBAC用户权限管理数据库设计
- startActivityForResult()实现的机制
- CrackMe--cffo-3
- hadoop安装之-sqoop
- 15-11-16 Eclipse 操作菜单汉译之 Navigate [浏览]
- Linux 卸载mysql
- 如何应对大数据量地物属性查询- -属性图层来帮忙
- web应用性能优化--采用gzip静态压缩+动态压缩方式压缩js、css文件
- yii2 将js注册到页面的底部
- 多线程学习--写一个简单的缓存系统
- BerkeleyDB的使用