goushibee 发表于 2014-9-4 18:51:52

Fast Folder Access 1.8.3 算法分析

本帖最后由 goushibee 于 2014-9-6 18:44 编辑

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


004866C7|.E8 D0CEFCFF   call fastfold.0045359C
004866CC|.8B45 FC       mov eax,dword ptr ss:                  ;取用户名
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:
00486B4B|. |E8 70DAF7FF   |call fastfold.004045C0
00486B50|. |8B55 F4       |mov edx,dword ptr ss:
00486B53|. |8A541A FF   |mov dl,byte ptr ds:
00486B57|. |8B4D F4       |mov ecx,dword ptr ss:
00486B5A|. |321419      |xor dl,byte ptr ds:                   ;第一位和第二位xor(接着第二位和第三位)
00486B5D|. |885418 FF   |mov byte ptr ds:,dl
00486B61|. |43            |inc ebx
00486B62|. |4E            |dec esi
00486B63|.^\75 E3         \jnz Xfastfold.00486B48                         ;到最后一位


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


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


2.向后移动一位,移动后最后一位给第一位
00486C87|> /8D45 FC       /lea eax,dword ptr ss:
00486C8A|. |E8 31D9F7FF   |call fastfold.004045C0
00486C8F|. |8B55 FC       |mov edx,dword ptr ss:
00486C92|. |8A541A FE   |mov dl,byte ptr ds:
00486C96|. |885418 FF   |mov byte ptr ds:,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:
00486CA3|.E8 C0D6F7FF   call fastfold.00404368
00486CA8|.8B55 FC       mov edx,dword ptr ss:
00486CAB|.8A5C02 FF   mov bl,byte ptr ds:                ;最后一位给第一位
00486CAF|.8D45 FC       lea eax,dword ptr ss:
00486CB2|.E8 09D9F7FF   call fastfold.004045C0
00486CB7|.8818          mov byte ptr ds:,bl                        ;最后一位给第一位
00486CB9|.8D55 E8       lea edx,dword ptr ss:

得到
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:
00486CF7|. |8A4418 FF   |mov al,byte ptr ds:
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:
00486D06|. |8B55 FC       |mov edx,dword ptr ss:
00486D09|. |8A541A FF   |mov dl,byte ptr ds:
00486D0D|. |E8 7ED5F7FF   |call fastfold.00404290
00486D12|. |8B55 E4       |mov edx,dword ptr ss:
00486D15|. |8BC7          |mov eax,edi
00486D17|. |E8 54D6F7FF   |call fastfold.00404370
00486D1C|. |8B07          |mov eax,dword ptr ds:
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   >|009EC304ASCII "2459816608"


5.
00486BA5|> /8D45 F4       /lea eax,dword ptr ss:
00486BA8|. |E8 13DAF7FF   |call fastfold.004045C0
00486BAD|. |8B55 F4       |mov edx,dword ptr ss:
00486BB0|. |8A541A FE   |mov dl,byte ptr ds:               ;倒数第二位开始后移一位
00486BB4|. |885418 FF   |mov byte ptr ds:,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:
00486BC1|.E8 A2D7F7FF   call fastfold.00404368
00486BC6|.8B55 F4       mov edx,dword ptr ss:
00486BC9|.8A5C02 FF   mov bl,byte ptr ds:                ;最后一位
00486BCD|.8D45 F4       lea eax,dword ptr ss:
00486BD0|.E8 EBD9F7FF   call fastfold.004045C0
00486BD5|.8818          mov byte ptr ds:,bl                        ;放到第一位
00486BD7|.8B45 F4       mov eax,dword ptr ss:


得到
$+24   > 009ECAD0ASCII "0245981660"




6.查表得到最终结果


