首页
社区
课程
招聘
[分享]3句代码,在星际争霸屏幕上写字(详细教程,有图,附源码)
发表于: 2009-1-6 20:31 30935

[分享]3句代码,在星际争霸屏幕上写字(详细教程,有图,附源码)

ztd 活跃值
1
2009-1-6 20:31
30935

我们来看看在游戏里怎么写字!
游戏版本:星际争霸1.16.0
工具:OllyDBG,VS2005

如下图:


找CALL思路:游戏里写完字后,它应该会在内存里留下字符的痕迹,我们就从这个思路开始找写屏的函数。

第一步:先让游戏自已写几个字!运行游戏,选择局网IPX,和电脑对手。开始游戏后选择设置网速(玩星际的不用说怎么设置了吧?),完了它会出现以下字符:


第二步:在内存里找关键字,按下图所示,找到为止。
1,按图所示,在OD里先从D 00400000开始,回车。
2,按Ctrl+B输入关键字,再确认,如果没找到,再从1步骤开始(找不到再从D 00500000,D 00600000)。


第三步:找到后用你的大脑分析,怎么下断。
可以看得出,这是个动态分配的字符串,但是也有规律,每间隔N行就是一串。


第四步:找到规律后,我们试试在最后一次显示的字符串下面,选择一大片空白区下个"内存写入断点",看看能不能找到是哪个程序在写字符?下完断点后,在OD里按F9运行,再切换回游戏设置网速,让游戏自已再写一遍字。


第五步:运气真好,居然断到了。
1,如果断点正确(看下图1的注释),就按下图中所标的1,2,3步骤操作,之后,在OD按F9运行程序。
说明:按这三个步骤操作很重要,它可以帮你带到写屏函数那里去。因为找到写字符的内存了,我们就可以找到显示字符的函数了,因为游戏要读这段字符内存来进行显示。


第六步:离胜利不远了。
它把你带到写屏函数附近了。如下图所示,为什么要在2那里下个断再走一步?因为这还不是写屏的主函数,因为它RETN 0C,就算你用远程进程Call这个地址,程序也会出错,不会正常返回,所以我们还要往回找,看这里哪里CALL进来的,按下图的说法操作。


第七步:搞定!


第八步:通过远程调用游戏的CALL,来实现游戏写屏:
这一步骤就不详说了,VS2005,我用的是全局钩子。你们爱怎么就怎么的,反正关键代码是:
if(X键按下)
{
DWORD addr = 0x0048CFB0;//这个地址就是我们刚才找到的写屏主函数的起点(星际1.16版本)。
char *buf = "Hello Word!";
__asm
{
        xor eax,eax;
        mov edi,buf;
        call addr;
}
}

星际每个版本都可能这个地址有变化,但是步骤都差不多。下面是1.08版本的:
                DWORD addr = 0x0046DE10;//(星际1.08版本的)
                char *buf = "Hello Word!";
                __asm
                {
                        xor edx,edx;
                        mov ecx,buf;
                        call addr;
                }


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (57)
雪    币: 262
活跃值: (51)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
具体讲讲call怎么找的吧。
2009-1-6 22:01
0
雪    币: 214
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
是呀,不然大家学不到东西~~~~
2009-1-6 22:05
0
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
4
show me the money
2009-1-6 22:07
0
雪    币: 207
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
等有时间再写吧,先说个大概,找这个call是根据更改游戏网速时,它会在屏幕上提示你是low或high,然后用OD查找内存字符串“**low**”,因为是动态分配的内存,所以选择了这附近很大一块内存用OD的内存写入下断点,运气还不错,找到了写内存的这一句代码。然后找到这个写屏的函数起点,就OK了,因为时间问题,详细的步骤下次再说吧。
2009-1-6 22:28
0
雪    币: 207
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
顺便再给出一段星际联网时可以地图全开的代码(1.08版本):

//16进制字符串转数字并写入指定地址
void write_ma(DWORD addr,char *ma)
{
        __asm
        {
                PUSH EAX;
                PUSH EBX;
                PUSH ECX;
                PUSH EDX;
                PUSH ESI;
                MOV DL,16;
                MOV EBX,DWORD PTR DS:[ma];
                MOV ESI,addr;
                CALL Write;
                POP ESI;
                POP EDX;
                POP ECX;
                POP EBX;
                POP EAX;
                JMP OVER;
        Write:
                XOR EAX,EAX;
                XOR ECX,ECX;
                CALL GetAnsi;
                MUL DL;
                MOV CL,AL;
                INC EBX;
                CALL GetAnsi;
                OR AL,CL;
                MOV BYTE PTR DS:[ESI],AL;
                INC EBX;
                INC ESI;
                MOV AL,BYTE PTR DS:[EBX];
                CMP AL,0;
                JNZ Write;
                RET;
        GetAnsi:
                MOV AL,BYTE PTR DS:[EBX];
                CMP AL,57;
                JA ZiMu;
                SUB AL,48;
        L1:
                RET;
        ZiMu:
                SUB AL,55;
                JMP L1;
        OVER:
        }
}

