• 标 题:初级!请各大侠指点一二! (1千字)
  • 作 者:南木
  • 时 间:2001-3-30 13:28:15
  • 链 接:http://bbs.pediy.com

FontTwister Version 1.1  一个很好的做字体特效的家伙!
http://www.neuber.com        1.35 Mb
有30天试用期!
用试用版作出的图片的正中有 Tial version 字样。:(

工具 :
      soft ice 4.05
      w32dasm 8.93 黄金中文版
      ultra edit 7.02

      将判断注册码的几个关键的je改为jne 后,弹出注册成功对话框,(注册成功,要求推出程序重新启动)。重新启动后,仍然弹出information对话框,要求注册。奇怪,我不是已经注册了吗!:(
      程序肯定将我的注册信息写入了注册表,程序启动时,
进行对比判断,假的注册信息当然通不过!(原来如此!)。于是想将call 出information对话框的call,nop掉!
    用soft ice 设断bpx creagewindowexa 后,运行程序,
soft 拦下,F12,F12,F12,F12,F12,F12,F12,................唉,
我的手都酸了(足足按了700多次!!!),然而information对话框仍未露脸。:( (此法不行,惨啊!)
    用soft ice 设断bpx regqueryvalueExa 后, 死机。更惨!!
    用w32dasm反编译,查找” this is an unregistered“,哗啦
哗啦狂响后,报告未发现。(真是浪费表情!)
    用ultra edit载入程序,查找” this is an unregistered“,哗啦哗啦狂响后,报告也未发现。(也是浪费表情!)
    by the way:w32dasm中的“转到代码头”和“转到程序入口处”有什么区别?
    求各位大哥出谋划策!!
    在下洗耳恭听!!!

  • 标 题:没壳。这个的注册码保护有点意思! (944字)
  • 作 者:blowfish
  • 时 间:2001-3-30 20:50:56

串“Wrong code”和“Thank you”在程序中有多处,有几处事先加密过,所以有的串找不到明文,仔细跟一下可以看到它对这些串进行解码的过程。

用DeDe对其处理之后可以看到它在输入注册码之后的判断是分散的,第一处判断是在TSWUnlockForm.UnlockSpeedButtonMouseDown( ),第二处是在TSWUnlockForm.UnlockSpeedButtonClick( )中(这里面还检查是否为旧版本或更新版本的注册码),因为当你单击Unlock按钮时,该按钮的父窗口先收到WM_LBUTTONDOWN消息,再收到WM_LBUTTONCLICK消息。

启动时则是用Windows目录下的win.ini和user.da0来判断时间的,时间限制容易去除,用GetWindowsDirectoryA、GetLocalTime、FindFirstFileA都可以拦下来。

还有两个ini文件有鬼:ftwister.ini、fulltwister.ini,主要是下面几个值:
[Options]
Dreh=36980
RegTick=11576

[Program]
Date=36980
first=36980
OkAll=1
N=BLOWFISH
K=456789:;<33[d733A;>3NPa?3;:98

加在图片上的“trial”字样是个位图,用ExeScope可以对其进行处理。

还没找到可用的注册码,下面的这个是假的:
blowfish
12345678900Xa400>8;0KM^<0

  • 标 题:我对它也进行了研究,但还没全搞定 (21千字)
  • 作 者:robot
  • 时 间:2001-3-30 21:19:13

FontTwister v1.1 forWin95/98/NT的破解
url: http://163.pchome.net/htmled/fntwster.zip

* Reference To: user32.GetDlgCtrlID, Ord:0000h
                                  |
:004BD833 E8F098F4FF              Call 00407128
:004BD838 50                      push eax
:004BD839 8BC3                    mov eax, ebx
:004BD83B E8809BF7FF              call 004373C0
:004BD840 50                      push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
                                  |
:004BD841 E8F298F4FF              Call 00407138
:004BD846 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]    ====> eax指向输入的注册码
:004BD84C E8C7B7F4FF              call 00409018                        ====> 计算注册码的长度
:004BD851 83F819                  cmp eax, 00000019                    ====> 长度是否大于等于19h,即25
:004BD854 7340                    jnb 004BD896                        ====> 是则转
:004BD856 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]    ====> eax指向输入的注册码
:004BD85C E8B7B7F4FF              call 00409018                        ====> 计算注册码的长度
:004BD861 83F801                  cmp eax, 00000001                    ====> 注册码是否为空
:004BD864 7623                    jbe 004BD889                        ====> 是则转
:004BD866 8D8516FCFFFF            lea eax, dword ptr [ebp+FFFFFC16]    ====> eax指向输入的注册名
:004BD86C E8A7B7F4FF              call 00409018                        ====> 计算注册码的长度
:004BD871 83F801                  cmp eax, 00000001                    ====> 注册码是否为空
:004BD874 7613                    jbe 004BD889                        ====> 是则转
:004BD876 6A10                    push 00000010

* Possible StringData Ref from Code Obj ->"FontTwister"
                                  |
:004BD878 68ECDA4B00              push 004BDAEC                        ====> 显示错误信息
* Possible StringData Ref from Code Obj ->"Wrong name or registration code! Enter here your address exactly so how "
                                        ->"this is written in your registering documents. Pay attention to case sensitive."
                                  |
:004BD87D 68F8DA4B00              push 004BDAF8
:004BD882 6A00                    push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
                                  |
:004BD884 E87F9AF4FF              Call 00407308

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD864(C), :004BD874(C)
|
:004BD889 33C0                    xor eax, eax
:004BD88B 5A                      pop edx
:004BD88C 59                      pop ecx
:004BD88D 59                      pop ecx
:004BD88E 648910                  mov dword ptr fs:[eax], edx
:004BD891 E927020000              jmp 004BDABD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD854(C)
|
:004BD896 55                      push ebp
:004BD897 6A08                    push 00000008                      ====> 8入栈
:004BD899 B940000000              mov ecx, 00000040                  ====> 40h即64入栈
:004BD89E BA0E000000              mov edx, 0000000E                  ====> 0Eh即14入栈
:004BD8A3 B80A000000              mov eax, 0000000A                  ====> 0Ah即10入栈,实际上是取注册码的第11-15个字符(因为包括第0位)
:004BD8A8 E82BFDFFFF              call 004BD5D8                      ====> 计算注册码并进行比较
:004BD8AD 59                      pop ecx
:004BD8AE 84C0                    test al, al                        ====> al做旗标
:004BD8B0 0F8407010000            je 004BD9BD                        ====> al=0则注册码错误
:004BD8B6 55                      push ebp
:004BD8B7 6A09                    push 00000009                      ====> 9入栈
:004BD8B9 B930000000              mov ecx, 00000030                  ====> 30h即48入栈
:004BD8BE BA13000000              mov edx, 00000013                  ====> 13h即19入栈
:004BD8C3 B80F000000              mov eax, 0000000F                  ====> 0Fh即15入栈,实际上是取注册码的第16-20个字符(因为包括第0位)
:004BD8C8 E80BFDFFFF              call 004BD5D8                      ====> 计算注册码并进行比较
:004BD8CD 59                      pop ecx
:004BD8CE 84C0                    test al, al                        ====> al做旗标
:004BD8D0 0F84E7000000            je 004BD9BD                        ====> al=0则注册码错误
:004BD8D6 55                      push ebp
:004BD8D7 6A0A                    push 0000000A                      ====> 0Ah即10入栈
:004BD8D9 B933000000              mov ecx, 00000033                  ====> 30h即51入栈
:004BD8DE BA18000000              mov edx, 00000018                  ====> 18h即24入栈
:004BD8E3 B814000000              mov eax, 00000014                  ====> 14h即20入栈,实际上是取注册码的第21-25个字符(因为包括第0位)
:004BD8E8 E8EBFCFFFF              call 004BD5D8                      ====> 计算注册码并进行比较
:004BD8ED 59                      pop ecx
:004BD8EE 84C0                    test al, al                        ====> al做旗标
:004BD8F0 0F84C7000000            je 004BD9BD                        ====> al=0则注册码错误
:004BD8F6 6A01                    push 00000001                      ====> 3处比较正确则置正确标志
:004BD8F8 A150CD4D00              mov eax, dword ptr [004DCD50]
:004BD8FD 8B00                    mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"OkAll"
                                  |
:004BD8FF B99CDB4B00              mov ecx, 004BDB9C

* Possible StringData Ref from Code Obj ->"Program"
                                  |
:004BD904 BAACDB4B00              mov edx, 004BDBAC
:004BD909 8B30                    mov esi, dword ptr [eax]
:004BD90B FF560C                  call [esi+0C]
:004BD90E 8D9514FAFFFF            lea edx, dword ptr [ebp+FFFFFA14]
:004BD914 8D8516FCFFFF            lea eax, dword ptr [ebp+FFFFFC16]
:004BD91A E851B9F4FF              call 00409270
:004BD91F 8B8514FAFFFF            mov eax, dword ptr [ebp+FFFFFA14]
:004BD925 50                      push eax
:004BD926 A150CD4D00              mov eax, dword ptr [004DCD50]
:004BD92B 8B00                    mov eax, dword ptr [eax]
:004BD92D B9BCDB4B00              mov ecx, 004BDBBC

* Possible StringData Ref from Code Obj ->"Program"
                                  |
:004BD932 BAACDB4B00              mov edx, 004BDBAC
:004BD937 8B30                    mov esi, dword ptr [eax]
:004BD939 FF5604                  call [esi+04]
:004BD93C 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]
:004BD942 E8D1B6F4FF              call 00409018
:004BD947 8BD0                    mov edx, eax
:004BD949 4A                      dec edx
:004BD94A 85D2                    test edx, edx
:004BD94C 7C14                    jl 004BD962
:004BD94E 42                      inc edx
:004BD94F 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]    ====> eax指向注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD960(C)
|
:004BD955 33C9                    xor ecx, ecx                          ====> ecx清0
:004BD957 8A08                    mov cl, byte ptr [eax]                ====> 取一个注册码字符
:004BD959 83C103                  add ecx, 00000003                    ====> 将该值+3
:004BD95C 8808                    mov byte ptr [eax], cl                ====> 再送回去
:004BD95E 40                      inc eax                              ====> 准备取下一个
:004BD95F 4A                      dec edx                              ====> 是否取完
:004BD960 75F3                    jne 004BD955                          ====> 没有则继续

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD94C(C)
|
:004BD962 8D9514FAFFFF            lea edx, dword ptr [ebp+FFFFFA14]
:004BD968 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]
:004BD96E E8FDB8F4FF              call 00409270
:004BD973 8B8514FAFFFF            mov eax, dword ptr [ebp+FFFFFA14]
:004BD979 50                      push eax
:004BD97A A150CD4D00              mov eax, dword ptr [004DCD50]
:004BD97F 8B00                    mov eax, dword ptr [eax]
:004BD981 B9C8DB4B00              mov ecx, 004BDBC8

