爆破一个二元函数加密的cm

系统 : Windows xp

程序 : cztria~1

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

要求 : 爆破

使用工具 : OD

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

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

0040137B  |.  6A 40         push    40                               ; /Count = 40 (64.)
0040137D  |.  68 20334000   push    00403320                         ; |pediy
00401382  |.  FF35 66324000 push    dword ptr [403266]               ; |hWnd = 000405D8 (class=‘Edit‘,parent=000505C0)
00401388  |.  E8 A3080000   call    <jmp.&USER32.GetWindowTextA>     ; \GetWindowTextA
0040138D  |.  83F8 04       cmp     eax, 4                           ;  小于等于4?
00401390  |.  0F8E 9F000000 jle     00401435
00401396  |.  6A 40         push    40                               ; /Count = 40 (64.)
00401398  |.  68 60334000   push    00403360                         ; |12345
0040139D  |.  68 B90B0000   push    0BB9                             ; |ControlID = BB9 (3001.)
004013A2  |.  FF75 08       push    dword ptr [ebp+8]                ; |hWnd
004013A5  |.  E8 6E080000   call    <jmp.&USER32.GetDlgItemTextA>    ; \GetDlgItemTextA
004013AA  |.  83F8 04       cmp     eax, 4                           ;  小于等于4?
004013AD  |.  0F8E 82000000 jle     00401435
004013B3  |.  A3 62324000   mov     dword ptr [403262], eax
004013B8  |.  FF35 66324000 push    dword ptr [403266]               ; /hWnd = 000405D8 (class=‘Edit‘,parent=000505C0)
004013BE  |.  E8 AF080000   call    <jmp.&USER32.SetFocus>           ; \SetFocus
004013C3  |.  BF 20334000   mov     edi, 00403320                    ;  pediy
004013C8  |.  BE 20334000   mov     esi, 00403320                    ;  pediy
004013CD  |>  AC            /lods    byte ptr [esi]                  ;  循环迭代用户名字符串
004013CE  |.  0C 00         |or      al, 0
004013D0  |.  74 05         |je      short 004013D7
004013D2  |.  0C 20         |or      al, 20
004013D4  |.  AA            |stos    byte ptr es:[edi]
004013D5  |.^ EB F6         \jmp     short 004013CD
004013D7  |>  BF A0324000   mov     edi, 004032A0
004013DC  |.  BE 60334000   mov     esi, 00403360                    ;  12345
004013E1  |.  8D1D 20334000 lea     ebx, dword ptr [403320]
004013E7  |.  33C9          xor     ecx, ecx
004013E9  |>  AC            /lods    byte ptr [esi]                  ;  循环迭代 密码
004013EA  |.  0C 00         |or      al, 0
004013EC  |.  74 17         |je      short 00401405
004013EE  |.  8A13          |mov     dl, byte ptr [ebx]              ;  循环迭代 用户名
004013F0  |.  2AD0          |sub     dl, al                          ;  用户名字符 - 密码字符
004013F2  |.  80CA 00       |or      dl, 0                           ;  如果相同,则跳转出错
004013F5  |.  74 3E         |je      short 00401435
004013F7  |.  8AC2          |mov     al, dl
004013F9  |.  24 0F         |and     al, 0F
004013FB  |.  0C 00         |or      al, 0                           ;  al为0?
004013FD  |.  74 36         |je      short 00401435                  ;  为0则跳转出错
004013FF  |.  AA            |stos    byte ptr es:[edi]               ;  保存al成表
00401400  |.  02C8          |add     cl, al                          ;  结果累加
00401402  |.  43            |inc     ebx
00401403  |.^ EB E4         \jmp     short 004013E9
00401405  |>  890D 6A324000 mov     dword ptr [40326A], ecx          ;  保存累加结果
0040140B  |.  E8 27020000   call    00401637                         ;  关键call
00401410  |.  BE A0324000   mov     esi, 004032A0
00401415  |.  8B15 62324000 mov     edx, dword ptr [403262]          ;  取密码长度
0040141B  |.  C1EA 02       shr     edx, 2                           ;  逻辑右移
0040141E  |.  03F2          add     esi, edx
00401420  |.  8A06          mov     al, byte ptr [esi]               ;  表中取值
00401422  |.  33D2          xor     edx, edx
00401424  |.  8B15 6E324000 mov     edx, dword ptr [40326E]
0040142A  |.  2BD0          sub     edx, eax
0040142C  |.  A1 6A324000   mov     eax, dword ptr [40326A]
00401431  |.  3BC2          cmp     eax, edx
00401433      75 31         jz     short 00401466
00401435  |>  68 00200000   push    2000                             ; /Style = MB_OK|MB_TASKMODAL
0040143A  |.  68 D1314000   push    004031D1                         ; |              error
0040143F  |.  68 F9314000   push    004031F9                         ; | sorry cracker, wrong.
00401444  |.  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
00401447  |.  E8 02080000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
0040144C  |.  6A 40         push    40                               ; /Length = 40 (64.)
0040144E  |.  68 E0324000   push    004032E0                         ; |Destination = cztria~1.004032E0
00401453  |.  E8 56080000   call    <jmp.&KERNEL32.RtlZeroMemory>    ; \RtlZeroMemory
00401458  |.  6A 40         push    40                               ; /Length = 40 (64.)
0040145A  |.  68 A0334000   push    004033A0                         ; |Destination = cztria~1.004033A0
0040145F  |.  E8 4A080000   call    <jmp.&KERNEL32.RtlZeroMemory>    ; \RtlZeroMemory
00401464  |.  EB 2F         jmp     short 00401495
00401466  |>  68 00200000   push    2000                             ; /Style = MB_OK|MB_TASKMODAL
0040146B  |.  68 E5314000   push    004031E5                         ; |       <registered>
00401470  |.  68 10324000   push    00403210                         ; |            you did it!
00401475  |.  FF75 08       push    dword ptr [ebp+8]                ; |hOwner
00401478  |.  E8 D1070000   call    <jmp.&USER32.MessageBoxA>        ; \MessageBoxA
0040147D  |.  6A 40         push    40                               ; /Length = 40 (64.)
0040147F  |.  68 E0324000   push    004032E0                         ; |Destination = cztria~1.004032E0
00401484  |.  E8 25080000   call    <jmp.&KERNEL32.RtlZeroMemory>    ; \RtlZeroMemory
00401489  |.  6A 40         push    40                               ; /Length = 40 (64.)
0040148B  |.  68 A0334000   push    004033A0                         ; |Destination = cztria~1.004033A0
00401490  |.  E8 19080000   call    <jmp.&KERNEL32.RtlZeroMemory>    ; \RtlZeroMemory

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

