1. 喊话CALL
查找思路:在聊天窗口输入一段文字,在CE中扫描这段文字的内容,wwh Evil0r 区分大小写,最终找到两个地址,一个是编辑框里面显示的内容,一个是真正喊话的内容
查找访问编辑框内容(因为喊话肯定要读取这个编辑框的内容):4403a9
OD进入分析,转到该地址下断,游戏中输入喊话内容在OD中断下来,往下拉可以看到有个call,代码注入器测试,成功喊话
mov esi,0c86df00
mov edx,[esi]
push 0d
push 0d
push 3ed
mov ecx,esi
call [edx+4]
注意:要用CE剥离进程可以用其重新附加一次(但是感觉不如直接退出CE好用。。。),push 0D=13 是回车键,ESI的值有一个基址,下面会查找
2. 喊话CALL参数基址+偏移分析与VC实现
首先看下CALL
00440409 8B16 mov edx,dword ptr ds:[esi]
0044040B 57 push edi
0044040C 53 push ebx
0044040D 68 ED030000 push 3ED
00440412 8BCE mov ecx,esi
00440414 FF52 04 call dword ptr ds:[edx+4]
首先下断记下此时ESI的值= 0C86E360,查找ESI的来源 CE中搜索可以找到一个基址
03E6F304
然后再找参数 编辑框输入字符串CE中搜索 找出真正的喊话地址,dd该地址,下内存访问断点,游戏中喊话断下来
来到的地方是对字符串的操作,分析反汇编代码,得到喊话字符串地址[0DD6148]+13C ,可以dc [0DD6148]+13C查看下
现在可以写喊话的函数了
VOID Talk(const char * text)
{
char *s;
int *p;
p=(int *)0x0DD6148;
s=(char *)(*p+0x13c);
memcpy(s,text,strlen(text));
__asm
{
mov esi,0x03E6F304
mov esi,[esi]
mov edx,[esi]
push 0x0d
push 0x0d
push 0x3ed
mov ecx,esi
call [edx+4]
}
}
调用:
CString str;
GetDlgItemText(IDC_EDIT_SPEAK,str);
USES_CONVERSION;
Talk(T2A(str.GetBuffer()));
str.ReleaseBuffer();