* Possible StringData Ref from Code Obj ->"Program"
                                  |
:004BD986 BAACDB4B00              mov edx, 004BDBAC
:004BD98B 8B30                    mov esi, dword ptr [eax]
:004BD98D FF5604                  call [esi+04]                        ====> 存入到FTwister.ini中
:004BD990 6A40                    push 00000040

* Possible StringData Ref from Code Obj ->"FontTwister"
                                  |
:004BD992 68ECDA4B00              push 004BDAEC

* Possible StringData Ref from Code Obj ->"Thank you very much for registering. FontTwister is now unlocked. Please restart "
                                        ->"the program to activate all changes."
                                  |
:004BD997 68CCDB4B00              push 004BDBCC
:004BD99C 8BC3                    mov eax, ebx
:004BD99E E81D9AF7FF              call 004373C0
:004BD9A3 50                      push eax

* Reference To: user32.MessageBoxA, Ord:0000h
                                  |
:004BD9A4 E85F99F4FF              Call 00407308
:
:
:

计算注册码并比较的Call
* Referenced by a CALL at Addresses:
|:004BD8A8  , :004BD8C8  , :004BD8E8 
|
:004BD5D8 55                      push ebp
:004BD5D9 8BEC                    mov ebp, esp
:004BD5DB 83C4E0                  add esp, FFFFFFE0
:004BD5DE 53                      push ebx
:004BD5DF 56                      push esi
:004BD5E0 57                      push edi
:004BD5E1 33DB                    xor ebx, ebx
:004BD5E3 895DE4                  mov dword ptr [ebp-1C], ebx
:004BD5E6 895DE0                  mov dword ptr [ebp-20], ebx
:004BD5E9 894DF8                  mov dword ptr [ebp-08], ecx
:004BD5EC 8BDA                    mov ebx, edx
:004BD5EE 8945FC                  mov dword ptr [ebp-04], eax
:004BD5F1 33C0                    xor eax, eax
:004BD5F3 55                      push ebp
:004BD5F4 6861D74B00              push 004BD761
:004BD5F9 64FF30                  push dword ptr fs:[eax]
:004BD5FC 648920                  mov dword ptr fs:[eax], esp
:004BD5FF C645F700                mov [ebp-09], 00
:004BD603 33C9                    xor ecx, ecx
:004BD605 55                      push ebp
:004BD606 683CD74B00              push 004BD73C
:004BD60B 64FF31                  push dword ptr fs:[ecx]
:004BD60E 648921                  mov dword ptr fs:[ecx], esp
:004BD611 8B450C                  mov eax, dword ptr [ebp+0C]
:004BD614 050BFEFFFF              add eax, FFFFFE0B                  ====> 结果eax指向输入的注册码
:004BD619 E8FAB9F4FF              call 00409018                      ====> 计算注册码的长度
:004BD61E 83F819                  cmp eax, 00000019                  ====> 与25比较
:004BD621 730D                    jnb 004BD630                      ====> 大于等于则转
:004BD623 33C0                    xor eax, eax                      ====> eax清0并置标志和退出
:004BD625 5A                      pop edx
:004BD626 59                      pop ecx
:004BD627 59                      pop ecx
:004BD628 648910                  mov dword ptr fs:[eax], edx
:004BD62B E916010000              jmp 004BD746

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD621(C)
|
:004BD630 33C0                    xor eax, eax
:004BD632 8945EC                  mov dword ptr [ebp-14], eax
:004BD635 BA01000000              mov edx, 00000001                  ====> edx设初值1
:004BD63A 33C0                    xor eax, eax
:004BD63C 8945E8                  mov dword ptr [ebp-18], eax
:004BD63F 8B45FC                  mov eax, dword ptr [ebp-04]        ====> eax三次分别为0Ah, 0Fh, 14h
:004BD642 8BF3                    mov esi, ebx                      ====> esi三次分别为0Eh, 13h, 18h
:004BD644 2BF0                    sub esi, eax                      ====> 要取的注册码长度=4
:004BD646 7C26                    jl 004BD66E
:004BD648 46                      inc esi                            ====> 要取的注册码长度=5
:004BD649 8945F0                  mov dword ptr [ebp-10], eax
:004BD64C 8B450C                  mov eax, dword ptr [ebp+0C]
:004BD64F 8B4DF0                  mov ecx, dword ptr [ebp-10]
:004BD652 8D84080BFEFFFF          lea eax, dword ptr [eax+ecx-000001F5] ====> 指向要取的注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD66C(C)
|
:004BD659 33C9                    xor ecx, ecx                        ====> ecx清0
:004BD65B 8A08                    mov cl, byte ptr [eax]              ====> 取一个注册码字符
:004BD65D 83E930                  sub ecx, 00000030                  ====> 减去30h,即"0"
:004BD660 0FAFCA                  imul ecx, edx                      ====> ecx=ecx*edx
:004BD663 014DE8                  add dword ptr [ebp-18], ecx        ====> 加到[ebp-18]中
:004BD666 0FAF55F8                imul edx, dword ptr [ebp-08]        ====> edx=edx*第2个入栈值,分别为40h, 30h, 33h
:004BD66A 40                      inc eax                            ====> 准备取下个字符
:004BD66B 4E                      dec esi                            ====> 是否取完
:004BD66C 75EB                    jne 004BD659                        ====> 不是则继续

