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的名字再复制)
主程序中当然还有验证,你们自己找吧 很简单的 反正不影响使用。。(右键正常使用,目前还没发现什么问题。。)
Good
不过貌似在DLL里还有验证?时间长了,记不清了。
如果我说错了,那肯定是喝了酒说的醉话,无视吧{:biggrin:} GGLHY 发表于 2014-9-4 20:00
Good
不过貌似在DLL里还有验证?时间长了,记不清了。
是有问题 ,我再找找~~{:cry:}
记得用户名长度有限制和检测。。。
注册码的特定位置上的某几位也有限制和检测。。。。。
那个DLL也有校验。。。(对这个DLL我印象很深)。。
加油~~{:victory:}
都是技术大神,感谢楼主的分享~~~ goushibee大牛,我来晚了。。。。顶你。起来。。 膜拜算法大神。 goushibee大神 学习了 支持一下 此贴果断发现了好几只玩算法的大牛。
页:
[1]