系统 : Windows xp

程序 : cztria~1

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

要求 : 爆破

使用工具 : OD

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

废话不多说,直接查询到字符串:“            you did it!”,双击定位:

  1. 0040137B |. 6A push ; /Count = 40 (64.)
  2. 0040137D |. push ; |pediy
  3. |. FF35 push dword ptr [] ; |hWnd = 000405D8 (class='Edit',parent=000505C0)
  4. |. E8 A3080000 call <jmp.&USER32.GetWindowTextA> ; \GetWindowTextA
  5. 0040138D |. 83F8 cmp eax, ; 小于等于4
  6. |. 0F8E 9F000000 jle
  7. |. 6A push ; /Count = 40 (64.)
  8. |. push ; |12345
  9. 0040139D |. B90B0000 push 0BB9 ; |ControlID = BB9 (3001.)
  10. 004013A2 |. FF75 push dword ptr [ebp+] ; |hWnd
  11. 004013A5 |. E8 6E080000 call <jmp.&USER32.GetDlgItemTextA> ; \GetDlgItemTextA
  12. 004013AA |. 83F8 cmp eax, ; 小于等于4
  13. 004013AD |. 0F8E jle
  14. 004013B3 |. A3 mov dword ptr [], eax
  15. 004013B8 |. FF35 push dword ptr [] ; /hWnd = 000405D8 (class='Edit',parent=000505C0)
  16. 004013BE |. E8 AF080000 call <jmp.&USER32.SetFocus> ; \SetFocus
  17. 004013C3 |. BF mov edi, ; pediy
  18. 004013C8 |. BE mov esi, ; pediy
  19. 004013CD |> AC /lods byte ptr [esi] ; 循环迭代用户名字符串
  20. 004013CE |. 0C |or al,
  21. 004013D0 |. |je short 004013D7
  22. 004013D2 |. 0C |or al,
  23. 004013D4 |. AA |stos byte ptr es:[edi]
  24. 004013D5 |.^ EB F6 \jmp short 004013CD
  25. 004013D7 |> BF A0324000 mov edi, 004032A0
  26. 004013DC |. BE mov esi, ;
  27. 004013E1 |. 8D1D lea ebx, dword ptr []
  28. 004013E7 |. 33C9 xor ecx, ecx
  29. 004013E9 |> AC /lods byte ptr [esi] ; 循环迭代 密码
  30. 004013EA |. 0C |or al,
  31. 004013EC |. |je short
  32. 004013EE |. 8A13 |mov dl, byte ptr [ebx] ; 循环迭代 用户名
  33. 004013F0 |. 2AD0 |sub dl, al ; 用户名字符 - 密码字符
  34. 004013F2 |. 80CA |or dl, ; 如果相同,则跳转出错
  35. 004013F5 |. 3E |je short
  36. 004013F7 |. 8AC2 |mov al, dl
  37. 004013F9 |. 0F |and al, 0F
  38. 004013FB |. 0C |or al, ; al0
  39. 004013FD |. |je short ; 0则跳转出错
  40. 004013FF |. AA |stos byte ptr es:[edi] ; 保存al成表
  41. |. 02C8 |add cl, al ; 结果累加
  42. |. |inc ebx
  43. |.^ EB E4 \jmp short 004013E9
  44. |> 890D 6A324000 mov dword ptr [40326A], ecx ; 保存累加结果
  45. 0040140B |. E8 call ; 关键call
  46. |. BE A0324000 mov esi, 004032A0
  47. |. 8B15 mov edx, dword ptr [] ; 取密码长度
  48. 0040141B |. C1EA shr edx, ; 逻辑右移
  49. 0040141E |. 03F2 add esi, edx
  50. |. 8A06 mov al, byte ptr [esi] ; 表中取值
  51. |. 33D2 xor edx, edx
  52. |. 8B15 6E324000 mov edx, dword ptr [40326E]
  53. 0040142A |. 2BD0 sub edx, eax
  54. 0040142C |. A1 6A324000 mov eax, dword ptr [40326A]
  55. |. 3BC2 cmp eax, edx
  56. jz short
  57. |> push ; /Style = MB_OK|MB_TASKMODAL
  58. 0040143A |. D1314000 push 004031D1 ; | error
  59. 0040143F |. F9314000 push 004031F9 ; | sorry cracker, wrong.
  60. |. FF75 push dword ptr [ebp+] ; |hOwner
  61. |. E8 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
  62. 0040144C |. 6A push ; /Length = 40 (64.)
  63. 0040144E |. E0324000 push 004032E0 ; |Destination = cztria~1.004032E0
  64. |. E8 call <jmp.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory
  65. |. 6A push ; /Length = 40 (64.)
  66. 0040145A |. A0334000 push 004033A0 ; |Destination = cztria~1.004033A0
  67. 0040145F |. E8 4A080000 call <jmp.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory
  68. |. EB 2F jmp short
  69. |> push ; /Style = MB_OK|MB_TASKMODAL
  70. 0040146B |. E5314000 push 004031E5 ; | <registered>
  71. |. push ; | you did it!
  72. |. FF75 push dword ptr [ebp+] ; |hOwner
  73. |. E8 D1070000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
  74. 0040147D |. 6A push ; /Length = 40 (64.)
  75. 0040147F |. E0324000 push 004032E0 ; |Destination = cztria~1.004032E0
  76. |. E8 call <jmp.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory
  77. |. 6A push ; /Length = 40 (64.)
  78. 0040148B |. A0334000 push 004033A0 ; |Destination = cztria~1.004033A0
  79. |. E8 call <jmp.&KERNEL32.RtlZeroMemory> ; \RtlZeroMemory