4BD659-4BD66C这段的计算结果:
计算值=第1个数字+第2个数字*X+第3个数字*X^2+第4个数字*X^3+第5个数字*X^4
X三次分别为40h, 30h, 33h

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD646(C)
|
:004BD66E 8B450C                  mov eax, dword ptr [ebp+0C]
:004BD671 0516FCFFFF              add eax, FFFFFC16                  ====> eax指向输入的注册名
:004BD676 E89DB9F4FF              call 00409018                      ====> 计算注册名字的长度
:004BD67B 8BF0                    mov esi, eax                        ====> 长度值放到esi中
:004BD67D 4E                      dec esi
:004BD67E 85F6                    test esi, esi                      ====> 注册名是否为空
:004BD680 7C4B                    jl 004BD6CD                        ====> 是则转,当然是eax清0并返回了
:004BD682 46                      inc esi
:004BD683 C745F000000000          mov [ebp-10], 00000000              ====> [ebp-10]置0
:004BD68A 8B450C                  mov eax, dword ptr [ebp+0C]
:004BD68D 8DB816FCFFFF            lea edi, dword ptr [eax+FFFFFC16]  ====> edi指向输入的注册名

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD6CB(C)
|
:004BD693 8A07                    mov al, byte ptr [edi]              ====> 取一个注册名字符
:004BD695 E81253F4FF              call 004029AC                      ====> 如果是小写则转为大写
:004BD69A 8BD8                    mov ebx, eax
:004BD69C 881F                    mov byte ptr [edi], bl              ====> 再送回去
:004BD69E 80FB20                  cmp bl, 20                          ====> 字符是否为空格
:004BD6A1 7423                    je 004BD6C6                        ====> 是则转,取一个注册名字符
:004BD6A3 8B4D08                  mov ecx, dword ptr [ebp+08]        ====> [ebp+8]指向第1个入栈值,分别为08h, 09h, 0Ah
:004BD6A6 33C0                    xor eax, eax
:004BD6A8 8AC3                    mov al, bl                          ====> 将字符放到al中
:004BD6AA D3E0                    shl eax, cl                        ====> eax=eax*2^第1个入栈值
:004BD6AC 0345EC                  add eax, dword ptr [ebp-14]        ====> [ebp-14]的初值为0
:004BD6AF 8B55F0                  mov edx, dword ptr [ebp-10]        ====> [ebp-10]的初值为0
:004BD6B2 0FAF5508                imul edx, dword ptr [ebp+08]        ====> edx=edx*第1个入栈值
:004BD6B6 33C9                    xor ecx, ecx
:004BD6B8 8ACB                    mov cl, bl                          ====> 将字符放到cl中
:004BD6BA 0FAFD1                  imul edx, ecx                      ====> edx=edx*ecx
:004BD6BD 0FAF55F8                imul edx, dword ptr [ebp-08]        ====> edx=edx*第2个入栈值,分别为40h, 30h, 33h
:004BD6C1 03C2                    add eax, edx                        ====> 加到eax中
:004BD6C3 8945EC                  mov dword ptr [ebp-14], eax        ====> 放到[ebp-14]中

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD6A1(C)
|
:004BD6C6 FF45F0                  inc [ebp-10]                        ====> [epb-10]加1
:004BD6C9 47                      inc edi                            ====> 准备取下个字符
:004BD6CA 4E                      dec esi                            ====> 是否取完
:004BD6CB 75C6                    jne 004BD693                        ====> 不是则继续

