• 标 题:flashget 1.40 的粗略分析和探讨.[修改版] (9千字)
  • 作 者:oOOOo
  • 时 间:2003-1-12 12:42:40
  • 链 接:http://bbs.pediy.com

今天起来一看:上次贴的代码段粘贴错位置了,[笔记太乱乐:),时间又太晚了]
Aming Thank you!

F****g*t 1.40 的粗略分析和探讨.[修改版]

先建立如下条件:
[HKEY_CURRENT_USER\Software\JetCar\JetCar\General]
"RegDisp",注册框中显示的名字
"RegName",有可能用于注册校验的用户名.
"RegPass",注册码.

感谢Aming的帖子!他可真痴情!好男子就应该这样![请有空多锻炼身体,以后有用!]

bpx 41C65A

:0041C65A 8B13                    mov edx, dword ptr [ebx]
:0041C65C 8B42F8                  mov eax, dword ptr [edx-08]
:0041C65F 83F82C                  cmp eax, 0000002C    ;此处有比较注册码长度的代码,应为0x2C,(44)
:0041C662 0F85D1000000            jne 0041C739
* Possible StringData Ref from Data Obj ->"fgc-"    ;此处比较注册码开头可是为"fgc-" (4)
:0041C668 687C144F00              push 004F147C
:0041C66D 8BCB                    mov ecx, ebx
:0041C66F E8CED70700              call 00499E42
:0041C674 85C0                    test eax, eax
:0041C676 7506                    jne 0041C67E
:0041C678 897C2410                mov dword ptr [esp+10], edi
:0041C67C EB18                    jmp 0041C696
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0041C676(C)
* Possible StringData Ref from Data Obj ->"fgf-"
:0041C67E 6874144F00              push 004F1474        ;此处比较注册码开头是否为"fgf-" (4)
:0041C683 8BCB                    mov ecx, ebx
:0041C685 E8B8D70700              call 00499E42
:0041C68A 85C0                    test eax, eax
:0041C68C 0F85A7000000            jne 0041C739
:0041C692 89442410                mov dword ptr [esp+10], eax
所以,我们假设注册码型如:
fgc-a123b456c789d012e345f678g901h234i567j890
另外,作者有一个隐含的字符串:"kevinhouhytzl"
其中"hytzl"是flashget旧版本的加密字符串,好象是0.95还用着,其他的没有尝试.