跟入 0040140B |. E8 27020000 call 00401637 ; 关键call

  1. /$ BE A0324000 mov esi, 004032A0
  2. 0040163C |. 8B15 mov edx, dword ptr [] ; 取密码长度
  3. |. push edx
  4. |. 33C0 xor eax, eax
  5. |. 83EA sub edx,
  6. |. 03F2 add esi, edx
  7. 0040164A |. 8A06 mov al, byte ptr [esi] ; 表中取值
  8. 0040164C |. F7E0 mul eax
  9. 0040164E |. 5A pop edx
  10. 0040164F |. 83EA sub edx,
  11. |. F7E2 mul edx
  12. |. B9 mov ecx,
  13. |> 2BC1 /sub eax, ecx
  14. 0040165B |. 83F8 |cmp eax, ; eax0
  15. 0040165E |. 7E |jle short
  16. |. 83C2 |add edx,
  17. |. 83C1 |add ecx,
  18. |.^ EB F1 \jmp short
  19. |> push edx ; 保存edx
  20. |. BE A0324000 mov esi, 004032A0
  21. 0040166E |. 8BFE mov edi, esi
  22. |. 8B15 mov edx, dword ptr [] ; 取密码长度
  23. |. 33C0 xor eax, eax
  24. |. 83EA sub edx,
  25. 0040167B |. 03F2 add esi, edx
  26. 0040167D |. 8A06 mov al, byte ptr [esi] ; 表中取值
  27. 0040167F |. 83C0 add eax,
  28. |. 5A pop edx
  29. |. 03C2 add eax, edx
  30. |. D1E8 shr eax,
  31. |. 8B15 mov edx, dword ptr [] ; 取密码长度
  32. 0040168D |. 03FA add edi, edx
  33. 0040168F |. AA stos byte ptr es:[edi]
  34. |. F7E0 mul eax
  35. |. 8B15 mov edx, dword ptr [] ; 取密码长度
  36. |. 83EA sub edx,
  37. 0040169B |. F7E2 mul edx
  38. 0040169D |. B9 mov ecx,
  39. 004016A2 |> 2BC1 /sub eax, ecx
  40. 004016A4 |. 83F8 |cmp eax, ; eax0
  41. 004016A7 |. 7E |jle short 004016B1
  42. 004016A9 |. 83C2 |add edx,
  43. 004016AC |. 83C1 |add ecx,
  44. 004016AF |.^ EB F1 \jmp short 004016A2
  45. 004016B1 |> push edx
  46. 004016B2 |. BE A0324000 mov esi, 004032A0
  47. 004016B7 |. 8B15 mov edx, dword ptr [] ; 取密码长度
  48. 004016BD |. 33C0 xor eax, eax
  49. 004016BF |. 03F2 add esi, edx
  50. 004016C1 |. 8A06 mov al, byte ptr [esi] ; 取表中末位
  51. 004016C3 |. 83C0 add eax,
  52. 004016C6 |. 5A pop edx
  53. 004016C7 |. 03C2 add eax, edx
  54. 004016C9 |. D1E8 shr eax,
  55. 004016CB |. A3 6E324000 mov dword ptr [40326E], eax ; 保存结果
  56. 004016D0 \. C3 retn

这是一个典型的二元函数加密,将用户名与密码的差值生成一个表 和 累加值。再根据表生成两个特殊值。

输入的结果差值要符合 特殊值1 - 特殊值2 == 累加结果

我们可以直接将判断的条件修改成:

00401433 /75 31 jnz short 00401466

就可以完成爆破了。