00401637  /$  BE A0324000   mov     esi, 004032A0
0040163C  |.  8B15 62324000 mov     edx, dword ptr [403262]          ;  取密码长度
00401642  |.  52            push    edx
00401643  |.  33C0          xor     eax, eax
00401645  |.  83EA 01       sub     edx, 1
00401648  |.  03F2          add     esi, edx
0040164A  |.  8A06          mov     al, byte ptr [esi]               ;  表中取值
0040164C  |.  F7E0          mul     eax
0040164E  |.  5A            pop     edx
0040164F  |.  83EA 01       sub     edx, 1
00401652  |.  F7E2          mul     edx
00401654  |.  B9 01000000   mov     ecx, 1
00401659  |>  2BC1          /sub     eax, ecx
0040165B  |.  83F8 00       |cmp     eax, 0                          ;  eax为0?
0040165E  |.  7E 08         |jle     short 00401668
00401660  |.  83C2 01       |add     edx, 1
00401663  |.  83C1 02       |add     ecx, 2
00401666  |.^ EB F1         \jmp     short 00401659
00401668  |>  52            push    edx                              ;  保存edx
00401669  |.  BE A0324000   mov     esi, 004032A0
0040166E  |.  8BFE          mov     edi, esi
00401670  |.  8B15 62324000 mov     edx, dword ptr [403262]          ;  取密码长度
00401676  |.  33C0          xor     eax, eax
00401678  |.  83EA 01       sub     edx, 1
0040167B  |.  03F2          add     esi, edx
0040167D  |.  8A06          mov     al, byte ptr [esi]               ;  表中取值
0040167F  |.  83C0 01       add     eax, 1
00401682  |.  5A            pop     edx
00401683  |.  03C2          add     eax, edx
00401685  |.  D1E8          shr     eax, 1
00401687  |.  8B15 62324000 mov     edx, dword ptr [403262]          ;  取密码长度
0040168D  |.  03FA          add     edi, edx
0040168F  |.  AA            stos    byte ptr es:[edi]
00401690  |.  F7E0          mul     eax
00401692  |.  8B15 62324000 mov     edx, dword ptr [403262]          ;  取密码长度
00401698  |.  83EA 01       sub     edx, 1
0040169B  |.  F7E2          mul     edx
0040169D  |.  B9 01000000   mov     ecx, 1
004016A2  |>  2BC1          /sub     eax, ecx
004016A4  |.  83F8 00       |cmp     eax, 0                          ;  eax为0?
004016A7  |.  7E 08         |jle     short 004016B1
004016A9  |.  83C2 01       |add     edx, 1
004016AC  |.  83C1 02       |add     ecx, 2
004016AF  |.^ EB F1         \jmp     short 004016A2
004016B1  |>  52            push    edx
004016B2  |.  BE A0324000   mov     esi, 004032A0
004016B7  |.  8B15 62324000 mov     edx, dword ptr [403262]          ;  取密码长度
004016BD  |.  33C0          xor     eax, eax
004016BF  |.  03F2          add     esi, edx
004016C1  |.  8A06          mov     al, byte ptr [esi]               ;  取表中末位
004016C3  |.  83C0 01       add     eax, 1
004016C6  |.  5A            pop     edx
004016C7  |.  03C2          add     eax, edx
004016C9  |.  D1E8          shr     eax, 1
004016CB  |.  A3 6E324000   mov     dword ptr [40326E], eax          ;  保存结果
004016D0  \.  C3            retn

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

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

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