4BD693-4BD6CB这段的计算结果:
计算值=计算值+第n个字符*2^Y+(n-1)*Y*第n个字符*X
X三次分别为40h, 30h, 33h, Y三次分别为08h, 09h, 0Ah

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD680(C)
|
:004BD6CD 8B45F8                  mov eax, dword ptr [ebp-08]        ====> edx=edx*第2个入栈值,分别为40h, 30h, 33h
:004BD6D0 F76DF8                  imul [ebp-08]
:004BD6D3 F76DF8                  imul [ebp-08]
:004BD6D6 F76DF8                  imul [ebp-08]
:004BD6D9 F76DF8                  imul [ebp-08]                      ====> 结果eax=eax^5
:004BD6DC 50                      push eax                            ====> 入栈
:004BD6DD 8B45EC                  mov eax, dword ptr [ebp-14]        ====> 取出由输入的名字计算的值
:004BD6E0 5A                      pop edx                            ====> 出栈,edx=第2个入栈值^5,分别为40h, 30h, 33h
:004BD6E1 8BCA                    mov ecx, edx                        ====> 放到ecx中
:004BD6E3 99                      cdq                                ====> 清理edx
:004BD6E4 F7F9                    idiv ecx                            ====> 相除
:004BD6E6 8BC2                    mov eax, edx                        ====> 余数放到eax中

4BD6C0-4BD6E6这段的计算结果:
由输入的名字计算的值/第2个入栈值^5的余数

:004BD6E8 99                      cdq                                ====> 清理edx
:004BD6E9 33C2                    xor eax, edx                        ====> eax与0异或
:004BD6EB 2BC2                    sub eax, edx                        ====> 相减
:004BD6ED 8945EC                  mov dword ptr [ebp-14], eax        ====> 再放回去
:004BD6F0 8B45E8                  mov eax, dword ptr [ebp-18]        ====> 取出输入注册码的计算值
:004BD6F3 99                      cdq                                ====> 清理edx
:004BD6F4 33C2                    xor eax, edx                        ====> eax与0异或
:004BD6F6 2BC2                    sub eax, edx                        ====> 相减
:004BD6F8 3B45EC                  cmp eax, dword ptr [ebp-14]        ====> 比较两个结果是否相等
:004BD6FB 7535                    jne 004BD732                        ====> 不等,则错误
:004BD6FD 6A01                    push 00000001                      ====> 置正确标志
:004BD6FF 8D55E0                  lea edx, dword ptr [ebp-20]
:004BD702 8B45FC                  mov eax, dword ptr [ebp-04]
:004BD705 E80EB2F4FF              call 00408918
:004BD70A 8B4DE0                  mov ecx, dword ptr [ebp-20]
:004BD70D 8D45E4                  lea eax, dword ptr [ebp-1C]
:004BD710 BA7CD74B00              mov edx, 004BD77C
:004BD715 E83667F4FF              call 00403E50
:004BD71A 8B4DE4                  mov ecx, dword ptr [ebp-1C]
:004BD71D A150CD4D00              mov eax, dword ptr [004DCD50]
:004BD722 8B00                    mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"Options"
                                  |