//按F12地图全开
==============================================
        if(VK_F12 == wParam && 1 == ((lParam>>30) & 1))
        {
//游戏屏幕上显示“Open Map”
                DWORD addr = 0x0046DE10;
                char *buf = "Open Map";
                __asm
                {
                        xor edx,edx;
                        mov ecx,buf;
                        call addr;
                }
//开地图的代码
                write_ma(0x00404BA8,"7500");
                write_ma(0x00410C81,"BDFFFFFFFF");
                write_ma(0x00414046,"7400");
                write_ma(0x0046EA70,"909090909090");
                write_ma(0x0046EA7D,"EB29");
                write_ma(0x0046EA98,"7500");
                write_ma(0x0046F7EE,"310578A16500850500A86500750AFF0D90A6650090909090");
                write_ma(0x0046F815,"7400");
                write_ma(0x0046FA6B,"310578A16500850500A86500750AFF0D90A6650090909090");
                write_ma(0x0046FA92,"7400");
                write_ma(0x00470F2B,"7400");
                write_ma(0x00470F43,"EB04");
                write_ma(0x00470F4B,"EB09");
                write_ma(0x00471067,"7400");
                write_ma(0x0047107F,"EB04");
                write_ma(0x00471087,"EB09");
                write_ma(0x004C9541,"0F8400000000");
        }
}
2009-1-6 22:35
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请问楼主
0x0046DE10
是怎么找到的

不会下断啊。。。

   xor edx,edx; ---------》 这个改成 mov edx,0 可以么?
    mov ecx,buf;
    call addr;
2009-1-7 00:27
0
雪    币: 189
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
ls,1个字节的不用,难道喜欢用6个字节的?
2009-1-7 01:23
0
雪    币: 215
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
试了下开图,死掉了 LZ的星际是哪个版本啊?不是108?
一直不知道开图怎么找,还想做个War3开图的说
2009-1-8 17:24
0
雪    币: 208
活跃值: (40)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
10
不是不喜欢一个字节得,而是VC得内嵌汇编不认识 xor 同一个E?X。
呵呵
2009-1-8 17:54
0
雪    币: 207
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
11
不会死掉啊,我的是1.08的。
2009-1-8 17:58
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
关注ing

这样很好玩啊,特别是地图全开
2009-1-9 09:28
0
雪    币: 53
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
路过,顶个,学习
2009-1-9 11:31
0
雪    币: 563
活跃值: (95)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
路过支持下
2009-1-9 13:07
0
雪    币: 102
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
很关注,请问下楼主的星际版本
2009-1-9 14:38
0
雪    币: 207
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
16
1.08的,不过不可以在浩方全开地图,因为浩方有反写内存之类的保护。可以局域网和单机。
2009-1-9 18:13
0
雪    币: 208
活跃值: (18)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
能不能把浩方的保护干掉?这样就好玩了~~
2009-1-10 22:58
0
雪    币: 198
活跃值: (13)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
18
把代码 嵌入到 星际争霸中,
2009-1-10 23:19
0
雪    币: 207
活跃值: (16)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
19
水平有限,还不知道要怎么才能干掉,唉。

ls的办法可以,把星际EXE直接改了保存,管它什么反作弊的都拿它没办法。

但主要还是想知道怎么样才能干掉浩方。
2009-1-11 10:54
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
收藏了..........
2009-1-11 15:06
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
经典啊。太感谢楼主了。
2009-1-11 21:03
0
雪    币: 109
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
22
俺喜欢玩1.08的。
2009-1-12 15:06
0
雪    币: 1216
活跃值: (5109)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
23
收藏!!!!!!!!
2009-1-12 23:31
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
24
下个优化版
2009-1-13 16:45
0
雪    币: 442
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
25
108操控明显没后面几个版本好点
2009-1-13 16:45
0
游客
登录 | 注册 方可回帖
返回
//