首先是一些TA中和快捷键相关的几个结构的地址:
511DE8 TA中的主要结构,包含了TA所用到的各种基本数据,包括声音、爆炸、内存中的3do、地图、单位、玩家、遭遇战/联网、地图feature等等的大杂烩结构。
51fbd0[16e] TA的按键消息阀口
51FBD0 是TA显示界面所用的结构。
TA窗体的回调函数MsgProc地址是 0x4c1d50
其中对键盘组合按键的的处理例程是调用0x485e90来统一处理的
显示鼠标下单位的属性是调用 0x42bf40
F1帮助 0x4942e0
处理+shootall等类似的option command: 0x417B50
属性设置窗体 0x430f00
ctrl+a 内部的键盘码a1 处理流程4963CE
ctrl+s 内部键盘码b3 处理流程4964dc
ctrl+z 内部键盘码BA 处理流程496413
ctrl+f 内部键盘码a6 处理流程4963d8
ctrl+c 内部键盘码a3 处理流程4963fe
TA的快捷键先被MsgProc处理为一种内部消息。在窗口回调中的键盘输入处理是,把有对应快捷键的输入放入消息闸门。之后在游戏的主循环时,会随着主循环而调用到一个专门处理快捷键的函数。
4c1b20 插入按键到阀门
4c1ab0 从阀门读出按键
这个消息阀门中主要是玩家在游戏中的各种输入,比如F1查看单位帮助、选择单位、单击单位控制界面、发送消息、结盟等
渠道中消息的类型以内部编码区分。内部编码实则是键盘输入的virtual-key code, 但若同时按下ctrl/alt则会变的古怪, 具体算法未知。
可在处理快捷键的函数中的0x495eb7处记录eax值得到内部编码。不确定算法,但插入阀门中的数据在插入后仍会遭到修改
要更改TA快捷键,需要处理的类型分为两类
在内部有固定函数处理的快捷键 (ctrl_s/ctrl_c/ctrl_f/ctrl_f这4个是单独处理),可以在进入对应的call 语句时(如ctrl+s的4964dc),修改目标call为call自己的新快捷键代码。
利用(Ctrl_G)这样的category来选中特定category的单位类型的,则是在一个固定的流程里处理的,每个ctrl_?对应的ecx都不一样,可以修改快捷键函数中,根据内部编码switch jmp到目标函数的switch 表中,改掉对应内部编码所对应的地址即可,需注意,这儿所跳转过去的代码,最后不能是retn返回,而该是jmp 到这个大switch的return 部分, 004965CE
TA中大量应用全局变量,导致刚开始分析时的难度倍增,但在已分析过相关数据的地方又是事倍功半的。
大部分数据结果为序列性的数组,这样使数据可轻松得无限扩充。又TA中大部分情况都会写入log文档,希望查找的code目标多半可以猜想到附近的debug信息条目故直接用字符串参考可快速定位。
TA中对带+号的特殊Command的处理,多是依赖switch的 。或用if else配合一种结构数组,这个数组的元素结构多为
{
char * string;
void * func;
}
一个指向描述当前大概情况字符串的string指针
一个指向处理当前情况函数的func指针
例如
+switchalt的处理流程为4b5cc0收到用户输入,调用4c1d50处理+switchalt到渠道.之后480770捕获到+switchalt,根据内部编码switch为调用417B50的code.
417b50中一步步比较输入的字符串,直到遇到相同的+switchalt,接着调用 “+switchalt"指针后4字节的函数地址处理了它。
4b5cc0->
4c1d50->闸门->
480770 , switch to->
417b50==”+switchalt" func
而对于选兵快捷键的处理则比较细节
sub_0_48BE00 ctrl_Z, 例程为:
首先读取char 511DE8[2a42], 乘以0x20得tmp1; 以它乘以0xa0得tmp2.
511de8[tmp1+ tmp2* 2+ 1b32h+ 67h]处指向的即为本玩家单位的数组起始,而511de8[tmp1+ tmp2* 2+ 1b32h+ 6bh]指向本玩家单位数组的结束
每个单位的结构大小为118h. ctrl+Z会挨个读取所选单位的种类二轮,第一轮把被选中的单位挑选出来,保存在一个local变量里。
继而在第二轮进行单位类型是否为存活的判定,每个单位依次判定二恒定数据(20h/40h)、一浮点属性、数个必须属性是否实在、目标单位的内部名词是否存在于local变量中,全符合条件时,则把这个单位的选中状态设置为选中
sub_0_48C030 ctrl_s的流程是 :
读取511de8[14357h]和511de8[1435b]作为UnitBegin和UnitEnd。(对应ctrl_z的 511de8[tmp1+ tmp2* 2+ 1b32h+ 67h]与511de8[tmp1+ tmp2* 2+ 1b32h+ 6bh]
接着循环的修改所有单位的已选择状态,清空所有已选择单位.
其后调用一个子函数,把那些属性要求不被ctrl_S选择到的单位,保存为一数组(覆盖已选择单位数组)返回,但这个判断必需要
short int 511de8[37ebe]==865h& char 511deb[2bee]==e0h才会多这个判断。正常时这个子函数返回0,不然会返回1且赋值511de8[37ebe]= 10h
完成后它挨个读取每个单位的结构,进行单位存活的判断
二恒定数据(20h/40h)/数个必须属性是否实在/判断单位的
ctrl_s相比ctrl+Z多了是否存在本屏幕的判断。
[110h]==40000000h的意义与[113h]==40h是一样的,是指单位被选中了。
选中目标单位的code为:
or edx, 10h
mov ebx, 1
mov [ecx+110h], edx
mov esi, dword_0_511DE8
ctrl_s相对ctrl_z更稳健,只在最起码有一个单位被选中后才设置一标志位,此标志位未设置则不进入清理函数,比ctrl_z更有效率 /:^]
保存已选中单位到本地变量
sub esp,40h
push ebx
xor eax, eax
mov ecx, 10h
lea edi, [esp+ 14h]
rep stosd
mov eax, [511DE8h]
mov eax, [eax+ 14357h]
1:
mov ecx, [eax+ 110h]
shr ecx, 4
test cl, 1
jz 2
mov cx, [eax+ 0a6h]
mov ebx, 1
and ecx, 0ffffh
mov esi, ecx
and ecx, 1fh
shr esi, 5
shl ebx, cl
mov ecx, [esp+ esi* 4+ 14h]
2:
add eax, 118h
cmp eax, edi
jbe 1
pop ebx
判断是否之前已被选中的代码:
push ecx
movzx ax, word ptr [ecx+0A6h]
mov edi, 1
mov ecx, eax
and ecx, 1Fh
shl edi, cl
shr eax, 5
test [esp+eax*4+14h], edi
pop ecx
jz short loc_0_48BEED
此只选中本屏幕内相同单位的ctrl_z修改版尚不能工作:
8B 0D E8 1D 51 00 53 55 33 DB 8B 81 57 43 01 00 8B 91 5B 43 01 00 56 3B C2 57 83 EC 40 53 33 C0
B9 10 00 00 00 8D 7C 24 18 F3 AB A1 E8 1D 51 00 8B 80 57 43 01 00 8B 88 10 01 00 00 C1 E9 04 F6
C1 01 74 20 66 8B 88 A6 00 00 00 BB 01 00 00 00 81 E1 FF FF 00 00 8B F1 83 E1 1F C1 EE 05 D3 E3
8B 4C B4 14 05 18 01 00 00 3B C7 76 C9 5B 6A 00 E8 FA 5C 00 00 8B 35 E8 1D 51 00 33 ED 8B 86 67
43 01 00 8B BE 5F 43 01 00 85 C0 0F 8E A7 00 00 00 33 C9 66 8B 0F 8B C1 C1 E0 03 2B C1 8B 8E 57
43 01 00 8D 04 80 8B 94 C1 10 01 00 00 8D 0C C1 F6 C2 20 74 71 D9 81 04 01 00 00 D8 1D 58 D7 4F
00 DF E0 F6 C4 40 74 5E 8B 81 FB 00 00 00 85 C0 75 54 8B 81 86 00 00 00 85 C0 74 09 F6 80 13 01
00 00 40 74 41 8A 81 FF 00 00 00 3A 86 42 2A 00 00 75 33 51 66 0F B7 81 A6 00 00 00 BF 01 00 00
00 8B C8 83 E1 1F D3 E7 C1 E8 05 85 7C 84 14 59 74 14 83 CA 10 BB 01 00 00 00 89 91 10 01 00 00
8B 35 E8 1D 51 00 8B 86 67 43 01 00 45 83 C7 02 3B E8 0F 8C 59 FF FF FF 85 DB 74 20 E8 3D 97 00
00 8B 0D E8 1D 51 00 66 C7 81 9C 7E 03 00 00 00 A1 E8 1D 51 00 80 88 BE 7E 03 00 10 5F 5E 5D 5B
C3
只选中带武器单位的ctrl_s, 修改目标 4964dc
8B 15 E8 1D 51 00 33 C9 83 EC 40 8A 8A 42 2A 00 00 8B C1 53 C1 E0 05 03 C1 03 D1 55 56 8D 04 80
57 B9 10 00 00 00 8D 7C 24 10 8D AC 42 63 1B 00 00 33 C0 F3 AB 8B 55 67 8B 7D 6B 8B C2 3B C7 77
3F 8B 88 10 01 00 00 C1 E9 04 F6 C1 01 74 28 66 8B 88 A6 00 00 00 BB 01 00 00 00 81 E1 FF FF 00
00 8B F1 83 E1 1F C1 EE 05 D3 E3 8B 4C B4 10 8D 74 B4 10 0B CB 89 0E 05 18 01 00 00 3B C7 76 C1
6A 00 E8 E9 5E 00 00 3B D7 0F 87 86 00 00 00 BE 00 00 00 40 8B 9A 10 01 00 00 F6 C3 20 74 6D D9
82 04 01 00 00 D8 1D 58 D7 4F 00 DF E0 F6 C4 40 74 5A 8B 82 FB 00 00 00 85 C0 75 50 8B 82 86 00
00 00 85 C0 74 08 85 B0 10 01 00 00 74 3E 66 8B 82 A6 00 00 00 BF 01 00 00 00 25 FF FF 00 00 8B
C8 83 E1 1F D3 E7 C1 E8 05 85 7C 84 10 74 1D 8A 82 FF 00 00 00 8B 3D EB 1D 51 00 3A 82 42 2A 00
00 74 09 83 CB 10 89 9A 10 01 00 00 8B 45 6B 81 C2 18 01 00 00 3B D0 0F 86 77 FF FF FF 8B 15 E8
1D 51 00 66 C7 82 9C 7E 03 00 00 00 E8 52 99 00 00 A1 E8 1D 51 00 5F 5E 5D 80 88 BE 7E 03 00 10
5B 83 C4 40 C3
ctrl_z 496413
忘了是什么功能的一段binary:
8B 0D E8 1D 51 00 53 55 33 DB 8B 81 57 43 01 00 8B 91 5B 43 01 00 56 3B C2 57 77 23 B9 2F FF FF
FF 8B A8 10 01 00 00 05 18 01 00 00 23 E9 89 68 F8 8B 15 E8 1D 51 00 3B 82 5B 43 01 00 76 E2 6A
00 E8 2A 3D F6 FF 68 EE EF 52 00 E8 00 AC F5 FF A3 F6 EF 52 00 8B 35 E8 1D 51 00 90 90 90 33 ED
8B 86 67 43 01 00 8B BE 5F 43 01 00 85 C0 0F 8E B2 00 00 00 33 C9 66 8B 0F 8B C1 C1 E0 03 2B C1
8B 8E 57 43 01 00 8D 04 80 8B 94 C1 10 01 00 00 8D 0C C1 F6 C2 20 74 7A D9 81 04 01 00 00 D8 1D
58 D7 4F 00 DF E0 F6 C4 40 74 67 8B 81 FB 00 00 00 85 C0 75 5D 8B 81 86 00 00 00 85 C0 74 09 F6
80 13 01 00 00 40 74 4A 8A 81 FF 00 00 00 3A 86 42 2A 00 00 75 3C 60 66 8B 81 A6 00 00 00 BB 01
00 00 00 25 FF FF 00 00 8B C8 83 E1 1F D3 E3 C1 E8 05 8B 15 F6 EF 52 00 85 1C 82 61 74 14 83 CA
10 BB 01 00 00 00 89 91 10 01 00 00 8B 35 E8 1D 51 00 8B 86 67 43 01 00 45 83 C7 02 3B E8 0F 8C
50 FF FF FF 85 DB 74 20 E8 33 77 F6 FF 8B 0D E8 1D 51 00 66 C7 81 9C 7E 03 00 00 00 A1 E8 1D 51
00 80 88 BE 7E 03 00 10 5F 5E 5D 5B C3
What you should do:
Add a section for add these bin code,you can used Stud_PE(or other PE editor) to do this.Remeber the section need be excutable/write/read
Copy that bin code into new section,you can do this by ollydby(recommend!),goto new section,and selecet enough space,then bin paste.
Relocating “CTRL_W” string address,infact TOTALA.EXE hadn’t “CTRL_W”,you should add it and change 52EFEE to new “CTRl_W” address
And relocating 3 call’s address, there should be “491d70”/ “488c50”/ “495860”
At last,goto
4964dc, change that call be “call bin code start”,for example,I add bin code start at 52e000,thus change to “call 52e000”.
Now,your ctrl_s selecet all weapon units in screen.
选择同屏幕相同单位:
Just 2 call,needn’t change other,just Relocating call to 491d70/485860.Other no diffrent.
8B 15 E8 1D 51 00 33 C9 83 EC 40 8A 8A 42 2A 00 00 8B C1 53 C1 E0 05 03 C1 03 D1 55 56 8D 04 80
57 B9 10 00 00 00 8D 7C 24 10 8D AC 42 63 1B 00 00 33 C0 F3 AB 8B 55 67 8B 7D 6B 8B C2 3B C7 77
3F 8B 88 10 01 00 00 C1 E9 04 F6 C1 01 74 28 66 8B 88 A6 00 00 00 BB 01 00 00 00 81 E1 FF FF 00
00 8B F1 83 E1 1F C1 EE 05 D3 E3 8B 4C B4 10 8D 74 B4 10 0B CB 89 0E 05 18 01 00 00 3B C7 76 C1
60 6A 00 E8 E8 3C F6 FF 61 3B D7 0F 87 19 01 00 00 60 8B 35 E8 1D 51 00 33 ED 8B 86 67 43 01 00
8B BE 5F 43 01 00 85 C0 0F 8E 88 00 00 00 33 C9 66 8B 0F 8B C1 C1 E0 03 2B C1 8B 8E 57 43 01 00
8D 04 80 8B 94 C1 10 01 00 00 8D 0C C1 F6 C2 20 74 52 D9 81 04 01 00 00 D8 1D 58 D7 4F 00 DF E0
F6 C4 40 74 3F 8B 81 FB 00 00 00 85 C0 75 35 8B 81 86 00 00 00 85 C0 74 09 F6 80 13 01 00 00 40
74 22 8A 81 FF 00 00 00 3A 86 42 2A 00 00 75 14 83 CA 10 BB 01 00 00 00 89 91 10 01 00 00 8B 35
E8 1D 51 00 8B 86 67 43 01 00 45 83 C7 02 3B E8 0F 8C 78 FF FF FF 61 8B 9A 10 01 00 00 F6 C3 20
74 5B D9 82 04 01 00 00 D8 1D 58 D7 4F 00 DF E0 F6 C4 40 74 48 8B 82 FB 00 00 00 85 C0 75 3E 8B
82 86 00 00 00 85 C0 74 08 85 B0 10 01 00 00 74 2C 66 8B 82 A6 00 00 00 BF 01 00 00 00 25 FF FF
00 00 8B C8 83 E1 1F D3 E7 C1 E8 05 85 7C 84 10 75 0B 83 E3 EF 90 90 89 9A 10 01 00 00 8B 45 6B
81 C2 18 01 00 00 3B D0 76 8D 8B 15 E8 1D 51 00 66 C7 82 9C 7E 03 00 00 00 E8 A2 76 F6 FF A1 E8
1D 51 00 5F 5E 5D 80 88 BE 7E 03 00 10 5B 83 C4 40 C3
SWeaponA1.rar (482 KB)
Sctrl_z.rar (482 KB)
ctrl_f.rar (482 KB)