使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制作一个补丁,就搞定了.
由于小弟水平有限,错误在所难免,请各位大虾多多指点!!!
如转载请保持文章完整性,请勿用于商业用途
- 标 题:使CCproxy2.0自己能够显示注册码(SMC) (8千字)
- 作 者:BlueBoy[CCG]
- 时 间:2001-10-18 18:59:59
- 链 接:http://bbs.pediy.com