找回密码
 注册
【阿里云】2核2G云新老同享 99元/年,续费同价华为云精选云产品特惠做网站就用糖果主机Jtti,新加坡服务器,美国服务器,香港服务器
查看: 1840|回复: 7

[转贴]修改QQ等级的方法

[复制链接]
发表于 2007 年 4 月 1 日 11:13:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
修改QQ等级的方法

17254

此方法不能真正改变qq等级,但可以显示个性qq等级哦!
用UltraEdit.eXeScope等工具改.这里示范的是用eXeScope改.因为比较直观.首先先下载一个eXeScope(点这里下载),关掉QQ.用eXeScope打开QQ目录下的QQRes.dll,然后选择:资源 --- 对话框 --- 1439 --- ComboBox 之后把“下拉列表”改成“下拉”然后点击“保存更新”就可以了。
此方法不能真正改变qq等级,但可以显示个性qq等级哦!
之后重新登陆QQ。就可以在QQ的“个人设置”里随意填写性别了。但是服务器只能接受2个字符或是1个汉字。接下来你想姓什么就可以姓什么了。
改等级、星星、太阳、月亮
  位图:1684
利用eXeScope工具还可以更改一些其他的参数:

  比如:

  改系统托盘,
  菜单:位图 144、148、151、157、250
  图标:图标组1775——1790,分男女两组和两种分辨率

  改等级、星星、太阳、月亮
  位图:1684

  改上线提示,应该包括按钮
  位图:1407 - 1412

  改系统新闻
  位图:1668

  手机摄像头等好友面版的小图标
  位图:1673、1674、1675

  超级语音,视频聊天等 位图 1848-1850

  隐身绿叶:Bitmap 1840、1859、1865

  登陆过渡画面:
  背景位图 - Bitmap 131、1710、1733至1744
  按钮位图 - Bitmap 145、9097(关闭)、9098、9099(最小化)
  gif 动画 - START_GIF 1704

  以下是修改等级图标后的效果。你可以把它替换为任意的图像

关于QQ登陆介面,大家可以找到QQ文件夹里的loginctrl.dll 位图-----963------找到相应的图片导入即可。(再也不用看别人的广告了!)除了这个还可以在对话框450哪里隐藏些功能,比如说记住密码....

[ 本帖最后由 ctnet 于 2007-4-1 14:25 编辑 ]
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
 楼主| 发表于 2007 年 4 月 1 日 11:27:27 | 显示全部楼层
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
修改QQ添加去广告显示IP地址和端口号的功能


修改QQ添加去广告显示IP地址和端口号的功能

本文专业性比较强,如果你连SoftICE为何物都不知道的同志就按Ctrl+W吧。要做Hacker一些基本的汇编知识是必须的。欢迎板砖鸡蛋。本文所诉数据结构和入口地址仅适合老版oicq0820,不过新版QQ方法类似。 本文所述的内容只用于研究交流之用,如用作非法用途或修改不当,一切后果自负


经过对Oicq目录结构的分析,发现目录AD和广告有关。其一是广告的英文简写就是AD,其二是其中的图片文件就是我们在广告中看到的。试着删除该目录之后,呵呵,广告消逝了。但是下次进入Oicq之后,程序会自动新建这个目录,并且重新下载广告文件。既然程序读取不到广告文件广告就会消失,那么就人工让它读不到咯。用Soft-ice把断点设置在CreateFileA上,这个API调用一般是用来打开一个文件或者设备的。在Sice截到断点后,查看是即将打开的那些文件,从而判断是否是我们要修改的地方。具体修改方法后面详诉。

如果不知道Win32 API为何物的同志也可以Ctrl+W了


