雨杰合同管理软件 V6.0 追码、DUP、算法分析
本帖最后由 geekcat 于 2014-6-27 08:57 编辑【文章标题】:雨杰合同管理软件 V6.0 追码、DUP、算法分析【文章作者】: geekcat
【作者邮箱】: [email protected]
【作者主页】:
【软件名称】: 雨杰合同管理软件 V6.0
【软件大小】: 3.58 MB (3,764,631 字节)
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Borland C++ 1999
【使用工具】: OD、PEID
【操作平台】: XP SP3【下载地址】:http://www.qp35.com/【破解声明】:破解在于交流思路和过程,结果并不重要,请不要用于非法用途;
【软件介绍】:完善的合同管理是公司健康运作的一个重要标志。雨杰合同管理软件简单易用,可方便的帮助你对供货商和客户的合同进行管理,协助您完成应收应付款分析,自动统计所有供货商和客户的应收应付款额,为您大大节省工作时间,提高工作效率。雨杰合同管理软件将是您明智的选择 。【破解声明】:PYG第九轮作业4--------------------------------------------------------------------------------------------------------------------------------【破解过程】
1、运行程序输入注册信息点击“注册”提示重启验证输入的注册信息是否正确;2、在软件的安装目录下找是否有保存注册信息没有找到,搜索注册表找到注册前面输入的注册信息;如下图:
3、打开插件“ApiBrieak”把注册表里面的全部六个断点都下好(调式没办法只好全部下)经过调试下“RegQueryValueExA”就可以了;注意右下角的堆栈窗口接着就是不停按F9直到如下处停下:
4、在出现“ValueName = "Name"”或“ValueName = "Pass"处“Alt+F9“返回程序领空,但要多次“Alt+F9“返回程序领空,我们就在出现“ValueName = "Date"返回;因为这三个注册表键值“Data”最后出现;5、返回后直接F8向下跑如可以看到明码:
6、F7进算法CALL:代码:
00677158/$55 push ebp ;算法CALL00677159|.8BEC mov ebp,esp0067715B|.51 push ecx0067715C|.B9 04000000 mov ecx,0x400677161|>6A 00 /push 0x000677163|.6A 00 |push 0x000677165|.49 |dec ecx00677166|.^ 75 F9 \jnz short Pact.0067716100677168|.51 push ecx00677169|.874D FC xchg dword ptr ss:,ecx0067716C|.53 push ebx0067716D|.56 push esi0067716E|.57 push edi0067716F|.8BF9 mov edi,ecx00677171|.8955 FC mov dword ptr ss:,edx ;注册名入ebp-0x4 (ASCII "GeekCat")00677174|.8B45 FC mov eax,dword ptr ss:00677177|.E8 D0DDD8FF call Pact.00404F4C0067717C|.33C0 xor eax,eax0067717E|.55 push ebp0067717F|.68 19736700 push Pact.0067731900677184|.64:FF30 push dword ptr fs:00677187|.64:8920 mov dword ptr fs:,esp0067718A|.8BC7 mov eax,edi0067718C|.E8 FBD8D8FF call Pact.00404A8C00677191|.8B45 FC mov eax,dword ptr ss: ;注册名入eax(ASCII "GeekCat")00677194|.E8 C3DBD8FF call Pact.00404D5C ;取注册名的长度00677199|.8BF0 mov esi,eax0067719B|.85F6 test esi,esi0067719D|.7E 26 jle short Pact.006771C50067719F|.BB 01000000 mov ebx,0x1006771A4|>8D4D EC /lea ecx,dword ptr ss:006771A7|.8B45 FC |mov eax,dword ptr ss:006771AA|.0FB64418 FF |movzx eax,byte ptr ds: ;取注册名的每一位006771AF|.33D2 |xor edx,edx006771B1|.E8 E630D9FF |call Pact.0040A29C ;每一位的ASCII码值006771B6|.8B55 EC |mov edx,dword ptr ss:006771B9|.8D45 F8 |lea eax,dword ptr ss:006771BC|.E8 A3DBD8FF |call Pact.00404D64 ;把第一位的ASICC码值链接一起006771C1|.43 |inc ebx006771C2|.4E |dec esi006771C3|.^ 75 DF \jnz short Pact.006771A4006771C5|>8B45 F8 mov eax,dword ptr ss: ;ASCII链接在一起(ASCII "4765656B436174")设为A006771C8|.E8 8FDBD8FF call Pact.00404D5C006771CD|.8BF0 mov esi,eax006771CF|.85F6 test esi,esi006771D1|.7E 2C jle short Pact.006771FF006771D3|.BB 01000000 mov ebx,0x1006771D8|>8B45 F8 /mov eax,dword ptr ss:006771DB|.E8 7CDBD8FF |call Pact.00404D5C006771E0|.2BC3 |sub eax,ebx006771E2|.8B55 F8 |mov edx,dword ptr ss:006771E5|.8A1402 |mov dl,byte ptr ds:006771E8|.8D45 E8 |lea eax,dword ptr ss:006771EB|.E8 84DAD8FF |call Pact.00404C74006771F0|.8B55 E8 |mov edx,dword ptr ss:006771F3|.8D45 F4 |lea eax,dword ptr ss:006771F6|.E8 69DBD8FF |call Pact.00404D64006771FB|.43 |inc ebx006771FC|.4E |dec esi006771FD|.^ 75 D9 \jnz short Pact.006771D8 ;循环把前面得到的A字符串倒序 (ASCII "471634B6565674") 设为B006771FF|>8D45 F8 lea eax,dword ptr ss:00677202|.50 push eax00677203|.B9 04000000 mov ecx,0x400677208|.BA 01000000 mov edx,0x10067720D|.8B45 F4 mov eax,dword ptr ss:00677210|.E8 A7DDD8FF call Pact.00404FBC00677215|.8D45 F4 lea eax,dword ptr ss:00677218|.50 push eax00677219|.B9 04000000 mov ecx,0x40067721E|.BA 05000000 mov edx,0x500677223|.8B45 F4 mov eax,dword ptr ss:00677226|.E8 91DDD8FF call Pact.00404FBC ;取字符串B的前四位(ASCII "4716")0067722B|.8B45 F8 mov eax,dword ptr ss:0067722E|.E8 29DBD8FF call Pact.00404D5C00677233|.83F8 04 cmp eax,0x4 ;把取得的字符串跟4比较00677236|.7D 2F jge short Pact.0067726700677238|.8B45 F8 mov eax,dword ptr ss:0067723B|.E8 1CDBD8FF call Pact.00404D5C ;把不够4位的字符串计算00677240|.8BD8 mov ebx,eax00677242|.83FB 03 cmp ebx,0x3 ;把取得的字符串跟3比较 不够三位通过下面的循环来计算00677245|.7F 20 jg short Pact.0067726700677247|>8D4D E4 /lea ecx,dword ptr ss:0067724A|.8BC3 |mov eax,ebx0067724C|.C1E0 02 |shl eax,0x20067724F|.33D2 |xor edx,edx00677251|.E8 4630D9FF |call Pact.0040A29C00677256|.8B55 E4 |mov edx,dword ptr ss:00677259|.8D45 F8 |lea eax,dword ptr ss:0067725C|.E8 03DBD8FF |call Pact.00404D6400677261|.43 |inc ebx00677262|.83FB 04 |cmp ebx,0x400677265|.^ 75 E0 \jnz short Pact.0067724700677267|>8B45 F4 mov eax,dword ptr ss: ;取字符串B的5-8位 (ASCII "34B6") 设为C0067726A|.E8 EDDAD8FF call Pact.00404D5C0067726F|.83F8 04 cmp eax,0x400677272|.7D 2F jge short Pact.006772A300677274|.8B45 F4 mov eax,dword ptr ss:00677277|.E8 E0DAD8FF call Pact.00404D5C0067727C|.8BD8 mov ebx,eax0067727E|.83FB 03 cmp ebx,0x300677281|.7F 20 jg short Pact.006772A300677283|>8D4D E0 /lea ecx,dword ptr ss:00677286|.8BC3 |mov eax,ebx00677288|.C1E0 02 |shl eax,0x20067728B|.33D2 |xor edx,edx0067728D|.E8 0A30D9FF |call Pact.0040A29C00677292|.8B55 E0 |mov edx,dword ptr ss:00677295|.8D45 F4 |lea eax,dword ptr ss:00677298|.E8 C7DAD8FF |call Pact.00404D640067729D|.43 |inc ebx0067729E|.83FB 04 |cmp ebx,0x4006772A1|.^ 75 E0 \jnz short Pact.00677283 ;这个循环跟取B前四个字符串一样的计算006772A3|>8D45 F0 lea eax,dword ptr ss:006772A6|.BA 30736700 mov edx,Pact.00677330 ;固定字符串 pactr954dj5 入edx006772AB|.E8 74D8D8FF call Pact.00404B24006772B0|.8D45 DC lea eax,dword ptr ss:006772B3|.50 push eax006772B4|.B9 04000000 mov ecx,0x4006772B9|.BA 01000000 mov edx,0x1006772BE|.8B45 F0 mov eax,dword ptr ss:006772C1|.E8 F6DCD8FF call Pact.00404FBC ;取固定字符串的 前4位pact 设为E006772C6|.FF75 DC push dword ptr ss:006772C9|.68 44736700 push Pact.00677344 ;-006772CE|.FF75 F8 push dword ptr ss: ;字符串B(ASCII "4716")006772D1|.8D45 D8 lea eax,dword ptr ss:006772D4|.50 push eax006772D5|.B9 05000000 mov ecx,0x5006772DA|.BA 05000000 mov edx,0x5006772DF|.8B45 F0 mov eax,dword ptr ss:006772E2|.E8 D5DCD8FF call Pact.00404FBC ;固定字符串 pactr954dj5 的5-9位字符串 r954d 设为D006772E7|.FF75 D8 push dword ptr ss:006772EA|.68 44736700 push Pact.00677344 ;-006772EF|.FF75 F4 push dword ptr ss: ;字符串C (ASCII "34B6")006772F2|.8BC7 mov eax,edi006772F4|.BA 06000000 mov edx,0x6006772F9|.E8 1EDBD8FF call Pact.00404E1C006772FE|.33C0 xor eax,eax00677300|.5A pop edx00677301|.59 pop ecx00677302|.59 pop ecx00677303|.64:8910 mov dword ptr fs:,edx00677306|.68 20736700 push Pact.006773200067730B|>8D45 D8 lea eax,dword ptr ss:0067730E|.BA 0A000000 mov edx,0xA00677313|.E8 98D7D8FF call Pact.00404AB000677318\.C3 retn
算法分析 1、取用户名的ASCII码 4765656B436174 2、再倒取ASCII码 471634B6565674 3、取固定码 pactr954dj5的前4位 pact 4、连接符 - 5、取倒取ASCII码的前4位和固定字符串的5-9位 4716r954d 6、连接符 - 7、取倒取ASCII码的5-8位 34B6 8、得到注册码:
注册信:GeekCat注册码:pact-4716r954d-34B6
说明:算法分析部分参照第九期学员:lixy8888学习分析算法,追码部分是自己完成;----------------------------------------------------------------------------------------------------------------------------【破解总结】:1、字符串没加密,容易切入注册验证流程中;2、注册信息明文保存,要改进;3、注册码明文出现寄存器里,这点要改进应该加密;----------------------------------------------------------------------------------------------------------------------------【版权声明】:本文原创于geekcat,转载请注明作者并保存文章的完整!
附:正在学习用DUP,把“patch”和“loader”当作练习;
没见过ASCIII,只见过ASCII。{:tongue:} DaShanRen 发表于 2014-6-26 21:49
没见过ASCIII,只见过ASCII。
{:shy:}
修改了,谢谢提醒!!
{:sad:}{:shocked:}这些是好犀利的,我们都在学习!! 路过必顶,谢谢分享。 谢谢分享,下来看下。
页:
[1]