GeekCat 发表于 2015-5-10 11:31:12

ClipNow V4.7 算法分析

本帖最后由 geekcat 于 2015-5-10 11:50 编辑

【文章标题】:ClipNow V4.7算法分析【文章作者】: GeekCat
【作者邮箱】: [email protected]
【作者主页】:
【软件名称】: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【下载地址】: http://www.onlinedown.net/soft/97336.htm【破解声明】:破解在于交流思路和过程,结果并不重要,请不要用于非法用途;
【软件介绍】:“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:          ; 输入的假码(ASCII "1234567890")10004FBE    8B4424 14       mov eax,dword ptr ss:          ; 真注册码(ASCII "34627BD1")10004FC2    52            push edx
算法CALL代码:10005420    6A FF         push -0x110005422    68 E1610010   push KeyData.100061E110005427    64:A1 00000000mov eax,dword ptr fs:1000542D    50            push eax1000542E    64:8925 0000000>mov dword ptr fs:,esp10005435    81EC F4030000   sub esp,0x3F41000543B    56            push esi1000543C    8BF1            mov esi,ecx1000543E    57            push edi1000543F    8D8C24 14020000 lea ecx,dword ptr ss:10005446    C74424 10 00000>mov dword ptr ss:,0x01000544E    E8 0DEAFFFF   call KeyData.10003E6010005453    8B8424 10040000 mov eax,dword ptr ss:      ; (ASCII "GeekCat")1000545A    8D8C24 14020000 lea ecx,dword ptr ss:10005461    50            push eax10005462    C78424 08040000>mov dword ptr ss:,0x11000546D    E8 9EEAFFFF   call KeyData.10003F10                              ; 把注册名进行MD5运算10005472    8D8C24 14020000 lea ecx,dword ptr ss:10005479    E8 42F6FFFF   call KeyData.10004AC0                               ; 用户名MD51000547E    33C9            xor ecx,ecx10005480    8BF8            mov edi,eax                                                      ; (ASCII "c4a88422ee4b2eaf6a3426bd277dd9ff")10005482    894C24 19       mov dword ptr ss:,ecx10005486    C64424 18 00    mov byte ptr ss:,0x01000548B    894C24 1D       mov dword ptr ss:,ecx1000548F    894C24 21       mov dword ptr ss:,ecx10005493    894C24 25       mov dword ptr ss:,ecx10005497    8BD1            mov edx,ecx                                          ; 下面这个循环就是取注册名MD5值奇数位 得到字符串 (ASCII "ca82e42a632b27df")10005499    81E2 01000080   and edx,0x80000001                     ; 结果的最高位为1,是负数—SF=1,结果非零——ZF=01000549F    79 05         jns short KeyData.100054A6                  ; S标志位为零就跳转100054A1    4A            dec edx                                                       ; 自减1100054A2    83CA FE         or edx,0xFFFFFFFE                                  ; 与1-做或运算100054A5    42            inc edx                                                      ; 自加1100054A6    75 0E         jnz short KeyData.100054B6                     ; Z标示位为零就跳转100054A8    8BC1            mov eax,ecx100054AA    99            cdq                                                               ; EDX清零100054AB    2BC2            sub eax,edx                                                ; 减法操作100054AD    8A1439          mov dl,byte ptr ds:                   ; 依次取MD5值的每一们100054B0    D1F8            sar eax,1                                                    ; 算术右移一位相当于除2100054B2    885404 18       mov byte ptr ss:,dl100054B6    41            inc ecx                                                          ; ecx自加1100054B7    83F9 20         cmp ecx,0x20                                           ; 与0x20即32比较,把整个MD5值取完100054BA^ 7C DB         jl short KeyData.10005497                     ; 小于就跳转100054BC    8D4424 18       lea eax,dword ptr ss:            ; 取注册名MD5值奇数位(ASCII "ca82e42a632b27df")100054C0    6A 10         push 0x10100054C2    8D4C24 10       lea ecx,dword ptr ss:100054C6    50            push eax100054C7    51            push ecx100054C8    8BCE            mov ecx,esi100054CA    E8 E1FCFFFF   call KeyData.100051B0                            ; 另一部分算法;对得到的新字符串(ASCII "ca82e42a632b27df")CRC32计算,并把CRC32值中的小写字母转化为大写100054CF    8D4C24 2C       lea ecx,dword ptr ss:100054D3    C68424 04040000>mov byte ptr ss:,0x2100054DB    E8 80E9FFFF   call KeyData.10003E60                     100054E0    8B5424 0C       mov edx,dword ptr ss:100054E4    8D4C24 2C       lea ecx,dword ptr ss:100054E8    52            push edx                                                            ; (ASCII "592EC4E6")100054E9    C68424 08040000>mov byte ptr ss:,0x3100054F1    E8 1AEAFFFF   call KeyData.10003F10100054F6    8D4C24 2C       lea ecx,dword ptr ss:100054FA    E8 C1F5FFFF   call KeyData.10004AC0                               ; 对字符串“592EC4E6”MD5运算:(ASCII "34627bd1176ffb2a02f4abbf32eda834")100054FF    50            push eax10005500    8D4C24 0C       lea ecx,dword ptr ss:10005504    E8 E7010000   call KeyData.100056F0                              ; jmp 到 mfc42.#53710005509    8D4424 14       lea eax,dword ptr ss:1000550D    6A 08         push 0x81000550F    50            push eax10005510    8D4C24 10       lea ecx,dword ptr ss:10005514    C68424 0C040000>mov byte ptr ss:,0x41000551C    E8 23020000   call KeyData.10005744                              ; jmp 到 mfc42.#412910005521    50            push eax10005522    8D4C24 0C       lea ecx,dword ptr ss:10005526    C68424 08040000>mov byte ptr ss:,0x51000552E    E8 93010000   call KeyData.100056C6                               ; jmp 到 mfc42.#85810005533    8D4C24 14       lea ecx,dword ptr ss:10005537    C68424 04040000>mov byte ptr ss:,0x41000553F    E8 7C010000   call KeyData.100056C0                              ; jmp 到 mfc42.#80010005544    8D4C24 08       lea ecx,dword ptr ss:10005548    E8 F1010000   call KeyData.1000573E                                 ; (取MD5值 ASCII "34627bd1176ffb2a02f4abbf32eda834") 取前8位并转为大写作为注册码ASCII "34627BD1"1000554D    8BB424 0C040000 mov esi,dword ptr ss:10005554    8D4C24 08       lea ecx,dword ptr ss:

另一部分算法CRC32计算处 代码:100051B0    6A FF         push -0x1100051B2    68 5F610010   push KeyData.1000615F100051B7    64:A1 00000000mov eax,dword ptr fs:100051BD    50            push eax100051BE    64:8925 0000000>mov dword ptr fs:,esp100051C5    83EC 14         sub esp,0x14100051C8    55            push ebp100051C9    56            push esi100051CA    57            push edi                                                               ; 用户名MD5值100051CB    8BF1            mov esi,ecx                                                         ; 注意ECX值100051CD    C74424 10 00000>mov dword ptr ss:,0x0100051D5    E8 A6FFFFFF   call KeyData.10005180100051DA    8B7C24 38       mov edi,dword ptr ss:                   ; 设置计数器循环次数100051DE    8B4C24 34       mov ecx,dword ptr ss:                  ; 注册名MD5值奇数位 ASCII "ca82e42a632b27df")100051E2    83C8 FF         or eax,0xFFFFFFFF                                              ; EAX初始化为8个F即 -1100051E5    85FF            test edi,edi100051E7    7E 1B         jle short KeyData.10005204=========================《CRC32》=================================100051E9    8BE8            mov ebp,eax100051EB    33D2            xor edx,edx100051ED    8A11            mov dl,byte ptr ds:                                 ; 依次取注册名MD5值奇数位的每一位100051EF    81E5 FF000000   and ebp,0xFF                                           ; 0xFF 为255即8个1100051F5    33EA            xor ebp,edx                                                   ; 异或运算100051F7    C1E8 08         shr eax,0x8                                                   ; eax右移8位相当于除8个2(EAX是32位的寄存器,前两个变为零)100051FA    8B54AE 04       mov edx,dword ptr ds:   ; 这里看不懂怎么来的,有可能是CRC32运算公式吧???懂这个的请指教100051FE    33C2            xor eax,edx10005200    41            inc ecx                                                               ; ecx自减110005201    4F            dec edi                                                                ; 计数器,注册名MD5值奇数位 16个10005202^ 75 E5         jnz short KeyData.100051E910005204    33C9            xor ecx,ecx10005206    8D5424 14       lea edx,dword ptr ss:                   ; (ASCII "gK")1000520A    894C24 15       mov dword ptr ss:,ecx1000520E    6A 10         push 0x1010005210    F7D0            not eax                                                            ; 按位求反运算(即0变1,1变0)=========================《CRC32》=================================10005212    894C24 1D       mov dword ptr ss:,ecx10005216    52            push edx                                 ; (UNICODE "g")10005217    50            push eax10005218    C64424 20 00    mov byte ptr ss:,0x01000521D    884C24 29       mov byte ptr ss:,cl10005221    FF15 00720010   call dword ptr ds:         ; 把EAX中的值转化为字符串10005227    8D7C24 20       lea edi,dword ptr ss:               ; (ASCII "592ec4e6")1000522B    83C9 FF         or ecx,0xFFFFFFFF1000522E    33C0            xor eax,eax10005230    83C4 0C         add esp,0xC10005233    33F6            xor esi,esi10005235    F2:AE         repne scas byte ptr es:                        ; 扫描 ES:字符串中的 AL值.值到找到AL值后停止10005237    F7D1            not ecx                                                       ; 把exc取反10005239    49            dec ecx                                                         ; 自减11000523A    74 28         je short KeyData.100052641000523C    8B2D C4710010   mov ebp,dword ptr ds:    ; 依次取“592ec4e6”这个字符串的每一位10005242    0FBE4434 14   movsx eax,byte ptr ss:10005247    50            push eax10005248    FFD5            call ebp                                                            ; 字母小写转大写1000524A    884434 18       mov byte ptr ss:,al
两组注册信息:
注册名:GeekCat            --->    注册码:34627BD1
注册名:GeekCat/P.Y.G--->    注册码:04C3F43B

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

Dxer 发表于 2015-5-10 12:06:41

程序好像是delphi的,我自己都忘了

GGLHY 发表于 2015-5-10 12:20:34

这软件就是MD5 + CRC32的算法。。。

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

赞一个~

GeekCat 发表于 2015-5-10 12:23:23

GGLHY 发表于 2015-5-10 12:20
这软件就是MD5 + CRC32的算法。。。

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

谢谢G大指教!!!
静待~~

0xcb 发表于 2015-5-10 13:27:01

给力,都开始分析这个了,我还在看cm,

GGLHY 发表于 2015-7-10 10:12:32

100051FA    8B54AE 04       mov edx,dword ptr ds:   ; 这里看不懂怎么来的,有可能是CRC32运算公式吧???懂这个的请指教
这里是CRC32自身的查表运算。

发现我影响你 发表于 2015-8-4 23:27:47

               学习了 谢谢了
页: [1]
查看完整版本: ClipNow V4.7 算法分析