:004BD724 BA88D74B00              mov edx, 004BD788
:004BD729 8B18                    mov ebx, dword ptr [eax]
:004BD72B FF530C                  call [ebx+0C]
:004BD72E C645F701                mov [ebp-09], 01                  ====> 设正确标志

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD6FB(C)
|
:004BD732 33C0                    xor eax, eax
:004BD734 5A                      pop edx
:004BD735 59                      pop ecx
:004BD736 59                      pop ecx
:004BD737 648910                  mov dword ptr fs:[eax], edx
:004BD73A EB0A                    jmp 004BD746
:004BD73C E95F5CF4FF              jmp 004033A0
:004BD741 E80A5FF4FF              call 00403650

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD62B(U), :004BD73A(U)
|
:004BD746 33C0                    xor eax, eax
:004BD748 5A                      pop edx
:004BD749 59                      pop ecx
:004BD74A 59                      pop ecx
:004BD74B 648910                  mov dword ptr fs:[eax], edx
:004BD74E 6868D74B00              push 004BD768

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD766(U)
|
:004BD753 8D45E0                  lea eax, dword ptr [ebp-20]
:004BD756 BA02000000              mov edx, 00000002
:004BD75B E84C64F4FF              call 00403BAC
:004BD760 C3                      ret
:004BD761 E9425EF4FF              jmp 004035A8
:004BD766 EBEB                    jmp 004BD753
:004BD768 8A45F7                  mov al, byte ptr [ebp-09]      ====> 设标志
:004BD76B 5F                      pop edi
:004BD76C 5E                      pop esi
:004BD76D 5B                      pop ebx
:004BD76E 8BE5                    mov esp, ebp
:004BD770 5D                      pop ebp
:004BD771 C20400                  ret 0004

该软件最少要求25位注册码,其中11-25位根据前面的分析进行反推即可显示注册成功,但实际上并未注册成功,希望有兴趣的高手进行进一步地分析。在注册过程中,只要11-25位的注册码正确,就显示注册成功,并将注册码简单进行编码处理(各字符值+3)后写入到FTwister.ini中。由于我的编程水平有限,分别用tc2.0和basic做了两个11-25位注册码的反推程序,需要的话请跟贴或我找到后直接贴出来。

  • 标 题:那分别是六十四进制数、四十八进制数、五十一进制数 (1千字)
  • 作 者:blowfish
  • 时 间:2001-3-30 22:20:06

:004BD899 B940000000              mov ecx, 00000040    //六十四进制数
:004BD89E BA0E000000              mov edx, 0000000E    //视注册码的第A~E位为六十四进制数
:004BD8A3 B80A000000              mov eax, 0000000A
:004BD8A8 E82BFDFFFF              call 004BD5D8
:004BD8AD 59                      pop ecx
:004BD8AE 84C0                    test al, al
:004BD8B0 0F8407010000            je 004BD9BD
:004BD8B6 55                      push ebp
:004BD8B7 6A09                    push 00000009
:004BD8B9 B930000000              mov ecx, 00000030    //四十八进制数
:004BD8BE BA13000000              mov edx, 00000013    //视注册码的第F~13位为四十八进制数
:004BD8C3 B80F000000              mov eax, 0000000F
:004BD8C8 E80BFDFFFF              call 004BD5D8
:004BD8CD 59                      pop ecx
:004BD8CE 84C0                    test al, al
:004BD8D0 0F84E7000000            je 004BD9BD
:004BD8D6 55                      push ebp
:004BD8D7 6A0A                    push 0000000A
:004BD8D9 B933000000              mov ecx, 00000033  //五十一进制数
:004BD8DE BA18000000              mov edx, 00000018  //视注册码的第14~18位为五十一进制数
:004BD8E3 B814000000              mov eax, 00000014
:004BD8E8 E8EBFCFFFF              call 004BD5D8
:004BD8ED 59                      pop ecx
:004BD8EE 84C0                    test al, al
:004BD8F0 0F84C7000000            je 004BD9BD

BTW: 你刚贴的只是MouseDown( ),还应有MouseClick( )。

  • 标 题:去水印的方法 (2千字)
  • 作 者:blowfish
  • 时 间:2001-3-30 22:14:17

下面的call 004C8D04就是用来调用DrawTextA( )来把“Trial Version”的水印加到图片上的。

1、第1处加水印的地方:

* Possible StringData Ref from Code Obj ->"%o&i瞫#r|e$v& l[ai}r#|T$"      //Trial Version的密文
                                  |
:004C9CE1 B8509F4C00              mov eax, 004C9F50   
:004C9CE6 E89DE9FFFF              call 004C8688      //对字符串进行解密
:004C9CEB A148D04D00              mov eax, dword ptr [004DD048]
:004C9CF0 8B00                    mov eax, dword ptr [eax]
:004C9CF2 8B8064070000            mov eax, dword ptr [eax+00000764]
:004C9CF8 803800                  cmp byte ptr [eax], 00
:004C9CFB 753E                    jne 004C9D3B
:004C9CFD A16CEF4D00              mov eax, dword ptr [004DEF6C]
:004C9D02 8B4078                  mov eax, dword ptr [eax+78]

* Possible StringData Ref from Code Obj ->"Twister"
                                  |
:004C9D05 BA749F4C00              mov edx, 004C9F74
:004C9D0A E805A2F3FF              call 00403F14
:004C9D0F 742A                    je 004C9D3B
:004C9D11 55                      push ebp
:004C9D12 8D4DBC                  lea ecx, dword ptr [ebp-44]
:004C9D15 8B55CC                  mov edx, dword ptr [ebp-34]
:004C9D18 8B45F8                  mov eax, dword ptr [ebp-08]
:004C9D1B E8E4EFFFFF              call 004C8D04              //加水印

2、第2处:

* Possible StringData Ref from Code Obj ->"漬鹢嗺i醩鹯觘搗 駆堨a坕苧矐T?
                                  |
