飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 4070|回复: 8

[原创] Fast Folder Access 1.8.3 算法分析

[复制链接]

该用户从未签到

发表于 2014-9-4 18:51:52 | 显示全部楼层 |阅读模式
本帖最后由 goushibee 于 2014-9-6 18:44 编辑

算法部分:
1.用户名'goushibee'
中文编码GBK


004866C7  |.  E8 D0CEFCFF   call fastfold.0045359C
004866CC  |.  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]                  ;  取用户名
004866CF  |.  E8 94DCF7FF   call fastfold.00404368
004866D4  |.  83F8 07       cmp eax,0x7                                     ;  超过0x7就跳
004866D7  |.  7D 3E         jge Xfastfold.00486717
name要大于7


004867DD  |.  3BF8          cmp edi,eax                                     ;  用户名全部都一样死
004867DF  |.  7E 3B         jle Xfastfold.0048681C                          ;  跳



00486B48  |> /8D45 F4       /lea eax,dword ptr ss:[ebp-0xC]
00486B4B  |. |E8 70DAF7FF   |call fastfold.004045C0
00486B50  |. |8B55 F4       |mov edx,dword ptr ss:[ebp-0xC]
00486B53  |. |8A541A FF     |mov dl,byte ptr ds:[edx+ebx-0x1]
00486B57  |. |8B4D F4       |mov ecx,dword ptr ss:[ebp-0xC]
00486B5A  |. |321419        |xor dl,byte ptr ds:[ecx+ebx]                   ;  第一位和第二位xor(接着第二位和第三位)
00486B5D  |. |885418 FF     |mov byte ptr ds:[eax+ebx-0x1],dl
00486B61  |. |43            |inc ebx
00486B62  |. |4E            |dec esi
00486B63  |.^\75 E3         \jnz Xfastfold.00486B48                         ;  到最后一位


00486B6D  |.  8B55 F4       mov edx,dword ptr ss:[ebp-0xC]
00486B70  |.  8A543A FF     mov dl,byte ptr ds:[edx+edi-0x1]
00486B74  |.  8B4D F4       mov ecx,dword ptr ss:[ebp-0xC]
00486B77  |.  3211          xor dl,byte ptr ds:[ecx]
00486B79  |.  885438 FF     mov byte ptr ds:[eax+edi-0x1],dl                ;最后一位放(最后一位和变化后的第一位xor的结果)


得到
08 1A 06 1B 01 0B 07 00 6D


2.向后移动一位,移动后最后一位给第一位
00486C87  |> /8D45 FC       /lea eax,dword ptr ss:[ebp-0x4]
00486C8A  |. |E8 31D9F7FF   |call fastfold.004045C0
00486C8F  |. |8B55 FC       |mov edx,dword ptr ss:[ebp-0x4]
00486C92  |. |8A541A FE     |mov dl,byte ptr ds:[edx+ebx-0x2]
00486C96  |. |885418 FF     |mov byte ptr ds:[eax+ebx-0x1],dl
00486C9A  |. |4B            |dec ebx
00486C9B  |. |83FB 01       |cmp ebx,0x1
00486C9E  |.^\75 E7         \jnz Xfastfold.00486C87                         ;  向后移位
00486CA0  |>  8B45 FC       mov eax,dword ptr ss:[ebp-0x4]
00486CA3  |.  E8 C0D6F7FF   call fastfold.00404368
00486CA8  |.  8B55 FC       mov edx,dword ptr ss:[ebp-0x4]
00486CAB  |.  8A5C02 FF     mov bl,byte ptr ds:[edx+eax-0x1]                ;  最后一位给第一位
00486CAF  |.  8D45 FC       lea eax,dword ptr ss:[ebp-0x4]
00486CB2  |.  E8 09D9F7FF   call fastfold.004045C0
00486CB7  |.  8818          mov byte ptr ds:[eax],bl                        ;  最后一位给第一位
00486CB9  |.  8D55 E8       lea edx,dword ptr ss:[ebp-0x18]

得到
00 08 1A 06 1B 01 0B 07 00



3.用步骤二的结果进行md5
0x00,0x08,0x1A,0x06,0x1B,0x01,0x0B,0x07,0x00


00486CBF  |.  E8 A8F6FFFF   call fastfold.0048636C                          ;  md5    把变化之后的值进行md5