以下这段代码在校验a123和b456
;-------------------------------------------
:0041C6A8 8B4500                  mov eax, dword ptr [ebp+00]
:0041C6AB 8BCF                    mov ecx, edi
:0041C6AD 83C504                  add ebp, 00000004
:0041C6B0 83E900                  sub ecx, 00000000
:0041C6B3 8944241C                mov dword ptr [esp+1C], eax
:0041C6B7 741C                    je 0041C6D5
:0041C6B9 49                      dec ecx
:0041C6BA 7533                    jne 0041C6EF
:0041C6BC 0FBE74241E              movsx esi, byte ptr [esp+1E]
:0041C6C1 0FBE54241F              movsx edx, byte ptr [esp+1F]
:0041C6C6 0FBECC                  movsx ecx, ah
:0041C6C9 23F1                    and esi, ecx
:0041C6CB 0FAFF2                  imul esi, edx
:0041C6CE 0FBEC0                  movsx eax, al
:0041C6D1 03F0                    add esi, eax
:0041C6D3 EB1A                    jmp 0041C6EF
:0041C6D5 8A4C241E                mov cl, byte ptr [esp+1E]
:0041C6D9 8AD4                    mov dl, ah
:0041C6DB 33CA                    xor ecx, edx
:0041C6DD 0FBE54241F              movsx edx, byte ptr [esp+1F]
:0041C6E2 83E17F                  and ecx, 0000007F
:0041C6E5 0FAFCA                  imul ecx, edx
:0041C6E8 0FBEC0                  movsx eax, al
:0041C6EB 03C8                    add ecx, eax
:0041C6ED 8BF1                    mov esi, ecx
:0041C6EF 8B442410                mov eax, dword ptr [esp+10]
:0041C6F3 85C0                    test eax, eax
:0041C6F5 740C                    je 0041C703
:0041C6F7 0FBE0D43F64E00          movsx ecx, byte ptr [004EF643]
:0041C6FE 83FF02                  cmp edi, 00000002
:0041C701 7407                    je 0041C70A
:0041C703 0FBE8F40F64E00          movsx ecx, byte ptr [edi+004EF640]
:0041C70A 8BC6                    mov eax, esi
:0041C70C 33D2                    xor edx, edx
:0041C70E F7F1                    div ecx
:0041C710 8BC7                    mov eax, edi
:0041C712 83E800                  sub eax, 00000000
:0041C715 740A                    je 0041C721
:0041C717 48                      dec eax
:0041C718 750B                    jne 0041C725
:0041C71A 83FA08                  cmp edx, 00000008
:0041C71D 7511                    jne 0041C730
:0041C71F EB04                    jmp 0041C725
:0041C721 85D2                    test edx, edx
:0041C723 750B                    jne 0041C730
:0041C725 47                      inc edi
:0041C726 83FF02                  cmp edi, 00000002
:0041C729 7D23                    jge 0041C74E
:0041C72B E978FFFFFF              jmp 0041C6A8
:0041C730 6AFF                    push FFFFFFFF
:0041C732 8BCB                    mov ecx, ebx
:0041C734 E8BC220800              call 0049E9F5
:0041C739 5F                      pop edi
:0041C73A 5E                      pop esi
:0041C73B 5D                      pop ebp
:0041C73C 33C0                    xor eax, eax
:0041C73E 5B                      pop ebx
:0041C73F 8B4C2420                mov ecx, dword ptr [esp+20]
:0041C743 64890D00000000          mov dword ptr fs:[00000000], ecx
:0041C74A 83C42C                  add esp, 0000002C
:0041C74D C3                      ret

a123=0x61,0x31,0x32,0x33,并取kevin中的"k"=0x6b
必须满足:(((0x32^0x33)&0x7F)*0x34+0x61)%0x6B==0
b456=0x62,0x34,0x35,0x36,并取kevinhouhytzl中"e"=0x65
必须满足:((0x34&0x35)*0x36+0x62)%0x65==0x08
鉴于Aming说的不便公开的情况,请自己计算应该是哪些字符吧! :-)


;-------------------------------------------
程序到这里就不再校验字符串中其他部分.而是将内存标志
4F7BD4=1,表示已注册.然后开始运行,没有广告窗口.
但......
暗地里有个动作: set privatetimer ,timerinterval=0xD98 即3480(d)
相当于运行到58分时,嘿嘿~~~~~~:

:0042A651 E88A83FEFF              call 004129E0
:0042A656 8BC8                    mov ecx, eax
:0042A658 E8E31EFFFF              call 0041C540        ;比较 4F7BD4 内存标记
:0042A65D 85C0                    test eax, eax        ;注册了吗? ;-)
:0042A65F 7427                    je 0042A688        ;没有注册的话就跳过去.
:0042A661 A1F87C4F00              mov eax, dword ptr [004F7CF8] ;有的话就进行时间判断.
:0042A666 3D980D0000              cmp eax, 00000D98    ;58分了吗?
:0042A66B 750E                    jne 0042A67B        ;不到时间的话,就增加计数值去
:0042A66D E86E83FEFF              call 004129E0        ;到时间了![这个call没有跟]
:0042A672 8BC8                    mov ecx, eax
:0042A674 E8678FFFFF              call 004235E0        ;隐含比较注册码中字段,见下(A)
:0042A679 EB0D                    jmp 0042A688        ;这个jmp似乎应该为 jmp 42A682,见下(B)
:0042A67B 3DA10D0000              cmp eax, 00000DA1    ;58分又过9秒了吗? 这段代码由于上面的分析,可能永远不会走到.
:0042A680 7406                    je 0042A688        ;是则不再使用这个隐含timer
:0042A682 40                      inc eax        ;
:0042A683 A3F87C4F00              mov dword ptr [004F7CF8], eax
:0042A688 8BCF                    mov ecx, edi
:0042A68A E895490700              call 0049F024
:0042A68F 8B4C242C                mov ecx, dword ptr [esp+2C]
:0042A693 5F                      pop edi
:0042A694 5E                      pop esi
:0042A695 5B                      pop ebx
:0042A696 64890D00000000          mov dword ptr fs:[00000000], ecx
:0042A69D 83C42C                  add esp, 0000002C
:0042A6A0 C20400                  ret 0004

