Charlie 发表于 2011-9-29 13:45

分析某文件夹设置软件破文

本帖最后由 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

Charlie 发表于 2011-9-29 13:45

(*^__^*) 嘻嘻……自己的沙发

Emil 发表于 2011-10-1 22:35

顶一个 !~支持 谢谢分享

natdon 发表于 2011-10-2 14:08

来学习一下,以前也破过一个类似的
页: [1]
查看完整版本: 分析某文件夹设置软件破文