4.取md5加密后的前A位非字母的数
00486CF4  |> /8B45 FC       /mov eax,dword ptr ss:[ebp-0x4]
00486CF7  |. |8A4418 FF     |mov al,byte ptr ds:[eax+ebx-0x1]
00486CFB  |. |3C 30         |cmp al,0x30
00486CFD  |. |72 29         |jb Xfastfold.00486D28
00486CFF  |. |3C 39         |cmp al,0x39
00486D01  |. |77 25         |ja Xfastfold.00486D28
00486D03  |. |8D45 E4       |lea eax,dword ptr ss:[ebp-0x1C]
00486D06  |. |8B55 FC       |mov edx,dword ptr ss:[ebp-0x4]
00486D09  |. |8A541A FF     |mov dl,byte ptr ds:[edx+ebx-0x1]
00486D0D  |. |E8 7ED5F7FF   |call fastfold.00404290
00486D12  |. |8B55 E4       |mov edx,dword ptr ss:[ebp-0x1C]
00486D15  |. |8BC7          |mov eax,edi
00486D17  |. |E8 54D6F7FF   |call fastfold.00404370
00486D1C  |. |8B07          |mov eax,dword ptr ds:[edi]
00486D1E  |. |E8 45D6F7FF   |call fastfold.00404368
00486D23  |. |83F8 0A       |cmp eax,0xA
00486D26  |. |7D 04         |jge Xfastfold.00486D2C                         ;  A 位
00486D28  |> |43            |inc ebx
00486D29  |. |4E            |dec esi
00486D2A  |.^\75 C8         \jnz Xfastfold.00486CF4                         ;  把md5值中数字提取出来


得到
$+20     >|009EC304  ASCII "2459816608"


5.
00486BA5  |> /8D45 F4       /lea eax,dword ptr ss:[ebp-0xC]
00486BA8  |. |E8 13DAF7FF   |call fastfold.004045C0
00486BAD  |. |8B55 F4       |mov edx,dword ptr ss:[ebp-0xC]
00486BB0  |. |8A541A FE     |mov dl,byte ptr ds:[edx+ebx-0x2]               ;  倒数第二位开始  后移一位
00486BB4  |. |885418 FF     |mov byte ptr ds:[eax+ebx-0x1],dl
00486BB8  |. |4B            |dec ebx
00486BB9  |. |83FB 01       |cmp ebx,0x1
00486BBC  |.^\75 E7         \jnz Xfastfold.00486BA5
00486BBE  |>  8B45 F4       mov eax,dword ptr ss:[ebp-0xC]
00486BC1  |.  E8 A2D7F7FF   call fastfold.00404368
00486BC6  |.  8B55 F4       mov edx,dword ptr ss:[ebp-0xC]
00486BC9  |.  8A5C02 FF     mov bl,byte ptr ds:[edx+eax-0x1]                ;  最后一位
00486BCD  |.  8D45 F4       lea eax,dword ptr ss:[ebp-0xC]
00486BD0  |.  E8 EBD9F7FF   call fastfold.004045C0
00486BD5  |.  8818          mov byte ptr ds:[eax],bl                        ;  放到第一位
00486BD7  |.  8B45 F4       mov eax,dword ptr ss:[ebp-0xC]


得到
$+24     > 009ECAD0  ASCII "0245981660"




6.查表得到最终结果


00486BEA  |> /8D45 F4       /lea eax,dword ptr ss:[ebp-0xC]
00486BED  |. |E8 CED9F7FF   |call fastfold.004045C0
00486BF2  |. |8B55 F4       |mov edx,dword ptr ss:[ebp-0xC]
00486BF5  |. |0FB6541A FF   |movzx edx,byte ptr ds:[edx+ebx-0x1]
00486BFA  |. |8B0D C80B4A00 |mov ecx,dword ptr ds:[0x4A0BC8]                ;  fastfold.004A00A0
00486C00  |. |8A5411 D0     |mov dl,byte ptr ds:[ecx+edx-0x30]
00486C04  |. |885418 FF     |mov byte ptr ds:[eax+ebx-0x1],dl
00486C08  |. |43            |inc ebx
00486C09  |. |4E            |dec esi
00486C0A  |.^\75 DE         \jnz Xfastfold.00486BEA                         ;  5379421608   查表?


0123456789
5379421608表


"0245981660"------>>5742803115