:004C9E07 B8889F4C00              mov eax, 004C9F88
:004C9E0C E843E9FFFF              call 004C8754
:004C9E11 8B9558FFFFFF            mov edx, dword ptr [ebp+FFFFFF58]
:004C9E17 8D4DBC                  lea ecx, dword ptr [ebp-44]
:004C9E1A 8B45F8                  mov eax, dword ptr [ebp-08]
:004C9E1D E8E2EEFFFF              call 004C8D04
:004C9E22 59                      pop ecx
:004C9D20 59                      pop ecx

总之用DrawTextA是可以全拦下来的。004C8D04处的函数没有入口参数,也没有占用资源,所以只要把其函数体整个改成一条ret指令即可去除水印(前面发的帖子说错了,水印不是用位图资源做的)。

  • 标 题:ftwister.ini似乎是用来干扰的,fulltwister.ini好象才是真正存放注册信息的 (111字)
  • 作 者:blowfish
  • 时 间:2001-3-31 23:45:31

这作者还是比较狡猾的,不过去除了水印和时间限制之后,再把过期后Save和Save as处的限制去掉,就跟正式版没什么区别。

  • 标 题:For Guo Dongxin (29千字)
  • 作 者:WinDos2K
  • 时 间:2001-4-17 7:54:24

FontTwister v1.1 forWin95/98/NT的破解
使用FontTwister你在几秒种之内就可以建立出色的字体。它的直观的表格式界面能够方便的让你增加斜面,浮雕,透明感,纹理,边缘和在你的字体上加上污点或使用它提供的12个内置的字体类型。你可以在字体建立的过程中随时预览并修改它。你可以将你的作品保存为以下几种类型的文件,包括.bmp, .emf, .jpg, 和.wmf。尽管它的界面看上去不那么出色,但FontTwister 仍是一个为网页,插图,多媒体文件和介绍建立自己的特色字体的实用工具。在你没注册之前,“试用版”这三个字将会出现在你所有输出的字体的中间 。
本人试了一下,制作按钮确实很好,值得破

* Reference To: user32.GetDlgCtrlID, Ord:0000h
                                  |
:004BD833 E8F098F4FF              Call 00407128
:004BD838 50                      push eax
:004BD839 8BC3                    mov eax, ebx
:004BD83B E8809BF7FF              call 004373C0
:004BD840 50                      push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
                                  |
:004BD841 E8F298F4FF              Call 00407138
:004BD846 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]    ====> eax指向输入的注册码
:004BD84C E8C7B7F4FF              call 00409018                        ====> 计算注册码的长度
:004BD851 83F819                  cmp eax, 00000019                    ====> 长度是否大于等于19h,即25
:004BD854 7340                    jnb 004BD896                        ====> 是则转
:004BD856 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]    ====> eax指向输入的注册码
:004BD85C E8B7B7F4FF              call 00409018                        ====> 计算注册码的长度
:004BD861 83F801                  cmp eax, 00000001                    ====> 注册码是否为空
:004BD864 7623                    jbe 004BD889                        ====> 是则转
:004BD866 8D8516FCFFFF            lea eax, dword ptr [ebp+FFFFFC16]    ====> eax指向输入的注册名
:004BD86C E8A7B7F4FF              call 00409018                        ====> 计算注册码的长度
:004BD871 83F801                  cmp eax, 00000001                    ====> 注册码是否为空
:004BD874 7613                    jbe 004BD889                        ====> 是则转
:004BD876 6A10                    push 00000010

* Possible StringData Ref from Code Obj ->"FontTwister"
                                  |
:004BD878 68ECDA4B00              push 004BDAEC                        ====> 显示错误信息
* Possible StringData Ref from Code Obj ->"Wrong name or registration code! Enter here your address exactly so how "
                                        ->"this is written in your registering documents. Pay attention to case sensitive."
                                  |
:004BD87D 68F8DA4B00              push 004BDAF8
:004BD882 6A00                    push 00000000

* Reference To: user32.MessageBoxA, Ord:0000h
                                  |
:004BD884 E87F9AF4FF              Call 00407308

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD864(C), :004BD874(C)
|
:004BD889 33C0                    xor eax, eax
:004BD88B 5A                      pop edx
:004BD88C 59                      pop ecx
:004BD88D 59                      pop ecx
:004BD88E 648910                  mov dword ptr fs:[eax], edx
:004BD891 E927020000              jmp 004BDABD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD854(C)
|
:004BD896 55                      push ebp
:004BD897 6A08                    push 00000008                      ====> 8入栈
:004BD899 B940000000              mov ecx, 00000040                  ====> 40h即64入栈
:004BD89E BA0E000000              mov edx, 0000000E                  ====> 0Eh即14入栈
:004BD8A3 B80A000000              mov eax, 0000000A                  ====> 0Ah即10入栈,实际上是取注册码的第11-15个字符(因为包括第0位)
:004BD8A8 E82BFDFFFF              call 004BD5D8                      ====> 计算注册码并进行比较
:004BD8AD 59                      pop ecx
:004BD8AE 84C0                    test al, al                        ====> al做旗标
:004BD8B0 0F8407010000            je 004BD9BD                        ====> al=0则注册码错误
:004BD8B6 55                      push ebp
:004BD8B7 6A09                    push 00000009                      ====> 9入栈
:004BD8B9 B930000000              mov ecx, 00000030                  ====> 30h即48入栈
:004BD8BE BA13000000              mov edx, 00000013                  ====> 13h即19入栈
:004BD8C3 B80F000000              mov eax, 0000000F                  ====> 0Fh即15入栈,实际上是取注册码的第16-20个字符(因为包括第0位)
:004BD8C8 E80BFDFFFF              call 004BD5D8                      ====> 计算注册码并进行比较
:004BD8CD 59                      pop ecx
:004BD8CE 84C0                    test al, al                        ====> al做旗标
:004BD8D0 0F84E7000000            je 004BD9BD                        ====> al=0则注册码错误
:004BD8D6 55                      push ebp
:004BD8D7 6A0A                    push 0000000A                      ====> 0Ah即10入栈
:004BD8D9 B933000000              mov ecx, 00000033                  ====> 30h即51入栈
:004BD8DE BA18000000              mov edx, 00000018                  ====> 18h即24入栈
:004BD8E3 B814000000              mov eax, 00000014                  ====> 14h即20入栈,实际上是取注册码的第21-25个字符(因为包括第0位)
:004BD8E8 E8EBFCFFFF              call 004BD5D8                      ====> 计算注册码并进行比较
:004BD8ED 59                      pop ecx
:004BD8EE 84C0                    test al, al                        ====> al做旗标
:004BD8F0 0F84C7000000            je 004BD9BD                        ====> al=0则注册码错误
:004BD8F6 6A01                    push 00000001                      ====> 3处比较正确则置正确标志
:004BD8F8 A150CD4D00              mov eax, dword ptr [004DCD50]
:004BD8FD 8B00                    mov eax, dword ptr [eax]

