吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 1947|回复: 11

[转载技术] Fast Folder Access 1.8.3 算法分析

[复制链接]
Shark_鹏 发表于 2015-4-6 13:55 | 显示全部楼层 |阅读模式

算法部分:
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





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:[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的名字再复制)

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

评分

参与人数 16HB +15 THX +7 收起 理由
attackmyth + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
花盗睡鼠 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
Jawon + 1
Soul1999 + 1
后学真 + 1
极速菜 + 1
冷亦飞 + 1
飞刀梦想 + 1
zxjzzh + 2 [吾爱汇编论坛52HB.COM]-软件反汇编逆向分析,软件安全必不可少!
jaunic + 2
MoeRay + 1
成丰羽 + 1 [吾爱汇编论坛52HB.COM]-感谢楼主热心分享,小小评分不成敬意!
消逝的过去 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
hnymsh + 1
lies + 1
逍遥枷锁 + 4 + 1 好人有好报!你的热心我永远不忘!谢谢!

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
逍遥枷锁 发表于 2015-4-6 17:01 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
消逝的过去 发表于 2022-2-9 08:21 | 显示全部楼层

[快捷回复]-学破解防逆向,知进攻懂防守!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-12 04:19 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
zg2600 发表于 2022-6-20 23:32 | 显示全部楼层

[吾爱汇编论坛52HB.COM]-谢谢前来学习一下!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2022-11-26 08:12 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2022-12-18 17:39 | 显示全部楼层

很有帮助,多多支持!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-4-19 09:40 | 显示全部楼层

好好来学习一下
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-5-19 21:54 | 显示全部楼层

谢谢分享这技术学习了!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-5-19 23:10 | 显示全部楼层

超级感谢楼主!
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层
8层
9层
10层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

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