广告是去掉了,但是在广告区域上点击鼠标,浏览器仍然会打开广告链接,看来我们还需要对程序作更完善的修改。好了,既然点击广告会出现浏览器,那一定是运行了一个程序。一般打开运行浏览器程序的有两种方法,一是调用COM接口,二是调用普通的运行程序的API函数。第一种方法技术难度较,一般程序很少采用。所以直接用SoftIce把断点设置在几个和运行程序有关的API函数上,比如shellExecuteA,WinExec等等。好了,程序在ShellExecuteA处中断,也就是只要避过这个API函数就行咯。呵呵,顺着程序往上找合适的修改位置,会发现USER32.PtInRect函数的调用,经过分析,发现它是用作判断鼠标点击是否在特定区域内的。搞定,只要使它判断总是在区域外,就不会执行到ShellExecuteA那儿去了。发送消息窗口和恢复窗口的广告点击的程序在不同的位置,也就说在两个地方,这两个地方都要修改,原理也都是一样。具体修改方法后详。(我们为了实现在点击鼠标后出现IP地址和端口号,在发送消息窗口添加了一个有关显示的程序入口,将在后面讲解

广告是去掉了,但是在广告区域上点击鼠标,浏览器仍然会打开广告链接,看来我们还需要对程序作更完善的修改。好了,既然点击广告会出现浏览器,那一定是运行了一个程序。一般打开运行浏览器程序的有两种方法,一是调用COM接口,二是调用普通的运行程序的API函数。第一种方法技术难度较,一般程序很少采用。所以直接用SoftIce把断点设置在几个和运行程序有关的API函数上,比如shellExecuteA,WinExec等等。好了,程序在ShellExecuteA处中断,也就是只要避过这个API函数就行咯。呵呵,顺着程序往上找合适的修改位置,会发现USER32.PtInRect函数的调用,经过分析,发现它是用作判断鼠标点击是否在特定区域内的。搞定,只要使它判断总是在区域外,就不会执行到ShellExecuteA那儿去了。发送消息窗口和恢复窗口的广告点击的程序在不同的位置,也就说在两个地方,这两个地方都要修改,原理也都是一样。具体修改方法后详。(我们为了实现在点击鼠标后出现IP地址和端口号,在发送消息窗口添加了一个有关显示的程序入口,将在后面讲解)

这下广告真的是去除了,既不能看到,也不能点进去了。呵呵,开始我们的下一步目标,显示IP地址和端口号!!!
过去要想知道Oicq上朋友的IP地址只有借助民间的一些小工具程序或者采用包监听程序,后者专业要求比较高,而且辨别率低,也不方便。一些小程序的确很管用,但是毕竟没有把这个功能直接做到Oicq程序上方便和可靠,利用Oicq内部的很多数据和结构能获得很多我们平常不容易获得的信息。但是毕竟只有二进制汇编代码,没有源程序,程序的分析难度和工作量可想而知。经过令人难以想象多次数的死机和重起,以及极其艰辛的设置断点跟踪调试分析工作……(以下省略XXXX字),终于粗略的获得了我们感兴趣的数据结构指针以及它相关调用的位置。这段时间是我最郁闷的时候,想起那段毫无人性的工作,就像已经过上幸福生活的老同志回忆起49年以前悲惨生活般的胆战心惊且心有余悸……(以下省略XXX字)。还好我挺过来了,终于在0042513D处找到了需要的指针地址。只要利用这个指针就能获得目标对象的IP地址以及端口号。我们需要做的就是把这些信息显示在以前的广告位置。

又是一项艰巨的任务放在我的面前,还好我有坚定的信念、丰富的临床经验以及对成功喜悦的企盼,还有对聊天MM住址的渴望,我一定会珍惜,不能像周星星一样期望再来一次……(再次省略若干,以免挨鸡蛋)。
言归正传,既然获得了关键的数据指针,那可以说我们已经成功了90%了,接下来的就是显示出来而已。但这也需要反复的试验和修改。让我们好好来回味一下这一过程:
首先,要实现新的功能毫无疑问需要添加代码和数据,以及执行一定的API函数,所以需要找到适当的方法添加代码到原程序之中。完美的方法就是作一个外壳添加程序,在原程序中添加所需要的段(数据段,程序段),以及添加Import表表项,以用于新的API函数的地址定位,还要修改PE文件头中的各项相关信息,这就是病毒的做法。这无疑非常的复杂和繁琐,有兴趣的同学可以参见我以前的文章"关于95下可执行文件的加密研究"。其实我们的要添加的程序量并不大,充其量也就零零星星的几百个字节,而且用到的API函数也不多。所以我们采取了手动修改添加的方法,但也需要必要的条件和方法。

看我以下的分析和方法:
PE可执行文件的逻辑结构是段,比如代码段".text"、数据段".data"、资源段".
rscs"等等。这些段大小都是按文件对齐,也就是说段大小至少会按10h对齐,一般
是1000h(4096字节),这由文件头中指定(链接的时候确定)。但是代码也好数
据也好,不可能做到长度刚好是对齐的。也就是说,段的大小是大于段中代码或数
据实际大小的。他们之间的差值就是该段冗余的空间,这个空间被称为"空隙"。有
一些简单的PE文件减肥软件就是去掉"空隙"的方法来减肥的。这个"空隙"可以被我
们用来放置代码、数据以及堆栈。我常用的分析PE文件文件头的工具软件是
Borland 以前在C++系列软件中带的"Tdump.exe"。让我们看看实际分析的结果:

Object table:
# Name VirtSize RVA PhysSize Phys off Flags
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

 楼主| 发表于 2007 年 4 月 1 日 11:28:37 | 显示全部楼层
打开广告文件的程序段
更改以前:|
:0042AF5B FF152C244D00 Call KERNEL32.CreateFileA ?
文件
:0042AF61 8BF8 mov edi, eax ?
:0042AF63 83FFFF cmp edi, FFFFFFFF ?
句柄(打开失败)
:0042AF66 897D08 mov dword ptr [ebp+08], edi ?
:0042AF69 0F84EB000000 je 0042B05A :0042AF6F 8D45F4 lea eax, dword ptr [ebp-0C]
:0042AF72 50 push eax
:0042AF73 57 push edi
更改以后:
:0042AF5B FF152C244D00 Call KERNEL32.CreateFileA ?
文件
:0042AF61 8BF8 mov edi, eax ?
:0042AF63 83FFFF cmp edi, FFFFFFFF 更改以后:
:00443B56 33FF xor edi, edi
:00443B58 397DDC cmp dword ptr [ebp-24], edi
:00443B5B EB5C jmp 00443BB9 ?
手工更改方法:
查找16进制代码:39 7D DC 75 5C
更改为: EB
文件偏移为43B5Bh
发送消息窗口点击广告的程序段
更改以前:
:00432B4E 50 push eax
:00432B4F FFB660010000 push dword ptr [esi+00000160] ;
esi+160是窗口句柄
:00432B55 FF1578274D00 Call USER32.GetWindowRect
:00432B5B 8D45DC lea eax, dword ptr [ebp-24]
:00432B5E 8BCE mov ecx, esi
:00432B60 50 push eax
:00432B61 E8A6110700 call 004A3D0C
:00432B66 FF7510 push [ebp+10]
:00432B69 8D45DC lea eax, dword ptr [ebp-24]
:00432B6C FF750C push [ebp+0C]
:00432B6F 50 push eax
:00432B70 FF15B8274D00 Call USER32.PtInRect
:00432B76 85C0 test eax, eax ?
区域内点击
:00432B78 0F84FF000000 je 00432C7D
:00432B7E 6A10 push 00000010 ?
:00432B80 FF157C274D00 Call USER32.GetKeyState
:00432B86 33DB xor ebx, ebx
:00432B88 663BC3 cmp ax, bx
:00432B8B 7D0F jge 00432B9C
:00432B8D C705D874510001000000 mov dword ptr [005174D8], 00000001
:00432B97 E9E8000000 jmp 00432C84
更改以后:
:00432B70 FF15B8274D00 Call USER32.PtInRect
:00432B76 85C0 test eax, eax
:00432B78 0F84FF000000 je 00432C7D
:00432B7E 6A10 push 00000010 ?
区域内点击
:00432B80 FF157C274D00 Call USER32.GetKeyState
:00432B86 E9F5EA0900 jmp 004D1680 ?
示程序当中
:00432B8B 7D0F jge 00432B9C
:00432B8D C705D874510001000000 mov dword ptr [005174D8], 00000001
:00432B97 E9E8000000 jmp 00432C84
手工更改方法:
查找16进制代码:33 DB 66 3B C3 7D 0F C7
更改为: E9 F5 EA 09 00
文件偏移为32B86h
回复消息窗口点击广告的程序段
更改以前:
:0046221C FF15B8274D00 Call USER32.PtInRect ?
广告区域内点击
:00462222 85C0 test eax, eax
:00462224 0F84D8000000 je 00462302 ?
更改以后:
:0046221C FF15B8274D00 Call USER32.PtInRect ?
广告区域内点击
:00462222 85C0 test eax, eax
:00462224 E9D9000000 jmp 00462302 ?
手工更改方法:

查找16进制代码:0F 84 D8 00 00 00 8B 46 56
更改为: E9 D9 00 00 00 90
文件偏移为62224h


弹出发送消息窗口之前的对象数据调用的程序段
更改以前:
:0042513D 56 push esi
:0042513E 8BF1 mov esi, ecx
:00425140 FFB6F4000000 push dword ptr [esi+000000F4]
:00425146 FFB6B0000000 push dword ptr [esi+000000B0]
:0042514C E879810300 call 0045D2CA ?
结构首址
:00425151 33C9 xor ecx, ecx
:00425153 3BC1 cmp eax, ecx ?
成功
:00425155 7431 je 00425188 结构首址
:00425151 33C9 xor ecx, ecx
:00425153 3BC1 cmp eax, ecx ?
成功
:00425155 7431 je 00425188 ?
:00425157 E9E4C40A00 jmp 004D1640 ?
IP地址和端口的程序中
:0042515C 90 nop ?
手工更改方法:
查找16进制代码:39 88 DC 01 00 00 75 08
更改为: E9 E4 C4 0A 00 90
文件偏移为25157h
显示IP地址和串口的附加程序
:004D1680 803D00174D003A cmp byte ptr [004D1700], 3A ?
字符内存区第一个字符是不是冒号,是就说明没有IP地址
:004D1687 7509 jne 004D1692 ?

:004D1689 66C70500174D003000 mov word ptr [004D1700], 0030 ?
字符内存区写上一个"0"
:004D1692 6800174D00 push 004D1700 ?

:004D1697 FFB660010000 push dword ptr [esi+00000160] 告窗口的窗口句柄
:004D169D A1E8714A00 mov eax, dword ptr [004A71E8] ?
他地方调用SetWindowTextA的地址
:004D16A2 FF10 call dword ptr [eax] ?
重定位好了的SetWindowTextA的地址
:004D16A4 E9D415F6FF jmp 00432C7D ?
之后
:004D16A9 90 nop ?
对齐好看
:004D16AA 90 nop
:004D16AB 90 nop
:004D16AC 90 nop
:004D16AD 90 nop
:004D16AE 90 nop
:004D16AF 90 nop
wsprintf所用到的模式字符串:
:004D1720 25733A2564 "%s:%d"

手工更改方法:
在文件偏移D1680处添加16进制代码:
80 3D 00 17 4D 00 3A 75-09 66 C7 05 00 17 4D 00
30 00 68 00 17 4D 00 FF-B6 60 01 00 00 A1 E8 71
4A 00 FF 10 E9 D4 15 F6- FF 90 90 90 90 90 90 90

在文件偏移D1720处添加16进制代码:
25 73 3A 25 64
保存IP地址和端口的附加程序
:004D1640 8BDC mov ebx, esp ?

:004D1642 BC00194D00 mov esp, 004D1900 ?
针到无用的内存区域
:004D1647 50 push eax ?
寄存器
:004D1648 51 push ecx
:004D1649 52 push edx
:004D164A 56 push esi
:004D164B FFB018020000 push dword ptr [eax+00000218] ?
象端口的地址
:004D1651 FFB014020000 push dword ptr [eax+00000214] P
地址的字符串指针
:004D1657 6820174D00 push 004D1720 ?
是printf的模式字符
:004D165C 6800174D00 push 004D1700 ?
:004D1661 8B3532CE4900 mov esi, dword ptr [0049CE32] 他地方调用wsprintfA的地址
:004D1667 FF16 call dword ptr [esi] ?
重定位好了的wsprintfA的地址
:004D1669 83C410 add esp, 00000010 ?
:004D166C 5E pop esi ?

:004D166D 5A pop edx
:004D166E 59 pop ecx
:004D166F 58 pop eax
:004D1670 3988DC010000 cmp dword ptr [eax+000001DC], ecx ?
原程序00425157处被改掉的有用代码
:004D1676 8BE3 mov esp, ebx ?

:004D1678 E9E03AF5FF jmp 0042515D ?
:004D167D 90 nop
:004D167E 90 nop
:004D167F 90 nop

手工更改方法:
在文件偏移D1640处添加16进制代码:
8B DC BC 00 19 4D 00 50-51 52 56 FF B0 18 02 00
00 FF B0 14 02 00 00 68-20 17 4D 00 68 00 17 4D
他地方调用wsprintfA的地址
:004D1667 FF16 call dword ptr [esi] ?
重定位好了的wsprintfA的地址
:004D1669 83C410 add esp, 00000010 ?
:004D166C 5E pop esi ?

:004D166D 5A pop edx
:004D166E 59 pop ecx
:004D166F 58 pop eax
:004D1670 3988DC010000 cmp dword ptr [eax+000001DC], ecx ?
原程序00425157处被改掉的有用代码
:004D1676 8BE3 mov esp, ebx ?

:004D1678 E9E03AF5FF jmp 0042515D ?
:004D167D 90 nop
:004D167E 90 nop
:004D167F 90 nop

手工更改方法:
在文件偏移D1640处添加16进制代码:
8B DC BC 00 19 4D 00 50-51 52 56 FF B0 18 02 00
00 FF B0 14 02 00 00 68-20 17 4D 00 68 00 17 4D

消息发送对话框中广告窗口样式的更改
更改以前的窗口样式(style)是50000012h,
WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_ETCHEDFRAME
更改以后的窗口样式(style)是50000201h,
WS_CHILDWINDOW|WS_VISIBLE|SS_LEFT|SS_CENTER|SS_CENTERIMAGE
手工更改方法:
在文件偏移141EFCh处把
12 00 00 50
改为 02 01 00 50

代码段段属性修改
更改以前的代码段属性为60000020,CER(包含代码,可执行,可读)
更改以后的代码段属性为C0000020,CRW(包含代码,可读写和执行)
手工更改方法:
在文件偏移21Ch处把
20 00 00 60
改为 20 00 00 C0
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

 楼主| 发表于 2007 年 4 月 1 日 11:30:56 | 显示全部楼层
Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 000D0637 00001000 000D1000 00001000 60000020 [CER]
02 .rdata 000320E8 000D2000 00033000 000D2000 40000040 [IR]
03 .data 00039848 00105000 00012000 00105000 C0000040 [IRW]
04 .rsrc 0003E4C0 0013F000 0003F000 00117000 40000040 [IR]
以上是用看到的Oicq.exe的段信息(它的Oject就是我们所说的段)。我们肯定是首选.text段进行观察(.text是代码段,Flag为CER,意思就是包含代码、可执行、可读的意思(Contains code, Execute,Readable))。可以看到,.text段代码实际长度D0637h,物理长度D1000,文件偏移位置为1000h处。OK,这个段有D1000h-D0637h=C9Ch的"空隙"。这个长度完全可以满足我们的需要了,而且代码数据堆栈都可以放在这个区域内。众所周知,要作为数据段使用,段的属性(
Flags)需要可写。好了,只需要改写".text"的属性即可,可写属性的值是80000000h,然后加上原来的60000020h后,就是C0000020h了,也就是变成了CERW属性。具体修改方法后详。

看看我们更改后的用Tdump分析的结果。
Object table:
# Name VirtSize RVA PhysSize Phys off Flags
-- -------- -------- -------- -------- -------- --------
01 .text 000D0637 00001000 000D1000 00001000 C0000020 [CRW]
02 .rdata 000320E8 000D2000 00033000 000D2000 40000040 [IR]
03 .data 00039848 00105000 00012000 00105000 C0000040 [IRW]
04 .rsrc 0003E4C0 0013F000 0003F000 00117000 40000040 [IR]
好了,找到了放置代码数据和堆栈的地方,也就是其实偏移1000h+D0637h 的地方。为了对齐边界,我们采用D1640h这个值(文件偏移)。用Tdump 查看代码段基址(Code Base)和PE文件映象基址(Image Base),分别是1000h和400000h,可以算出我们的程序在装入后的实际地址,400000h+1000h+D0640h=4D1640h。也就是说我们的代码在被系统装入后在内存4D1640处,这在以后程序跳转处用到。
添加代码的工作已经做好,现在关键的问题就是编制具体的代码,以用于IP地址和端口号的保存和显示。
首先是对对象数据中IP地址和端口信息的保存,我们在获得该数据指针后(程序00425157处),更改程序使程序直接跳转到我们的保存程序中(4D1640)。该数据的指针首址放在EAX,由于该段程序有些寄存器的值都有用,堆栈也不能乱压。所以我们首先修改了栈指针,使所有的堆栈活动都在我们的"空隙"中进行(堆栈顶端
4D1900)。然后保存几个寄存器的值(压栈)。IP地址和端口号分别在该数据结构+214h和218h的地方(也就是EAX+214h和EAX+218h)。IP地址是一个字符串指针,端口是个32位整数。我们要做的就是把他们都转换成字符串,保存在自己的地盘中。我们巧妙的用了一个wsprintfA函数把字符串和端口号输出到一个地址上(随便在我们的"空隙"中找个空闲的地址,我用的是4D1700,D1720中放的是格式化字符串"%s:%d")。实际这段程序翻译成C语言就是printf("%s:%d",char *ip,
int port),这样我们就把字符串形式的数据保存在了数据区里。值得注意的是,由于我们修改了原程序中的有用代码用于跳转程序,所以在我们的程序中就需要加上(cmp dword ptr [eax+000001DC], ecx),退出我们的程序之前恢复栈指针和各寄存器,用一条无条件跳转指令转回到原程序继续执行。

细心的同志可能注意到我们没有显式的调用wsprintfA函数,但是我们实际上是调用了。在显示IP的那段附加程序中调用SetWindowTextA的调用也是这样。这是怎么回事呢?我们知道所有API函数的调用前都需要重定位,这个过程发生在系统装入这个PE程序的时候。系统按照PE文件中Import表的内容对API函数在程序中的地址进行填写。我们没有修改Import表,所以,如果直接写上汇编代码,系统是不会为它定位的。由于Import表比较复杂,更改它是个非常繁琐的事情。所以我们采用变通的方法,既然系统为用到的API函数地址都作了重定位,所以API函数的地址信息也就存在了。
具体的做法如下:
找到原程序中有调用wsprintfA的地方:
:0049CE30 FF1560274D00 Call USER32.wsprintfA
:0049CE36 83C410 add esp, 00000010
:0049CE39 EB1A jmp 0049CE55
实际的汇编代码应该是Call dword ptr [004D2760],我们就知道了wsprintfA的地址是放在004D2760中。所以,我们只要间接的获得这个调用的地址,这个地址就是指向wsprintfA实际地址的二重指针。这样我们就可以直接Call这个地址了。在"显示IP地址和串口的附加程序"中所用到的SetWindowTextA也是用这种方法调用的。(具体修改方法详见"弹出发送消息窗口之前的对象数据调用的程序段"和"保存IP地址和端口的附加程序")在把IP地址和端口保存为了字符串形式在D1700h之后,今后只需要在需要的时候显示出来就行了。
前面我们提到了需要在点击广告后显示IP地址。所以,我们在点击广告的程序段中间添加了跳转到我们显示程序的入口(4D1680h)。显示程序的原理很简单,使用SetWindowTextA函数把保存在4D1700h的字符串显示在以前广告的窗口中。在显示之前,判断一下如果没有IP地址的情况,如果是只有一个冒号,说明没有IP地址,就简单的写上一个"0"。调用SetWindowTextA函数的方法在前面已经提到。需要注意还有两个重要的问题:

我们从什么地方获得SetWindowTextA函数需要的一个参数??广告窗口句柄呢?
我特意在"发送消息窗口点击广告的程序段"中写出了在点击广告时有一个Call USER32.GetWindowRect调用的代码,这个函数同样需要窗口句柄。[ESI+160h]就是USER32.GetWindowRect需要的广告窗口句柄,我们就可以利用这个句柄调用SetWindowTextA,使字符串显示在广告窗口上。
还有就是由于原来的广告窗口是用于图片的显示,所以不能用来显示字符。它的窗口样式中有个SS_ETCHEDFRAME的值。我们需要去掉它并加上用于垂直居中和水平居中的两个样式SS_CENTER和SS_CENTERIMAGE。一般静态对话框中的窗口元素(控件)都是静态的保存在资源段中,而不是程序动态生成的。所以我们不需要改程序,只需要改掉资源段中的值就可以了。具体改法详见"消息发送对话框中广告窗口样式的更改"。
程序基本上改完了,终于可以享受我们辛苦改动的结果了,不料Oicq 820版有检查文件是否被修改过这一手。同样,阻止我们通向成功道路上的任何障碍只能无情的被我们消灭,这个提示文件已被修改的对话框也只能被我们搞调。幸好搞它非常的简单,把断点设置在MessageBoxA上,等蹦出断点后,查找前面的代码,找到判断是否弹出对话框的代码并且无情的干掉,详见"弹出文件修改警告框的程序段"。
大功告成!这么多代码自己慢慢用UltraEdit查找修改吧,知道敲错一个的后果吗?呵呵,不是死机就是重起。
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

发表于 2007 年 4 月 1 日 11:31:16 | 显示全部楼层
这个是不是真的啊,太长了没有看完
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

 楼主| 发表于 2007 年 4 月 1 日 11:38:02 | 显示全部楼层
udpconn0.qq.sanook.com
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

发表于 2007 年 4 月 1 日 11:41:25 | 显示全部楼层
【腾讯云】2核2G云服务器新老同享 99元/年,续费同价
呵呵,自己骗自己的
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

发表于 2007 年 4 月 1 日 11:42:06 | 显示全部楼层
呵呵。。。。。。木意思啊。。。。
Jgwy.Com - Free Web Hosting Guide & Directory In China since 2001! Jgwy.Net-Jglt.Net
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|金光论坛

GMT+8, 2024 年 11 月 20 日 13:20 , Processed in 0.021758 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表