* Possible StringData Ref from Code Obj ->"OkAll"
                                  |
:004BD8FF B99CDB4B00              mov ecx, 004BDB9C

* Possible StringData Ref from Code Obj ->"Program"
                                  |
:004BD904 BAACDB4B00              mov edx, 004BDBAC
:004BD909 8B30                    mov esi, dword ptr [eax]
:004BD90B FF560C                  call [esi+0C]
:004BD90E 8D9514FAFFFF            lea edx, dword ptr [ebp+FFFFFA14]
:004BD914 8D8516FCFFFF            lea eax, dword ptr [ebp+FFFFFC16]
:004BD91A E851B9F4FF              call 00409270
:004BD91F 8B8514FAFFFF            mov eax, dword ptr [ebp+FFFFFA14]
:004BD925 50                      push eax
:004BD926 A150CD4D00              mov eax, dword ptr [004DCD50]
:004BD92B 8B00                    mov eax, dword ptr [eax]
:004BD92D B9BCDB4B00              mov ecx, 004BDBBC

* Possible StringData Ref from Code Obj ->"Program"
                                  |
:004BD932 BAACDB4B00              mov edx, 004BDBAC
:004BD937 8B30                    mov esi, dword ptr [eax]
:004BD939 FF5604                  call [esi+04]
:004BD93C 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]
:004BD942 E8D1B6F4FF              call 00409018
:004BD947 8BD0                    mov edx, eax
:004BD949 4A                      dec edx
:004BD94A 85D2                    test edx, edx
:004BD94C 7C14                    jl 004BD962
:004BD94E 42                      inc edx
:004BD94F 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]    ====> eax指向注册码

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD960(C)
|
:004BD955 33C9                    xor ecx, ecx                          ====> ecx清0
:004BD957 8A08                    mov cl, byte ptr [eax]                ====> 取一个注册码字符
:004BD959 83C103                  add ecx, 00000003                    ====> 将该值+3
:004BD95C 8808                    mov byte ptr [eax], cl                ====> 再送回去
:004BD95E 40                      inc eax                              ====> 准备取下一个
:004BD95F 4A                      dec edx                              ====> 是否取完
:004BD960 75F3                    jne 004BD955                          ====> 没有则继续

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD94C(C)
|
:004BD962 8D9514FAFFFF            lea edx, dword ptr [ebp+FFFFFA14]
:004BD968 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]
:004BD96E E8FDB8F4FF              call 00409270
:004BD973 8B8514FAFFFF            mov eax, dword ptr [ebp+FFFFFA14]
:004BD979 50                      push eax
:004BD97A A150CD4D00              mov eax, dword ptr [004DCD50]
:004BD97F 8B00                    mov eax, dword ptr [eax]
:004BD981 B9C8DB4B00              mov ecx, 004BDBC8

* Possible StringData Ref from Code Obj ->"Program"
                                  |
:004BD986 BAACDB4B00              mov edx, 004BDBAC
:004BD98B 8B30                    mov esi, dword ptr [eax]
:004BD98D FF5604                  call [esi+04]                        ====> 存入到FTwister.ini中
:004BD990 6A40                    push 00000040

* Possible StringData Ref from Code Obj ->"FontTwister"
                                  |
:004BD992 68ECDA4B00              push 004BDAEC

* Possible StringData Ref from Code Obj ->"Thank you very much for registering. FontTwister is now unlocked. Please restart "
                                        ->"the program to activate all changes."
                                  |
:004BD997 68CCDB4B00              push 004BDBCC
:004BD99C 8BC3                    mov eax, ebx
:004BD99E E81D9AF7FF              call 004373C0
:004BD9A3 50                      push eax

* Reference To: user32.MessageBoxA, Ord:0000h
                                  |
:004BD9A4 E85F99F4FF              Call 00407308
:004BD9A9 8BC3                    mov eax, ebx
:004BD9AB E8B8CFF8FF              call 0044A968
:004BD9B0 33C0                    xor eax, eax
:004BD9B2 5A                      pop edx
:004BD9B3 59                      pop ecx
:004BD9B4 59                      pop ecx
:004BD9B5 648910                  mov dword ptr fs:[eax], edx
:004BD9B8 E900010000              jmp 004BDABD

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD8B0(C), :004BD8D0(C), :004BD8F0(C)
|
:004BD9BD BE25000000              mov esi, 00000025

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BD9D3(C)
|
:004BD9C2 BA44DC4B00              mov edx, 004BDC44
:004BD9C7 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]
:004BD9CD E87AB7F4FF              call 0040914C
:004BD9D2 4E                      dec esi
:004BD9D3 75ED                    jne 004BD9C2
:004BD9D5 33F6                    xor esi, esi

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDA7A(C)
|
:004BD9D7 68F5010000              push 000001F5
:004BD9DC 8D8516FCFFFF            lea eax, dword ptr [ebp+FFFFFC16]
:004BD9E2 50                      push eax
:004BD9E3 8B83E8020000            mov eax, dword ptr [ebx+000002E8]
:004BD9E9 E8D299F7FF              call 004373C0
:004BD9EE 50                      push eax