00486BEA|> /8D45 F4       /lea eax,dword ptr ss:
00486BED|. |E8 CED9F7FF   |call fastfold.004045C0
00486BF2|. |8B55 F4       |mov edx,dword ptr ss:
00486BF5|. |0FB6541A FF   |movzx edx,byte ptr ds:
00486BFA|. |8B0D C80B4A00 |mov ecx,dword ptr ds:                ;fastfold.004A00A0
00486C00|. |8A5411 D0   |mov dl,byte ptr ds:
00486C04|. |885418 FF   |mov byte ptr ds:,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:,esp
0048696D|.8B83 38030000 mov eax,dword ptr ds:                ;假码?
00486973|.E8 F0DBF7FF   call fastfold.00404568
00486978|.50            push eax
00486979|.8B83 34030000 mov eax,dword ptr ds:                ;真码
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:
004869AD|.8B83 04030000 mov eax,dword ptr ds:
004869B3|.E8 E4CBFCFF   call fastfold.0045359C
004869B8|.8B4D FC       mov ecx,dword ptr ss:
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:
004869CA|.8B83 08030000 mov eax,dword ptr ds:
004869D0|.E8 C7CBFCFF   call fastfold.0045359C
004869D5|.8B4D F8       mov ecx,dword ptr ss:
004869D8|.BA 786A4800   mov edx,fastfold.00486A78                     ;Code





python注册机源码见附件






分析过程:

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

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:
0048696A|.64:8920       mov dword ptr fs:,esp
0048696D|.8B83 38030000 mov eax,dword ptr ds:                ;假码?
00486973|.E8 F0DBF7FF   call fastfold.00404568
00486978|.50            push eax
00486979|.8B83 34030000 mov eax,dword ptr ds:                ;真码
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:      对这个地址查找参考


参考位于 fastfold:CODE 于 00000334

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




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


0048682F|.E8 BC020000   call fastfold.00486AF0                        ;这个call里面关键算法call
00486834|.8D55 C8       lea edx,dword ptr ss:
00486837|.8B83 08030000 mov eax,dword ptr ds:
0048683D|.E8 5ACDFCFF   call fastfold.0045359C                        ;取假码
00486842|.8B55 C8       mov edx,dword ptr ss:
00486845|.8D83 38030000 lea eax,dword ptr ds:
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:
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:         ; a3e4c7要改的
00A76365    2D 2E340000   sub eax,0x342E                                  ;自己计算了下偏移(要改的代码位置 - OEP的位置)
00A7636A    C700 E9F70500   mov dword ptr ds:,0x5F7E9      ;两个mov就是改代码
00A76370    83C0 04         add eax,0x4
00A76373    66:C700 0090    mov word ptr ds:,0x9000
00A76378    58            pop eax
00A76379    C3            retn                                                   ;直接retn到OEP


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

主程序中当然还有验证,你们自己找吧 很简单的 反正不影响使用。。(右键正常使用,目前还没发现什么问题。。)



GGLHY 发表于 2014-9-4 20:00:40

Good
不过貌似在DLL里还有验证?时间长了,记不清了。

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

goushibee 发表于 2014-9-4 20:27:49

GGLHY 发表于 2014-9-4 20:00
Good
不过貌似在DLL里还有验证?时间长了,记不清了。



是有问题 ,我再找找~~{:cry:}

GGLHY 发表于 2014-9-4 20:35:12

记得用户名长度有限制和检测。。。

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

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

加油~~{:victory:}

gujin162 发表于 2014-9-4 21:10:07

都是技术大神,感谢楼主的分享~~~

crackvip 发表于 2014-9-4 21:51:51

goushibee大牛,我来晚了。。。。顶你。起来。。

DragonLoft 发表于 2014-9-5 20:18:02

膜拜算法大神。

天使的牙刷 发表于 2015-5-1 09:48:13

goushibee大神 学习了 支持一下

DragonLoft 发表于 2015-5-20 06:54:58

此贴果断发现了好几只玩算法的大牛。
页: [1]
查看完整版本: Fast Folder Access 1.8.3 算法分析