• 标 题:使CCproxy2.0自己能够显示注册码(SMC) (8千字)
  • 作 者:BlueBoy[CCG]
  • 时 间:2001-10-18 18:59:59
  • 链 接:http://bbs.pediy.com

使CCproxy2.0自己能够显示注册码(SMC)
作者:BlueBoy[CCG]
工具:Softice,Wasm,Ultraedit,
软件介绍:主要用于共享上网.

好了,我们现在开始
  首先我通过跟踪已经找到了该程序的注册码,但是它的算法比以前有了很大的不同变的好麻烦,写注册机很不好写,而且用Keymaker和crackcode2000都不能直接读出密码(也许是我的水平不够),所以呢我打算用SMC让程序自己显示注册码.
  现在我们需要解决的问题是首先获得注册码EDIT的句柄,然后调用SetWindowTextA
显示出来.用Spy find window 发现注册窗口是一个模式对话框,所以我们首先应该找到注册窗口的句柄,然后调用GetDlgItem获得EDIT的句柄.
  用Soft loader载入CCProxy.exe然后bpx CreateDialogIndirectParamA F5运行,程序中断按F12,F10然后来到这里

:004316A1 FF1520144400            Call dword ptr [00441420]

:004316A7 8D4DE4                  lea ecx, dword ptr [ebp-1C]
:004316AA 8945E8                  mov dword ptr [ebp-18], eax

:004316AD 885DFC                  mov byte ptr [ebp-04], bl
:004316B0 E8113C0000              call 004352C6
:004316B5 EB1D                    jmp 004316D4
:004316B7 8B4DD4                  mov ecx, dword ptr [ebp-2C]
:004316BA E878540000              call 00436B37
:004316BF 8B45DC                  mov eax, dword ptr [ebp-24]
:004316C2 83482CFF                or dword ptr [eax+2C], FFFFFFFF
:004316C6 B8CC164300              mov eax, 004316CC
:004316CB C3                      ret
再按F5程序正常运行,点注册,这时程序再次中断,F12,F10后同样来到上边哪个地方
这时EAX的内容就是我门需要的哪个handle,所以我们在004316A7处设置跳转语句使他转到我们的附加程序,并根据EDIT的ID调用GetDlgItem获得EDIT的handle,因为我们每次点注册时都会调用CreateDialogIndirectParamA所以能够保证handle的正确性.
现在已经有了句柄,然后要做的就是找到注册码.我们可以在下边这个地方找到注册码
:00404635 E8DCB00200              call 0042F716
:0040463A 8B44240C                mov eax, dword ptr [esp+0C]
:0040463E 8BF3                    mov esi, ebx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
:00404662(C)
:00404640 8A10                    mov dl, byte ptr [eax]<-----在这个地方D eax
:00404642 8A1E                    mov bl, byte ptr [esi] 可以看到注册玛
:00404644 8ACA                    mov cl, dl
:00404646 3AD3                    cmp dl, bl
:00404648 751E                    jne 00404668
:0040464A 84C9                    test cl, cl
:0040464C 7416                    je 00404664
:0040464E 8A5001                  mov dl, byte ptr [eax+01]
所以我们在00404640处设置跳转,然后用附加程序保存注册玛,
现在我们需要在注册错误之后,点确定就显示注册码所以我们应该修改下边的代码
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00407289(C)
|
:004072C0 8D442410                lea eax, dword ptr [esp+10]

* Possible Reference to String Resource ID=00126: "Sorry, Register Failed!"
                                  |
:004072C4 6A7E                    push 0000007E
:004072C6 50                      push eax
:004072C7 E894C9FFFF              call 00403C60
:004072CC 83C408                  add esp, 00000008
:004072CF 50                      push eax
:004072D0 8D4C2410                lea ecx, dword ptr [esp+10]
:004072D4 C644242002              mov [esp+20], 02
:004072D9 E821E10200              call 004353FF
:004072DE 8D4C2410                lea ecx, dword ptr [esp+10]
:004072E2 885C241C                mov byte ptr [esp+1C], bl
:004072E6 E8DBDF0200              call 004352C6
:004072EB 8B4C240C                mov ecx, dword ptr [esp+0C]
:004072EF 53                      push ebx
:004072F0 6A10                    push 00000010
:004072F2 51                      push ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004072BE(U)
|
:004072F3 E8C2200300              call 004393BA
:004072F8 8D4C240C                lea ecx, dword ptr [esp+0C]
:004072FC C744241CFFFFFFFF        mov [esp+1C], FFFFFFFF
:00407304 E8BDDF0200              call 004352C6
:00407309 8B4C2414                mov ecx, dword ptr [esp+14]
:0040730D 5F                      pop edi
:0040730E 5E                      pop esi
:0040730F 5B                      pop ebx
:00407310 64890D00000000          mov dword ptr fs:[00000000], ecx
:00407317 83C414                  add esp, 00000014
:0040731A C3                      ret