* Reference To: user32.GetDlgCtrlID, Ord:0000h
                                  |
:004BD9EF E83497F4FF              Call 00407128
:004BD9F4 50                      push eax
:004BD9F5 8BC3                    mov eax, ebx
:004BD9F7 E8C499F7FF              call 004373C0
:004BD9FC 50                      push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
                                  |
:004BD9FD E83697F4FF              Call 00407138
:004BDA02 68F5010000              push 000001F5
:004BDA07 8D851BFAFFFF            lea eax, dword ptr [ebp+FFFFFA1B]
:004BDA0D 50                      push eax
:004BDA0E 8B83D8020000            mov eax, dword ptr [ebx+000002D8]
:004BDA14 E8A799F7FF              call 004373C0
:004BDA19 50                      push eax

* Reference To: user32.GetDlgCtrlID, Ord:0000h
                                  |
:004BDA1A E80997F4FF              Call 00407128
:004BDA1F 50                      push eax
:004BDA20 8BC3                    mov eax, ebx
:004BDA22 E89999F7FF              call 004373C0
:004BDA27 50                      push eax

* Reference To: user32.GetDlgItemTextA, Ord:0000h
                                  |
:004BDA28 E80B97F4FF              Call 00407138
:004BDA2D 8BC6                    mov eax, esi
:004BDA2F F7AD10FCFFFF            imul dword ptr [ebp+FFFFFC10]
:004BDA35 03C7                    add eax, edi
:004BDA37 898510FAFFFF            mov dword ptr [ebp+FFFFFA10], eax
:004BDA3D DB8510FAFFFF            fild dword ptr [ebp+FFFFFA10]
:004BDA43 E8AC4FF4FF              call 004029F4
:004BDA48 D80D48DC4B00            fmul dword ptr [004BDC48]
:004BDA4E E8CD4FF4FF              call 00402A20
:004BDA53 85D2                    test edx, edx
:004BDA55 7D07                    jge 004BDA5E
:004BDA57 F7D8                    neg eax
:004BDA59 83D200                  adc edx, 00000000
:004BDA5C F7DA                    neg edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDA55(C)
|
:004BDA5E 03F8                    add edi, eax
:004BDA60 89BD10FCFFFF            mov dword ptr [ebp+FFFFFC10], edi
:004BDA66 8B8510FCFFFF            mov eax, dword ptr [ebp+FFFFFC10]
:004BDA6C B964000000              mov ecx, 00000064
:004BDA71 99                      cdq
:004BDA72 F7F9                    idiv ecx
:004BDA74 8BFA                    mov edi, edx
:004BDA76 46                      inc esi
:004BDA77 83FE65                  cmp esi, 00000065
:004BDA7A 0F8557FFFFFF            jne 004BD9D7
:004BDA80 8D850BFEFFFF            lea eax, dword ptr [ebp+FFFFFE0B]
:004BDA86 E88DB5F4FF              call 00409018
:004BDA8B 83F83A                  cmp eax, 0000003A
:004BDA8E 7319                    jnb 004BDAA9
:004BDA90 6A10                    push 00000010

* Possible StringData Ref from Code Obj ->"FontTwister"
                                  |
:004BDA92 68ECDA4B00              push 004BDAEC

* Possible StringData Ref from Code Obj ->"Wrong name or registration code! Enter here your address exactly so how "
                                        ->"this is written in your registering documents. Pay attention to case sensitive."
                                  |
:004BDA97 68F8DA4B00              push 004BDAF8
:004BDA9C 8BC3                    mov eax, ebx
:004BDA9E E81D99F7FF              call 004373C0
:004BDAA3 50                      push eax

* Reference To: user32.MessageBoxA, Ord:0000h
                                  |
:004BDAA4 E85F98F4FF              Call 00407308

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDA8E(C)
|
:004BDAA9 33C0                    xor eax, eax
:004BDAAB 5A                      pop edx
:004BDAAC 59                      pop ecx
:004BDAAD 59                      pop ecx
:004BDAAE 648910                  mov dword ptr fs:[eax], edx
:004BDAB1 EB0A                    jmp 004BDABD
:004BDAB3 E9E858F4FF              jmp 004033A0
:004BDAB8 E8935BF4FF              call 00403650

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004BD891(U), :004BD9B8(U), :004BDAB1(U)
|
:004BDABD 33C0                    xor eax, eax
:004BDABF 5A                      pop edx
:004BDAC0 59                      pop ecx
:004BDAC1 59                      pop ecx
:004BDAC2 648910                  mov dword ptr fs:[eax], edx
:004BDAC5 68DDDA4B00              push 004BDADD

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004BDADB(U)
|
:004BDACA 8D8514FAFFFF            lea eax, dword ptr [ebp+FFFFFA14]
:004BDAD0 E8B360F4FF              call 00403B88
:004BDAD5 C3                      ret


:004BDAD6 E9CD5AF4FF              jmp 004035A8
:004BDADB EBED                    jmp 004BDACA
:004BDADD 5F                      pop edi
:004BDADE 5E                      pop esi
:004BDADF 5B                      pop ebx
:004BDAE0 8BE5                    mov esp, ebp
:004BDAE2 5D                      pop ebp
:004BDAE3 C20C00                  ret 000C



计算注册码并比较的Call
* Referenced by a CALL at Addresses:
|:004BD8A8  , :004BD8C8  , :004BD8E8 
|
:004BD5D8 55                      push ebp
:004BD5D9 8BEC