- UID
- 76163
注册时间2014-6-12
阅读权限20
最后登录1970-1-1
以武会友
该用户从未签到
|
本帖最后由 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
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)
|
|