我们选择在00407309处设置跳转,然后执行我们的程序显示注册码,现在万事具备了.
现在开始修改,用eXeScope打开该文件,查开文件的头部关于.text段的描述
000001E8  .text        Section Name
000001F0  0003FAB3    Virtual Size
000001F4  00001000    RVA/Offset
000001F8  00040000    Size of Raw Data
000001FC  00001000    Pointer to Raw Data
00000200  00000000    Pointer to Relocs
00000204  00000000    Pointer to Line Number
00000208  0000        Number of Relocs
0000020A  0000        Number of Line Number
0000020C  60000020    Section Flags(Readable,Executable,Code)
段的实际大小为物理大小为3FAB3,而以1000对齐,所以能有很大的空隙用于插入我们的代码,我们的程序很短所以不用另添加段了,所以只需修改原程序代码段,为了能够读写我们设置Section Flags=C0000020,我开始用了00040AC0不过经过测试,程序在调入时只调入到0043EFFB,而我们的代码没有被调入,并且调入代码的后边部分均为含有很多的int 3,所以可能是调试信息,尝试修改后对程序没有影响(也许是测试的不够全面)所以我们选择在这部分空间插入代码,我选择了0003DED0,
填写代码
-----------------------------
用于计算EDIT句柄的附加程序段 |
-----------------------------
push ebp        :55
mov ebp,esp      :8BEC
mov esp,00440b30 :BCA0EF4300    <-----设置堆栈
push eax        :50
push ecx     :51           
push edx        :52             
push esi        :56            <-----保存个寄存器的值
push 0000042E    :682E040000    <-----EDIT的ID
push eax        :50            <-----CreateDialogIndirectParamA的返回值
                                      注册对话框的句柄
Call dword ptr [0044142C] :FF152C144400 <-----GetDlgItem
mov ebx,00440B70 :BB700B4400    <-----选择一个无用的内存区域     
mov [ebx],eax    :668903        <-----保存EDIT的handle
mov ebx,00000000 :BB000000      <-----恢复EBX(其实这个地方可以用堆栈)
pop esi          :5E             
pop edx          :5A
pop ecx          :59
pop eax          :58           
mov esp,ebp      :8BE3
pop ebp          :5D            <-----还原各项值
lea ecx, dword ptr [ebp-1C]:8D4DE4<-----我们修改了原程序004316A7和004316AA的mov dword ptr [ebp-18], eax:8945E8      内容所以在此处加上
jmp 004316AD    :E9A637FFFF    <------跳回原程序
      同时我们将004316A7改为jmp 0043DED0:E924C80000
                            nop        :90 用于对齐
-----------------------
用于保存注册码的代码段 |
------------------------
push ebp        :55
mov ebp,esp      :8BEC
mov esp,00440b30 :BCA0EF4300    <-----设置堆栈
push eax        :50             
push esi        :56            <-----保存个寄存器的值
push eax        :50
mov  esi,00440B70:BE700B4400     
mov  esi,[esi]  :8B36          <-----判断句柄是否有效
cmp  esi,00      :83FE00 
jz  0043DF7F    :7415          <-----无效跳走       
push 0043E000    :6800E04300    <-----%S(事先将%S写入0043E000
push 0043DFD0    :68D0DF4300    <-----保存注册码的地址   
Call dword ptr [004413C4] :FF15C4134400<----wsprintfA
                    有效则将注册码写到0043DFD0
add esp,0c      :83C40C
jmp  0043DF34    :EB01
pop  EAX     :58
pop  Esi        :5A       <--------恢复个寄存器的值
pop  EAX        :58
mov  esp,ebp    :8BE5
pop ebp          :5D
mov dl, byte ptr [eax]:8A10<--------调用原程序被我们破坏的语句   
mov bl, byte ptr [esi]:8A1E                   
mov cl, dl      :8ACA
jmp 00404646     :E90267FCFF<--------跳回原程序
    同时将原程序00404640处改为jmp 0043DF07:E9C2980300
                  nop        :90
-----------------
显示注册码的程序
-----------------
push esi          :56      <----保存
push 0043DFD0    :68D0DF4300  <------注册码的地址作为参数入栈
mov esi,00440B70  :BE700B4400  \__取EDIT的handle
mov esi,[esi]    :8B36        /
push esi      :56        <-----handle作为参数入栈
Call dword ptr [00441514]:FF1514154400<-----SetWidnowTextA
pop esi          :5E        <-----还原
mov ecx,[esp+14]  :8B4C2414  <-----恢复原程序被破坏的部分
pop edi          :5F       
jmp 0040730E      :E9AB93FCFF<-----跳回原程序继续执行
同时将原程序00407309改为:jmp 0043DF44:E9366C0300
------------------------------------
将程序要用的堆栈部分全部改为00 00 将0043E000改为25 73(%s作为参数传递)

用UltraEdit手动修改以上各处,运行一下,然后注册看到什么了,哈是不是很爽啊!!!
然后用CodeFusion制作一个补丁,就搞定了.


由于小弟水平有限,错误在所难免,请各位大虾多多指点!!!
如转载请保持文章完整性,请勿用于商业用途