0048696A  |.  64:8920       mov dword ptr fs:[eax],esp
0048696D  |.  8B83 38030000 mov eax,dword ptr ds:[ebx+0x338]                ;  假码?
00486973  |.  E8 F0DBF7FF   call fastfold.00404568
00486978  |.  50            push eax
00486979  |.  8B83 34030000 mov eax,dword ptr ds:[ebx+0x334]                ;  真码
0048697F  |.  E8 E4DBF7FF   call fastfold.00404568
00486984  |.  5A            pop edx
00486985  |.  E8 AE22F8FF   call fastfold.00408C38                          ;  比较 要返回0
0048698A  |.  85C0          test eax,eax
……
0048699E  |.  BA 446A4800   mov edx,fastfold.00486A44                       ;  Software\Fast Folder Access
004869A3  |.  8BC6          mov eax,esi
004869A5  |.  E8 F6E0FAFF   call fastfold.00434AA0
004869AA  |.  8D55 FC       lea edx,dword ptr ss:[ebp-0x4]
004869AD  |.  8B83 04030000 mov eax,dword ptr ds:[ebx+0x304]
004869B3  |.  E8 E4CBFCFF   call fastfold.0045359C
004869B8  |.  8B4D FC       mov ecx,dword ptr ss:[ebp-0x4]
004869BB  |.  BA 686A4800   mov edx,fastfold.00486A68                       ;  Name
004869C0  |.  8BC6          mov eax,esi
004869C2  |.  E8 95E2FAFF   call fastfold.00434C5C                          ;  写入注册表
004869C7  |.  8D55 F8       lea edx,dword ptr ss:[ebp-0x8]
004869CA  |.  8B83 08030000 mov eax,dword ptr ds:[ebx+0x308]
004869D0  |.  E8 C7CBFCFF   call fastfold.0045359C
004869D5  |.  8B4D F8       mov ecx,dword ptr ss:[ebp-0x8]
004869D8  |.  BA 786A4800   mov edx,fastfold.00486A78                       ;  Code


QQ图片20170904183538.jpg


python注册机源码见附件
fast_folder.rar (858 Bytes, 下载次数: 9)





分析过程:

记录下分析过程。。可以无视
很容易定位到按下注册按钮的代码位置

00486850  |.  6A 00         push 0x0
00486852  |.  6A 00         push 0x0
00486854  |.  68 01140000   push 0x1401
00486859  |.  8BC3          mov eax,ebx
0048685B  |.  E8 3C35FDFF   call fastfold.00459D9C
00486860  |.  50            push eax                                        ; |hWnd
00486861  |.  E8 E602F8FF   call <jmp.&user32.PostMessageA>                 ; \PostMessageA



$-60     > 0020036C  |hWnd = 20036C
$-5C     > 00001401  |Message = MSG(1401)
$-58     > 00000000  |wParam = 0
$-54     > 00000000  \lParam = 0
post了个1401的MSG

然后 (user32.DispatchMessageA)下断点。。处理1401MSG时候。
F7跟进,来到了user32.
然后在401000代码段F2,F9来到程序领空。。。
一步一步F7.。。。最终到达。。
00486954  /.  55            push ebp
00486955  |.  8BEC          mov ebp,esp
00486957  |.  6A 00         push 0x0
00486959  |.  6A 00         push 0x0
0048695B  |.  53            push ebx
0048695C  |.  56            push esi
0048695D  |.  8BD8          mov ebx,eax
0048695F  |.  33C0          xor eax,eax
00486961  |.  55            push ebp
00486962  |.  68 2F6A4800   push fastfold.00486A2F
00486967  |.  64:FF30       push dword ptr fs:[eax]
0048696A  |.  64:8920       mov dword ptr fs:[eax],esp
0048696D  |.  8B83 38030000 mov eax,dword ptr ds:[ebx+0x338]                ;  假码?
00486973  |.  E8 F0DBF7FF   call fastfold.00404568
00486978  |.  50            push eax
00486979  |.  8B83 34030000 mov eax,dword ptr ds:[ebx+0x334]                ;  真码
0048697F  |.  E8 E4DBF7FF   call fastfold.00404568
00486984  |.  5A            pop edx
00486985  |.  E8 AE22F8FF   call fastfold.00408C38                          ;  比较 要返回0
0048698A  |.  85C0          test eax,eax
0048698C      75 70         jnz Xfastfold.004869FE
0048698E  |.  B2 01         mov dl,0x1



发现真码dword ptr ds:[ebx+0x334]      对这个地址查找参考


参考位于 fastfold:CODE 于 00000334

004405D8   mov eax,dword ptr ds:[ebx+0x334]
00486979   mov eax,dword ptr ds:[ebx+0x334]          (初始 CPU 选择)
00486C0F   add eax,0x334        ;处理好了。。




最后发现00486C0F这里就是按下注册按钮后,在postMessage之前处理了用户名,得到真码
原来就在眼前。。看来跟的不够细,绕弯路了


