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,转载请注明作者及论坛并保存文章的完整!
程序好像是delphi的,我自己都忘了 这软件就是MD5 + CRC32的算法。。。
只不过有个细节要处理下。这里我先不说~~看算法专题里是否需要讲一下。如果不讲,我再说下这个细节问题。
赞一个~ GGLHY 发表于 2015-5-10 12:20
这软件就是MD5 + CRC32的算法。。。
只不过有个细节要处理下。这里我先不说~~看算法专题里是否需要讲 ...
谢谢G大指教!!!
静待~~
给力,都开始分析这个了,我还在看cm, 100051FA 8B54AE 04 mov edx,dword ptr ds: ; 这里看不懂怎么来的,有可能是CRC32运算公式吧???懂这个的请指教
这里是CRC32自身的查表运算。 学习了 谢谢了
页:
[1]