爆破一个二元函数加密的cm的更多相关文章

  1. Android逆向之旅---基于对so中的函数加密技术实现so加固

    一.前言 今天我们继续来介绍so加固方式,在前面一篇文章中我们介绍了对so中指定的段(section)进行加密来实现对so加固 http://blog.csdn.net/jiangwei0910410 ...

  2. Oracle自定义函数&加密

    在sql中频繁使用的功能(逻辑.加密等)可以写成自定义函数进行封装,之后再调用即可. CREATE OR REPLACE FUNCTION "函数名" (参数名 参数类型 参数数据 ...

  3. 实现一个带有指纹加密功能的笔记本(Android)第一部分

    自己经常会忘记一些密码什么的,想把这些密码保存下来,但是别人做的软件总有一点不安全的感觉,所以自己动手做了一个带有指纹加密的笔记本. 以下是本工程用到的一些第三方包 compile 'org.gree ...

  4. python提供了一个进行hash加密的模块:hashlib

    python提供了一个进行hash加密的模块:hashlib下面主要记录下其中的md5加密方式 import hashlib data1 = 'sada' #####字母和数字 m = hashlib ...

  5. C++进阶 STL(2) 第二天 一元/二元函数对象、一元/二元谓词、stack容器、queue容器、list容器(双向链表)、set容器、对组、map容器

    01 上次课程回顾 昨天讲了三个容器 string  string是对char*进行的封装 vector 单口容器 动态数组 deque(双端队列) 函数对象/谓词: 一元函数对象: for_each ...

  6. Java实现 蓝桥杯VIP 算法训练 二元函数

    问题描述 令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值. 只有满足以下要求的表达式才是合法的: 1.任意整数x是一个合法的表达式: 2.如果A和B都是合法的表达式,则f(A,B ...

  7. Java实现蓝桥杯VIP算法训练 二元函数

    试题 算法训练 二元函数 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 令二元函数f(x,y)=ax+by,a和b为整数,求一个表达式S的值. 只有满足以下要求的表达式才是合法的: ...

  8. 请写一个php函数,可以接受任意数量的参数

    请写一个php函数,可以接受任意数量的参数 这是一道面试题.怎么写这个函数呢? function fun(......) { } ----------------------------------- ...

  9. 在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性:

    在String()构造器不存在的情况下自定义一个MyString()函数,实现如下内建String()方法和属性: var s = new MyString("hello"); s ...

随机推荐

  1. c#连接vertica数据库

    项目前期使用mysql数据库,大约每天200w数据量,十天1500w数据量之后,读取写入都会很慢,而且经常锁表,后来采用vertica数据库,下面分享vertica数据库使用方法,以及大批量数据快速写 ...

  2. META-INF文件夹是干啥的,META-INF文件夹的作用, META-INF文件夹能删吗

    今天有人问到 META-INF文件夹是干啥的,META-INF文件夹的作用, META-INF文件夹能删吗,还有项目的META-INF下面一般会有个MANIFEST.MF 文件,都是干啥的. 百度搜了 ...

  3. Python 之路 Day5 - 常用模块学习

    本节大纲: 模块介绍 time &datetime模块 random os sys shutil json & picle shelve xml处理 yaml处理 configpars ...

  4. 【图像处理】【SEED-VPM】7.ubuntu10.04下 TFTP,NFS 安装指南

    Linux系统启动流程 程序开发调试的一般方法 1. TFTP下载内核+NFS网络文件系统.即内核和文件系统均不在板卡上.主要用于调试内核功能. 2. FLASH启动内核+NFS网络文件系统,即内核固 ...

  5. one recursive approach for 3, hdu 1016 (with an improved version) , permutations, N-Queens puzzle 分类: hdoj 2015-07-19 16:49 86人阅读 评论(0) 收藏

    one recursive approach to solve hdu 1016, list all permutations, solve N-Queens puzzle. reference: t ...

  6. Tomcat批处理文件小结

    Tomcat批处理文件小结 一:嗯,如果你不了解Windows批处理文件,并且想了解一下,请先参看下面的链接资源(我也是因为想了解一下Windows批处理文件是用什么写的?怎么写的?才在园中找的,下面 ...

  7. c++中变量声明和变量定义的区别。2016年12月6日

    整个流程: 1.程序告诉cpu,程序将要使用一个变量.(暂时不一定用到,先说一下.) 2.程序告诉CPU,程序现在就要使用一个变量.(现在就用) 3.cpu按照这个变量的类型,把内存划分出几个单位(b ...

  8. java基础之 重排序

    重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段.重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境. 在并发程序中,程序员会特别关注不同进程 ...

  9. 基于JSON的级联列表实现

    html代码: <select id="provice" onChange="setCity()"> <option value=" ...

  10. 推荐记录片系列:Ultimate Factories系列和MegaStructures系列

    -_- 我刚刚看完记录片 <终极工厂:M1主战坦克> (Ultimate Factories: M-1 Tank) (2006), 决定推荐几个系列的记录片. →_→ 1993年后出厂的M ...