分析某文件夹设置软件破文
本帖最后由 Charlie 于 2011-9-29 13:50 编辑【文章标题】: 分析文件夹设置软件破文
【文章作者】: Charlie
【作者邮箱】: charlie1992@qq.com
【作者主页】: http://2403320793.qzone.qq.com
【作者QQ号】: 2403320793
【软件名称】: 文件夹设置软件
【软件大小】: 1.23 MB
【下载地址】: http://thenlong.myetang.com/mysoft/fs0810.exe
【加壳方式】: UPX 0.89.6 - 1.02 / 1.05 - 2.90 ->
【保护方式】: 压缩壳
【编写语言】: Borland Delphi 6.0 - 7.0
【使用工具】: Od PEID keymake
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
PEDI查下壳 UPX 0.89.6 - 1.02 / 1.05 - 2.90
对于这壳相信 不需要说怎么脱了吧....
OK 我们打开脱壳后的Unpack.exe 发现(软件输入注册码)无法输入且确定按钮是灰色的
这种类型的软件应该会有标记,我们运行Regmon(注册表监视软件)File monitor(检测程序读取硬盘什么文件)
监视软件打开后 正常运行unpack 发现 程序读取了它目录下的fs.ini文件 OK 我们打开来看下
RegName=
RegCode=RegCode
这里为注册名信息 我们把这里改为 RegName= Charlie
修改保存之后 我们把程序载入OD F9运行在输入注册号码那里 发现注册名显示的是Charlie
我们这时候随便输入注册号 123456789 点击确定 提示 该注册号已被别人用过....
此时 F12 ALT+K 找到 0012F31C 0045E067 ?<Jmp.user32.Messageboxa>文件夹设 0045E062
双击进入此调用CALL朝下找
0045E0D0\.C3 retn
0045E0D1 .^ E9 925DFAFF jmp 00403E68
0045E0D6 .^ EB 9F jmp short 0045E077
0045E0D8 .8B45 F8 mov eax, dword ptr
0045E0DB .5F pop edi
0045E0DC .5E pop esi
0045E0DD .5B pop ebx
0045E0DE .8BE5 mov esp, ebp
0045E0E0 .5D pop ebp
0045E0E1 .C2 0400 retn 4 这里下断 F9运行OD 点确定 断在这里此时F8单步向下走
来到这里
00494893 B8 54494900 mov eax, 00494954
00494898 E8 9BFDFFFF call 00494638
0049489D 33C0 xor eax, eax
0049489F 5A pop edx
004948A0 59 pop ecx
004948A1 59 pop ecx
004948A2 64:8910 mov dword ptr fs:, edx
我们上翻找到此处的断首
004947F7 55 push ebp 此处断首下断
004947F8 68 B8484900 push 004948B8
004947FD 64:FF30 push dword ptr fs:
00494800 64:8920 mov dword ptr fs:, esp
00494803 8D55 FC lea edx, dword ptr
00494806 8B83 F4020000 mov eax, dword ptr
F9 运行 点击确定 程序断在 004947F7 我们F8向下跟踪分析下代码
00494803 8D55 FC lea edx, dword ptr
00494806 8B83 F4020000 mov eax, dword ptr
0049480C E8 1796FAFF call 0043DE28
00494811 8D55 F8 lea edx, dword ptr
00494814 8B83 F8020000 mov eax, dword ptr
0049481A E8 0996FAFF call 0043DE28
0049481F 837D F8 00 cmp dword ptr , 0 比较是否输入用户名 如无 确定不可用
00494823 74 6E je short 00494893 如有则继续
00494825 8D55 F4 lea edx, dword ptr
00494828 8B45 FC mov eax, dword ptr
0049482B E8 70FEFFFF call 004946A0 此算法CALL 为把我们输入的用户名放到EAX算出注册码
00494830 8B45 F8 mov eax, dword ptr 经过算法CALL 算出真码放入EDX
00494833 8B55 F4 mov edx, dword ptr 假码 真码进行比较 00494836出现真码
00494836 E8 8500F7FF call 004048C0 取此处信息用Keymack即可做注册机
0049483B 75 4A jnz short 00494887 相等则成功 不相等则失败
0049483D 8B45 F8 mov eax, dword ptr
00494840 50 push eax
00494841 A1 A85C4A00 mov eax, dword ptr
00494846 8B00 mov eax, dword ptr
00494848 B9 D0484900 mov ecx, 004948D0 ; ASCII "RegCode"
0049484D BA E0484900 mov edx, 004948E0 ; ASCII "Setting"
我们F7跟进 0049482B CALL
004946A0/$55 push ebp
004946A1|.8BEC mov ebp, esp
004946A3|.83C4 F8 add esp, -8
004946A6|.53 push ebx
004946A7|.56 push esi
004946A8|.57 push edi 取输入用户名的位数 放入EAX
004946A9|.8955 F8 mov dword ptr , edx 输入用户名的位数移到Edi
004946AC|.8945 FC mov dword ptr , eax
004946AF|.8B45 FC mov eax, dword ptr
004946B2|.E8 AD02F7FF call 00404964
004946B7|.33C0 xor eax, eax
004946B9|.55 push ebp
004946BA|.68 29474900 push 00494729
004946BF|.64:FF30 push dword ptr fs:
004946C2|.64:8920 mov dword ptr fs:, esp
004946C5|.8B45 FC mov eax, dword ptr
004946C8|.E8 AF00F7FF call 0040477C
004946CD|.8BF8 mov edi, eax
004946CF|.85FF test edi, edi 检测是否有输入
004946D1|.7E 35 jle short 00494708 有输入则继续
004946D3|.BE 01000000 mov esi, 1 1赋值给esi
004946D8|>8B45 FC /mov eax, dword ptr 用户名放入EAX
004946DB|.8A5C30 FF |mov bl, byte ptr 依次取用户名每位的十六制放入bl
004946DF|.33C0 |xor eax, eax 清零
004946E1|.8AC3 |mov al, bl EAX清零 且将前面取的用户名某位的十六制移到Al
004946E3|.83F8 4F |cmp eax, 4F 比较用户名对应的十六进制是否大于4F
004946E6|.7F 07 |jg short 004946EF 若大于则跳到4946EF 若小于继续运行计算
004946E8|.03C0 |add eax, eax Eax×2
004946EA|.83E8 1F |sub eax, 1F eax-1值放到eax
004946ED|.EB 07 |jmp short 004946F6 跳到4946F6 继续循环计算
004946EF|>03C0 |add eax, eax
004946F1|.2D 80000000 |sub eax, 80
004946F6|>8BD8 |mov ebx, eax 每一位都计算完毕后,得到的值移到ebx
004946F8|.8D45 FC |lea eax, dword ptr
004946FB|.E8 CC02F7FF |call 004049CC
00494700|.885C30 FF |mov byte ptr , bl 每一位用户名算后的值 放在替换原来那一位的值
00494704|.46 |inc esi esi加1
00494705|.4F |dec edi edi减一
00494706|.^ 75 D0 \jnz short 004946D8 计算完毕 跳出循环
00494708|>8B45 F8 mov eax, dword ptr
0049470B|.8B55 FC mov edx, dword ptr
0049470E|.E8 05FEF6FF call 00404518
00494713|.33C0 xor eax, eax
00494715|.5A pop edx
00494716|.59 pop ecx
00494717|.59 pop ecx
00494718|.64:8910 mov dword ptr fs:, edx
0049471B|.68 30474900 push 00494730
00494720|>8D45 FC lea eax, dword ptr
00494723|.E8 9CFDF6FF call 004044C4
00494728\.C3 retn
00494729 .^ E9 3AF7F6FF jmp 00403E68
0049472E .^ EB F0 jmp short 00494720
00494730 .5F pop edi
00494731 .5E pop esi
00494732 .5B pop ebx
00494733 .59 pop ecx
00494734 .59 pop ecx
00494735 .5D pop ebp
00494736 .C3 retn
最后得到
用户名:Charlie
注册码:gPBdXRJ
00494836|.E8 8500F7FF call 004048C0EDX
中断地址 494836
中断次数 1
第一字节 E8
指令长度 5
保存内存方式 为寄存器EDX
keygen到这里就完美结束了 当然了 追码到494836 即可 我追下来的目的只是学习交流而已.
额系小菜一个,大虾游走的啦....
--------------------------------------------------------------------------------
【版权声明】: 本文原创于Charlie, 转载请注明作者并保持文章的完整, 谢谢!
2011年09月29日 13:09:48
(*^__^*) 嘻嘻……自己的沙发 顶一个 !~支持 谢谢分享
来学习一下,以前也破过一个类似的
页:
[1]