(A)只发现比较d012,从call 4235E0跟进,代码在下,不知道有无其他比较,请续进!:
如果不满足d012这个的话,程序会在注册表中建立一个value,用你的regpass作为名字!!
很长哦!我没有让它这么做.似乎下次启动会检测[当a123,d012满足条件时],至于结果,
我也没有尝试,我好怕怕!他会干什么??????

(B)
见代码中的注释,程序似乎并不比较计数值==0xDA1,也许是那个jmp错了.kevinhou似乎
是想到58分9秒时不再计数了,但好象没有走到哦,计数一旦到0xD98就会停止. ???

以下校验d012
;-------------------------------------------
:00423618 0FBE44240E              movsx eax, byte ptr [esp+0E]
:0042361D 0FBED5                  movsx edx, ch
:00423620 0BC2                    or eax, edx
:00423622 0FBE54240F              movsx edx, byte ptr [esp+0F]
:00423627 0FAFC2                  imul eax, edx
:0042362A 0FBEC9                  movsx ecx, cl
:0042362D 03C1                    add eax, ecx
:0042362F 33D2                    xor edx, edx
:00423631 0FBE0D43F64E00          movsx ecx, byte ptr [004EF643]
:00423638 F7F1                    div ecx
:0042363A 8BCE                    mov ecx, esi
:0042363C 85D2                    test edx, edx
:0042363E 741E                    je 0042365E
:00423640 E8B0B30700              call 0049E9F5
:00423645 8B16                    mov edx, dword ptr [esi]
:00423647 6A00                    push 00000000
:00423649 52                      push edx
:0042364A 68ACF14E00              push 004EF1AC
:0042364F 8BCF                    mov ecx, edi
:00423651 E808700800              call 004AA65E
:00423656 5F                      pop edi
:00423657 33C0                    xor eax, eax
:00423659 5E                      pop esi
:0042365A 83C408                  add esp, 00000008
:0042365D C3                      ret

d012=0x64,0x30,0x31,0x32,并取kevinhouhytzl中的"i"=0x69
必须满足:((0x30|0x31)*0x32+0x64)%0x69==0
也请自行计算
;-------------------------------------------



未完成的任务:
1)注册码其余字段没有比较,可能有其他timer![极有可能],我没有时间跟了.
2)也可能他再完成特殊动作时再比较,比如,下载某个大体积的软件时忽然做比较[给你少下几个豆][不会这么坏吧]
3)也可能他要到后续版本再出来比较.反正kevinhouhytzl这几个字符都要用到.
4)也有可能在上面的(A)处写入以regpass为名字的values再启动后有花招,我也没有跟.
5)也许下载一个旧的flashget 1.30就会发现其他的比较代码,我也没有跟.
6)改为fgf-开头看看?

7)由于有以上的不确定因素,所以我暂时也没有注册,只是用 bpm 4F7BD4 来观察它根据注册情况的createwindow
强行改了4处跳转,使主程序不显示广告窗口,要让Site Explorer也不显示的话,还应该改几处.

请兄弟们跟进!趁星期天!

by oOOOo 2003/01