- UID
- 39575
注册时间2007-12-3
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
C-Free是一款支持多种编译器的专业化C/C++集成开发环境(IDE)。利用本软件,使用者可以轻松地编辑、编译、连接、运行、调试C/C++程序。
官方下载地址: http://www.programarts.com/cfree_ch/download.htm
安装后大致看了下 程序是BC++写的,注册信息保存在注册表hkcu\software\c-free\4 下
about对话框里有未注册字样,就从这里下手~
dede载入,找到about对话框的FormCreate事件地址471900,下断运行,点"关于",断下,单步走
可以看到前面是初始化一些版本之类,一直来到
00471FAE |. BA 66E66A00 mov edx, 006AE666 ; ASCII "Unregistered User."
看到已经判断为未注册了,判断代码应该就在前面不远处,往上拉看到是从这里跳过来的
00471F02 |> \A1 94D36F00 mov eax, dword ptr [6FD394]
00471F07 |. 8B10 mov edx, dword ptr [eax]
00471F09 |. 83BA F00A0000>cmp dword ptr [edx+AF0], 1
00471F10 |. 0F85 92000000 jnz 00471FA8
而这又是从下面跳转来的
00471CC1 |. 83BA F00A0000>cmp dword ptr [edx+AF0], 2 ;edx+AF0 = 00CF67A0, 注册标志!
00471CC8 |. 0F85 34020000 jnz 00471F02
该标志地址可能并非固定,所以如果注册标志不等于2 就over(等于1的话不知道什么用,试了下和0没区别),所以只要在之前的程序对00CF67A0赋值时候,把赋的值改成2就ok, ctrl+f2重来
由于00CF67A0这内存是运行期间分配的,所以要等程序读完注册表才能对它下断点,bp RegQueryValueExA,在00CF67A0所在内存被分配出来之后,对00CF67A0下内存写入断点,运行,断下2次
第一次
0042F019 . 33D2 xor edx, edx
0042F01B . 8990 F00A0000 mov dword ptr [eax+AF0], edx ;断在这
改成
0042F019 43 inc ebx ;此时ebx等于0
0042F01A 43 inc ebx
0042F01B 8998 F00A0000 mov dword ptr [eax+AF0], ebx
第二次
00432123 . 33C9 xor ecx, ecx
00432125 . 898A F00A0000 mov dword ptr [edx+AF0], ecx ;断在这
改成
00432123 90 nop ;此时eax等于1
00432124 40 inc eax
00432125 8982 F00A0000 mov dword ptr [edx+AF0], eax
修改后,运行程序,点"关于",还是看到未注册字样,再到about的FormCreate事件里,找到
00471CD5 8338 00 cmp dword ptr [eax], 0
00471CD8 74 07 je short 00471CE1 ;这里改成jmp 00471CEB,否则over
00471CDA 8B10 mov edx, dword ptr [eax]
00471CDC 8B4A FC mov ecx, dword ptr [edx-4]
00471CDF EB 02 jmp short 00471CE3
00471CE1 33C9 xor ecx, ecx
00471CE3 85C9 test ecx, ecx
00471CE5 0F8E 17020000 jle 00471F02
00471CEB 33C0 xor eax, eax
00471CED 8945 88 mov dword ptr [ebp-78], eax
00471CF0 8D55 88 lea edx, dword ptr [ebp-78]
00471CF3 8BC6 mov eax, esi
00471CF5 E8 42040000 call 0047213C ; 取name信息准备用于显示
00471CFA 85C0 test eax, eax
00471CFC 0F84 41010000 je 00471E43 ; 这里改成jmp 00471D38否则over
00471D02 E8 8F7C2100 call <jmp.&KERNEL32.GetTickCount>
改好保存 一切ok |
|