00401433 /75 31 jnz short 00401466

就可以完成爆破了。

时间: 2024-11-16 19:54:31

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

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

python提供了一个进行hash加密的模块:hashlib下面主要记录下其中的md5加密方式 import hashlib data1 = 'sada' #####字母和数字 m = hashlib.md5(data1.encode('utf-8')) print(m.hexdigest()) data='我是' #####中文 b = hashlib.md5(data.encode('gb2312')) print(b.hexdigest()) def md5(s): ####这是一个MD5

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

自己经常会忘记一些密码什么的,想把这些密码保存下来,但是别人做的软件总有一点不安全的感觉,所以自己动手做了一个带有指纹加密的笔记本. 以下是本工程用到的一些第三方包 compile 'org.greenrobot:greendao:3.2.0' compile 'net.zetetic:android-database-sqlcipher:3.5.1' compile 'com.getbase:floatingactionbutton:1.10.1' 其中greendao是一款比较好用的开源数据

PHP加密函数—sha1()函数加密

首先我们先介绍下什么是 sha1 ?大理石构件 sha的全称是:Secure Hash Algorithm(安全哈希算法)主要适用于数字签名标准 (Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA).对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要.当接收到消息的时候,这个消息摘要可以用来验证数据的完整性.在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要.P

STL算法设计理念 - 二元函数,二元谓词以及在set中的应用

demo 二元函数对象 #include <iostream> #include <cstdio> #include <vector> #include <algorithm> using namespace std; template <typename T> class SumVector { public: T operator()(T t1, T t2) // 二元函数对象 { return t1 + t2; } protected: p

实现一个栈,并且实现一个min函数用来找当前栈中最小的元素

题目描述:实现一个栈,并且实现一个min函数用来找当前栈中最小的元素 分析:要找到栈中最小的元素,需要借助一个辅助栈,来存放当前栈中最小的元素. 入栈的时候,第一个入栈的元素,也给辅助栈入栈,此后每次入栈的元素先与辅助栈的栈顶元素比较,如果小于或等于辅助栈的栈顶元素,则同时将该元素给辅助栈入栈. 如下图所示: 出栈的时候,如果栈顶元素与辅助栈栈顶的元素相等,则同时对辅助栈进行出栈操作 如下图所示: 这样就可以保证,辅助栈中的栈顶元素始终是当前栈中最小的元素了 代码如下: #include<ios

处理菱形继承问题&&实现一个虚函数的覆盖及调用&&实现以下几个类的成员函数

#include <iostream> #include <string> using namespace std; 1.实现以下几个类的成员函数 2.实现一个虚函数的覆盖及调用 3.处理菱形继承问题. 植物 class Botany { public: //(const string& name) // const char* name Botany(const char* name = "") :_name(name) //构造函数 { //cout

使用函数指针,完成一个sort()函数,能对任何类型的数组元素进行排序: 回调函数 以及 memcpy ()原型实现

进来复习了一下C语言指针,一直没有写过太多关于函数指针的代码,而且对回调函数的理解一直都是在理论上,基本上没有太写过关于它的代码,进来得空,写了一个小程序加深下自己对回调函数和函数指针的理解. 问题描述: 编写一个sort()函数,使它能够对任何类型的数组元素进行排序. 下面是我写的代码: /* 使用函数指针的回调函数技巧,设计一个能排序int 和char 数组的sort()函数 */ #include<stdio.h> #include<stdlib.h> #include<

也谈matlab中读取视频的一个重要函数mmreader

也谈matlab中读取视频的一个重要函数mmreader 在matlab中输入help mmreader来查阅一下该函数,有如下信息: MMREADER Create a multimedia reader object.     OBJ = MMREADER(FILENAME) constructs a multimedia reader object, OBJ, that    can read in video data from a multimedia file.  FILENAME

ExtJS中关于分页加载数据后执行一个回调函数的问题

前几天,一个项目中有用到ExtJS.之前修改的时候,只是在Store Load的时候执行一个回调,这个会导致翻页的时候,没有执行这个回调,而这个回调做的恰好是一些数据的格式验证不可或缺的. 被这个问题困扰了很久,也查了很多的关于ExtJs Store的应用和API,最终找到了一个解决的办法,其实很简单,就是在Store里面添加一个load事件的监听. new Ext.data.Store({... listeners: { "load": function (store, operat