飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3929|回复: 6

[原创] ClipNow V4.7 算法分析

[复制链接]
  • TA的每日心情
    开心
    2019-3-25 14:18
  • 签到天数: 881 天

    [LV.10]以坛为家III

    发表于 2015-5-10 11:31:12 | 显示全部楼层 |阅读模式
    本帖最后由 geekcat 于 2015-5-10 11:50 编辑

    【文章标题】:  ClipNow V4.7  算法分析
    【文章作者】: GeekCat
    【作者邮箱】: geek_huang@163.com
    【作者主页】:
    【软件名称】:  ClipNow V4.7
    【软件大小】: 2.18 MB (2,292,730 字节)
    【加壳方式】: UPX -> Markus & Laszlo ver. [ 1.93 ] <- from file. ( sign like UPX packer )
    【保护方式】: 注册码
    【编写语言】: 壳盲不会脱带壳分析的,不知道是什么语言;
    【使用工具】: OD、ExeinfoPE
    【操作平台】: XP SP3
    破解声明】:破解在于交流思路和过程,结果并不重要,请不要用于非法用途;
    【软件介绍】:“ClipNow”是一个Windows剪贴板增强增强工具,使之成为真正的强大工具。在剪切/复制/粘贴功能的Windows行之有效的数据传输单个项目,如果你想移动大量的数据,但你想将数据长时间保存直到你下次剪切或复制时就没有什么用处了。
    功能:1、 10剪贴板。 2、每个剪贴板热键:CTRL(0-9)为复制并保存到对应的剪贴板中, ALT键(0-9)粘贴剪贴板中对应的数据。 3、查看每个剪贴板内容。 4、保存历史到剪贴板。 5、按Ctrl +右击粘贴历史剪辑。 6、屏幕抓图并保存到剪贴板
    -------------------------------------------------------------------------------------------------------------------------------
    第十二期第一课视频中用的另一个软件;给大家分享一下算法分析,不足、错误之处请指出

    脱壳后修复不成功带壳分析,ESP定律先来到程序的OEP处,再用F12堆栈调用直接找到关键处---->算法CALL,这不是本文的重点直接给出算法CALL;

    分析时用到的用户:GeekCat  注册码:1234567890

    关键点:
    10004FB5    E8 66040000     call KeyData.10005420                          ; 算法CALL   F7跟进
    10004FBA    8B5424 10       mov edx,dword ptr ss:[esp+0x10]          ; 输入的假码  (ASCII "1234567890")
    10004FBE    8B4424 14       mov eax,dword ptr ss:[esp+0x14]          ; 真注册码  (ASCII "34627BD1")
    10004FC2    52              push edx

    算法CALL代码:
    10005420    6A FF           push -0x1
    10005422    68 E1610010     push KeyData.100061E1
    10005427    64:A1 00000000  mov eax,dword ptr fs:[0]
    1000542D    50              push eax
    1000542E    64:8925 0000000>mov dword ptr fs:[0],esp
    10005435    81EC F4030000   sub esp,0x3F4
    1000543B    56              push esi
    1000543C    8BF1            mov esi,ecx
    1000543E    57              push edi
    1000543F    8D8C24 14020000 lea ecx,dword ptr ss:[esp+0x214]
    10005446    C74424 10 00000>mov dword ptr ss:[esp+0x10],0x0
    1000544E    E8 0DEAFFFF     call KeyData.10003E60
    10005453    8B8424 10040000 mov eax,dword ptr ss:[esp+0x410]      ; (ASCII "GeekCat")
    1000545A    8D8C24 14020000 lea ecx,dword ptr ss:[esp+0x214]
    10005461    50              push eax
    10005462    C78424 08040000>mov dword ptr ss:[esp+0x408],0x1
    1000546D    E8 9EEAFFFF     call KeyData.10003F10                              ; 把注册名进行MD5运算
    10005472    8D8C24 14020000 lea ecx,dword ptr ss:[esp+0x214]
    10005479    E8 42F6FFFF     call KeyData.10004AC0                               ; 用户名MD5
    1000547E    33C9            xor ecx,ecx
    10005480    8BF8            mov edi,eax                                                      ; (ASCII "c4a88422ee4b2eaf6a3426bd277dd9ff")
    10005482    894C24 19       mov dword ptr ss:[esp+0x19],ecx
    10005486    C64424 18 00    mov byte ptr ss:[esp+0x18],0x0
    1000548B    894C24 1D       mov dword ptr ss:[esp+0x1D],ecx
    1000548F    894C24 21       mov dword ptr ss:[esp+0x21],ecx
    10005493    894C24 25       mov dword ptr ss:[esp+0x25],ecx
    10005497    8BD1            mov edx,ecx                                            ; 下面这个循环就是取注册名MD5值奇数位 得到字符串 (ASCII "ca82e42a632b27df")
    10005499    81E2 01000080   and edx,0x80000001                       ; 结果的最高位为1,是负数—SF=1,结果非零——ZF=0
    1000549F    79 05           jns short KeyData.100054A6                    ; S标志位为零就跳转
    100054A1    4A              dec edx                                                       ; 自减1
    100054A2    83CA FE         or edx,0xFFFFFFFE                                  ; 与1-做或运算
    100054A5    42              inc edx                                                        ; 自加1
    100054A6    75 0E           jnz short KeyData.100054B6                     ; Z标示位为零就跳转
    100054A8    8BC1            mov eax,ecx
    100054AA    99              cdq                                                               ; EDX清零
    100054AB    2BC2            sub eax,edx                                                ; 减法操作
    100054AD    8A1439          mov dl,byte ptr ds:[ecx+edi]                   ; 依次取MD5值的每一们
    100054B0    D1F8            sar eax,1                                                    ; 算术右移一位相当于除2
    100054B2    885404 18       mov byte ptr ss:[esp+eax+0x18],dl
    100054B6    41              inc ecx                                                          ; ecx自加1
    100054B7    83F9 20         cmp ecx,0x20                                           ; 与0x20即32比较,把整个MD5值取完
    100054BA  ^ 7C DB           jl short KeyData.10005497                       ; 小于就跳转
    100054BC    8D4424 18       lea eax,dword ptr ss:[esp+0x18]            ; 取注册名MD5值奇数位  (ASCII "ca82e42a632b27df")
    100054C0    6A 10           push 0x10
    100054C2    8D4C24 10       lea ecx,dword ptr ss:[esp+0x10]
    100054C6    50              push eax
    100054C7    51              push ecx
    100054C8    8BCE            mov ecx,esi
    100054CA    E8 E1FCFFFF     call KeyData.100051B0                            ; 另一部分算法;对得到的新字符串(ASCII "ca82e42a632b27df")CRC32计算,并把CRC32值中的小写字母转化为大写
    100054CF    8D4C24 2C       lea ecx,dword ptr ss:[esp+0x2C]
    100054D3    C68424 04040000>mov byte ptr ss:[esp+0x404],0x2
    100054DB    E8 80E9FFFF     call KeyData.10003E60                     
    100054E0    8B5424 0C       mov edx,dword ptr ss:[esp+0xC]
    100054E4    8D4C24 2C       lea ecx,dword ptr ss:[esp+0x2C]
    100054E8    52              push edx                                                            ; (ASCII "592EC4E6")
    100054E9    C68424 08040000>mov byte ptr ss:[esp+0x408],0x3
    100054F1    E8 1AEAFFFF     call KeyData.10003F10
    100054F6    8D4C24 2C       lea ecx,dword ptr ss:[esp+0x2C]
    100054FA    E8 C1F5FFFF     call KeyData.10004AC0                               ; 对字符串“592EC4E6”MD5运算:(ASCII "34627bd1176ffb2a02f4abbf32eda834")
    100054FF    50              push eax
    10005500    8D4C24 0C       lea ecx,dword ptr ss:[esp+0xC]
    10005504    E8 E7010000     call KeyData.100056F0                              ; jmp 到 mfc42.#537
    10005509    8D4424 14       lea eax,dword ptr ss:[esp+0x14]
    1000550D    6A 08           push 0x8
    1000550F    50              push eax
    10005510    8D4C24 10       lea ecx,dword ptr ss:[esp+0x10]
    10005514    C68424 0C040000>mov byte ptr ss:[esp+0x40C],0x4
    1000551C    E8 23020000     call KeyData.10005744                                ; jmp 到 mfc42.#4129
    10005521    50              push eax
    10005522    8D4C24 0C       lea ecx,dword ptr ss:[esp+0xC]
    10005526    C68424 08040000>mov byte ptr ss:[esp+0x408],0x5
    1000552E    E8 93010000     call KeyData.100056C6                               ; jmp 到 mfc42.#858
    10005533    8D4C24 14       lea ecx,dword ptr ss:[esp+0x14]
    10005537    C68424 04040000>mov byte ptr ss:[esp+0x404],0x4
    1000553F    E8 7C010000     call KeyData.100056C0                                ; jmp 到 mfc42.#800
    10005544    8D4C24 08       lea ecx,dword ptr ss:[esp+0x8]
    10005548    E8 F1010000     call KeyData.1000573E                                 ; (取MD5值 ASCII "34627bd1176ffb2a02f4abbf32eda834") 取前8位并转为大写作为注册码  ASCII "34627BD1"
    1000554D    8BB424 0C040000 mov esi,dword ptr ss:[esp+0x40C]
    10005554    8D4C24 08       lea ecx,dword ptr ss:[esp+0x8]


    另一部分算法CRC32计算处 代码:
    100051B0    6A FF           push -0x1
    100051B2    68 5F610010     push KeyData.1000615F
    100051B7    64:A1 00000000  mov eax,dword ptr fs:[0]
    100051BD    50              push eax
    100051BE    64:8925 0000000>mov dword ptr fs:[0],esp
    100051C5    83EC 14         sub esp,0x14
    100051C8    55              push ebp
    100051C9    56              push esi
    100051CA    57              push edi                                                                 ; 用户名MD5值
    100051CB    8BF1            mov esi,ecx                                                           ; 注意ECX值
    100051CD    C74424 10 00000>mov dword ptr ss:[esp+0x10],0x0
    100051D5    E8 A6FFFFFF     call KeyData.10005180
    100051DA    8B7C24 38       mov edi,dword ptr ss:[esp+0x38]                   ; 设置计数器循环次数
    100051DE    8B4C24 34       mov ecx,dword ptr ss:[esp+0x34]                  ; 注册名MD5值奇数位 ASCII "ca82e42a632b27df")
    100051E2    83C8 FF         or eax,0xFFFFFFFF                                              ; EAX初始化为8个F即 -1
    100051E5    85FF            test edi,edi
    100051E7    7E 1B           jle short KeyData.10005204
    =========================《CRC32》=================================
    100051E9    8BE8            mov ebp,eax
    100051EB    33D2            xor edx,edx
    100051ED    8A11            mov dl,byte ptr ds:[ecx]                                 ; 依次取注册名MD5值奇数位的每一位
    100051EF    81E5 FF000000   and ebp,0xFF                                           ; 0xFF 为255即8个1
    100051F5    33EA            xor ebp,edx                                                     ; 异或运算
    100051F7    C1E8 08         shr eax,0x8                                                   ; eax右移8位相当于除8个2(EAX是32位的寄存器,前两个变为零)
    100051FA    8B54AE 04       mov edx,dword ptr ds:[esi+ebp*4+0x4]     ; 这里看不懂怎么来的,有可能是CRC32运算公式吧???懂这个的请指教
    100051FE    33C2            xor eax,edx
    10005200    41              inc ecx                                                               ; ecx自减1
    10005201    4F              dec edi                                                                ; 计数器,注册名MD5值奇数位 16个
    10005202  ^ 75 E5           jnz short KeyData.100051E9
    10005204    33C9            xor ecx,ecx
    10005206    8D5424 14       lea edx,dword ptr ss:[esp+0x14]                   ; (ASCII "gK")
    1000520A    894C24 15       mov dword ptr ss:[esp+0x15],ecx
    1000520E    6A 10           push 0x10
    10005210    F7D0            not eax                                                              ; 按位求反运算(即0变1,1变0)
    =========================《CRC32》=================================
    10005212    894C24 1D       mov dword ptr ss:[esp+0x1D],ecx
    10005216    52              push edx                                 ; (UNICODE "g")
    10005217    50              push eax
    10005218    C64424 20 00    mov byte ptr ss:[esp+0x20],0x0
    1000521D    884C24 29       mov byte ptr ss:[esp+0x29],cl
    10005221    FF15 00720010   call dword ptr ds:[0x10007200]           ; 把EAX中的值转化为字符串
    10005227    8D7C24 20       lea edi,dword ptr ss:[esp+0x20]               ; (ASCII "592ec4e6")
    1000522B    83C9 FF         or ecx,0xFFFFFFFF
    1000522E    33C0            xor eax,eax
    10005230    83C4 0C         add esp,0xC
    10005233    33F6            xor esi,esi
    10005235    F2:AE           repne scas byte ptr es:[edi]                          ; 扫描 ES:[EDI]字符串中的 AL值.值到找到AL值后停止
    10005237    F7D1            not ecx                                                       ; 把exc取反
    10005239    49              dec ecx                                                           ; 自减1
    1000523A    74 28           je short KeyData.10005264
    1000523C    8B2D C4710010   mov ebp,dword ptr ds:[0x100071C4]    ; 依次取“592ec4e6”这个字符串的每一位
    10005242    0FBE4434 14     movsx eax,byte ptr ss:[esp+esi+0x14]
    10005247    50              push eax
    10005248    FFD5            call ebp                                                            ; 字母小写转大写
    1000524A    884434 18       mov byte ptr ss:[esp+esi+0x18],al

    两组注册信息:
    注册名:GeekCat            --->    注册码:34627BD1
    注册名:GeekCat/P.Y.G  --->    注册码:04C3F43B

    ----------------------------------------------------------------------------------------------------------------------------
    【版权声明】:
    本文原创于GeekCat/P.Y.G,转载请注明作者及论坛并保存文章的完整!

    评分

    参与人数 1飘云币 +40 收起 理由
    GGLHY + 40 PYG有你更精彩!

    查看全部评分

    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2024-3-10 19:49
  • 签到天数: 473 天

    [LV.9]以坛为家II

    发表于 2015-5-10 12:06:41 | 显示全部楼层
    程序好像是delphi的,我自己都忘了
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2015-5-10 12:20:34 | 显示全部楼层
    这软件就是MD5 + CRC32的算法。。。

    只不过有个细节要处理下。这里我先不说~~看算法专题里是否需要讲一下。如果不讲,我再说下这个细节问题。

    赞一个~

    点评

    谢谢G大指教!!! 静待~~  详情 回复 发表于 2015-5-10 12:23
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-25 14:18
  • 签到天数: 881 天

    [LV.10]以坛为家III

     楼主| 发表于 2015-5-10 12:23:23 | 显示全部楼层
    GGLHY 发表于 2015-5-10 12:20
    这软件就是MD5 + CRC32的算法。。。

    只不过有个细节要处理下。这里我先不说~~看算法专题里是否需要讲 ...

    谢谢G大指教!!!
    静待~~
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    2021-9-29 15:05
  • 签到天数: 114 天

    [LV.6]常住居民II

    发表于 2015-5-10 13:27:01 | 显示全部楼层
    给力,都开始分析这个了,我还在看cm,
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2015-7-10 10:12:32 | 显示全部楼层
    100051FA    8B54AE 04       mov edx,dword ptr ds:[esi+ebp*4+0x4]     ; 这里看不懂怎么来的,有可能是CRC32运算公式吧???懂这个的请指教

    这里是CRC32自身的查表运算。
    PYG19周年生日快乐!
  • TA的每日心情

    2016-5-23 14:49
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2015-8-4 23:27:47 | 显示全部楼层
                     学习了 谢谢了
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表