0048682F  |.  E8 BC020000   call fastfold.00486AF0                          ;  这个call里面关键算法call
00486834  |.  8D55 C8       lea edx,dword ptr ss:[ebp-0x38]
00486837  |.  8B83 08030000 mov eax,dword ptr ds:[ebx+0x308]
0048683D  |.  E8 5ACDFCFF   call fastfold.0045359C                          ;  取假码
00486842  |.  8B55 C8       mov edx,dword ptr ss:[ebp-0x38]
00486845  |.  8D83 38030000 lea eax,dword ptr ds:[ebx+0x338]
0048684B  |.  E8 ACD8F7FF   call fastfold.004040FC
00486850  |.  6A 00         push 0x0
00486852  |.  6A 00         push 0x0
00486854  |.  68 01140000   push 0x1401
00486859  |.  8BC3          mov eax,ebx
0048685B  |.  E8 3C35FDFF   call fastfold.00459D9C
00486860  |.  50            push eax                                        ; |hWnd
00486861  |.  E8 E602F8FF   call <jmp.&user32.PostMessageA>                 ; \PostMessageA
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>.>>>>
补充

经过GG提醒,发现dll中还有验证。。。od之

直接附加Explorer.exe

E 找到
路径=C:\PROGRA~1\FASTFO~1\FASHEL~1.DLL


搜索字符串就到达下面位置

026FE4C7    BA 5CEB6F02     MOV     EDX, FASHEL~1.026FEB5C     ; Software\Microsoft\Windows\CurrentVersion\Welcome
026FE4CC    8B45 F8         MOV     EAX, DWORD PTR SS:[EBP-8]
026FE4CF    E8 605FFAFF     CALL    FASHEL~1.026A4434
026FE4D4    84C0            TEST    AL, AL
026FE4D6    0F84 98000000   JE      FASHEL~1.026FE574   //

更改成
026FE4D6   /E9 F7050000     JMP     FASHEL~1.026FEAD2
026FE4DB   |90              NOP

就可以跳过验证。。。

但是发现这个位置不能保存,然后发现dll是加了ASProtect壳的。于是SMC来一下

我是直接修改了retn 为------jmp 到空的位置

跳到OEP的retn
00A753BF   /E9 9C0F0000     jmp FAShellE.00A76360
00A753C4   |90              nop
00A753C5   |90              nop


空数据位置
00A76360    50              push eax                                 ; a76360
00A76361    8B4424 04       mov eax,dword ptr ss:[esp+0x4]           ; a3e4c7  要改的
00A76365    2D 2E340000     sub eax,0x342E                                  ;自己计算了下偏移  (要改的代码位置 - OEP的位置)
00A7636A    C700 E9F70500   mov dword ptr ds:[eax],0x5F7E9      ;两个mov就是改代码
00A76370    83C0 04         add eax,0x4
00A76373    66:C700 0090    mov word ptr ds:[eax],0x9000
00A76378    58              pop eax
00A76379    C3              retn                                                     ;直接retn到OEP


附件中添加了修改好的dll,只要复制到程序的安装目录替换掉之前那个就好了(有错误提示的,先修改目录下原dll的名字再复制)

主程序中当然还有验证,你们自己找吧 很简单的 反正不影响使用。。(右键正常使用,目前还没发现什么问题。。)
FAShellExt.rar (323.16 KB, 下载次数: 4)


PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2014-9-4 20:00:40 | 显示全部楼层
    Good
    不过貌似在DLL里还有验证?时间长了,记不清了。

    如果我说错了,那肯定是喝了酒说的醉话,无视吧

    点评

    是有问题 ,我再找找~~  详情 回复 发表于 2014-9-4 20:27
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2014-9-4 20:27:49 | 显示全部楼层
    GGLHY 发表于 2014-9-4 20:00
    Good
    不过貌似在DLL里还有验证?时间长了,记不清了。

    是有问题 ,我再找找~~
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-23 23:49
  • 签到天数: 27 天

    [LV.4]偶尔看看III

    发表于 2014-9-4 20:35:12 | 显示全部楼层
    记得用户名长度有限制和检测。。。

    注册码的特定位置上的某几位也有限制和检测。。。。。

    那个DLL也有校验。。。(对这个DLL我印象很深)。。

    加油~~

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    4 天前
  • 签到天数: 970 天

    [LV.10]以坛为家III

    发表于 2014-9-4 21:10:07 | 显示全部楼层
    都是技术大神,感谢楼主的分享~~~
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-8-14 00:08
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2014-9-4 21:51:51 | 显示全部楼层
    goushibee大牛,我来晚了。。。。顶你。起来。。
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-9-1 01:55
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2014-9-5 20:18:02 | 显示全部楼层
    膜拜算法大神。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2015-5-1 09:48:13 | 显示全部楼层
    goushibee大神 学习了 支持一下
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-9-1 01:55
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2015-5-20 06:54:58 | 显示全部楼层
    此贴果断发现了好几只玩算法的大牛。
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表