先装这个驱动

再下这个

完成

chrome 32 以上,Chrome Toolbox 失效后的版本

  1. 强制 –user-data-dir=”X:\ChromeDir\UserData”
  2. 标签栏滚轮切换标签
  3. 快捷键:

    F1 <—-> CTRL + PAGE_UP

    F2 <—-> CTRL + PAGE_DOWN

    F4 <—-> ALT + W

    ALT + Z <—-> CTRL + SHIFT + T

ChromeHook
ChromeUpdater
@echo off
cd/d "%~dp0"

rd "%localappdata%\Google\Chrome\User Data"
md "%localappdata%\Google\Chrome\"
mklink /j "%localappdata%\Google\Chrome\User Data" "%~dp0UserData"
pause

fuck qq

@echo off

if not exist "Files\" goto:eof

cd/d "%~dp0\Files\Bin"

copy ..\..\QQ\Bin\netapi32.dll .

set DEBUG=

for %%f in (^
    auclt.exe ^
    QQApp.exe ^
    QQPI.exe ^
    QQSafeUD.exe ^
    StorageTool.exe ^
    Tencentdl.exe ^
    maLauncher.exe ^
    maUpdat.exe ^
    QPerfHelper.exe ^
    QScanEngine.dll
) do (

    %DEBUG% ren %%f %%~nf2%%~xf
)

cd..

rd/s/q QQProtect

echo D|xcopy /y /e ..\QQ\Misc\Sound .\Misc\Sound
echo D|xcopy /y /e ..\QQ\QQProtect .\QQProtect

del QQUninst.exe txupd.exe

cd Plugin

md Disabled

for %%p in (^
    Com.Tencent.Advertisement ^
    Com.Tencent.GameLife ^
    Com.Tencent.Graffito ^
    Com.Tencent.HRTX ^
    Com.Tencent.Memo ^
    Com.Tencent.MMOG ^
    Com.Tencent.NetBar ^
    Com.Tencent.PaiPai ^
    Com.Tencent.PayCenter ^
    Com.Tencent.QQGame ^
    Com.Tencent.QQLive ^
    Com.Tencent.QQMusic ^
    Com.Tencent.QQPet ^
    Com.Tencent.QQRing ^
    Com.Tencent.QQShow ^
    Com.Tencent.QQWebsite ^
    Com.Tencent.QT ^
    Com.Tencent.Soso ^
    Com.Tencent.SpeedDating ^
    Com.Tencent.Stock ^
    Com.Tencent.Today ^
    Com.Tencent.VAS ^
    Com.Tencent.WBlog ^
    Com.Tencent.WenWen ^
    Com.Tencent.Winks
) do (

    rem %DEBUG% rd/s/q %%p
    rem %DEBUG% move %%p Disabled
    echo. > %%p\Disabled
)

echo on

:rename

cd/d "%~dp0"
ren QQ QQ2
ren Files QQ

去年碧轨 PC 版刚出来的时候,我花了很多时间去分析它的各种二进制文件。

包括 itp、itc、剧情脚本、战斗脚本、物品脚本等等,可以说是除了 3D 模型之外的东西,差不多都分析完了。

之后我用 python 写了一套工具——这也是我第一次用 python 写快餐脚本以外的东西,很多地方删删改改,看起来很混乱。 这套工具能将二进制文件转换为 python 代码,通过执行 python 代码又可以生成对应的二进制文件。

编写这样一套工具,是我六年前学编程的目标和动力,现在,终于达成了。

接下来我将通过一系列文章,把分析的成果记录下来。

场景攻击

从零之轨迹开始,在大地图下可以直接攻击魔兽,等级高于魔兽 10 级以上时,可以直接秒杀,节省战斗时间的同时还可以刷耀晶片。 它的学名叫作 FieldAttack(FA)。

下图是我自定义的七柱的攻击动作:

每个人的攻击动作都保存在 FA 脚本中:

1
\ED_AO\data\system\fachrXXX._bn
,XXX 是角色编号(10进制)。

所有可控角色对应编号如下:

编号 角色
0x0000 罗伊德
0x0001 艾莉
0x0002 缇欧
0x0003 兰迪
0x0004 瓦吉
0x0005
0x0006 神狼蔡特
0x0007 亚里欧斯
0x0008 诺艾尔上士
0x0009 达德利搜查官
0x000A 加尔西亚

文件结构

下图是罗伊德的 FA 脚本

1
\ED_AO\data\system\fachr000._bn

两字节,头部大小,包含自身、itc 索引和 eff 文件名

四字节,itc 索引,也就是人物的贴图,索引格式看 这里

以单字节 0 结尾的字符串,不包含后缀的 eff 文件名。
只能指定 \ED_AO\data\effect\eff\ 目录下的 .eff 文件。
eff 文件决定了攻击范围,击中效果,击中音效。
另外有的 eff 是无法击中目标的。

不定长,FA Byte Code

FA Byte Code

FA 脚本一共 14 条 Byte Code,相比其它两个脚本,数量是相当少,当初只花了不到半小时就搞定了, 代码在这

ByteCode 助记符 参数
0x00 Return NO_OPERAND
0x01 SetChrSubChip C
0x02 Sleep H
0x03 PlayEffect WHHHHHB
0x04 Sound H
0x05 Voice HHHH
0x06 FA_06 NO_OPERAND
0x07 FA_07 NO_OPERAND
0x08 FA_08 h
0x09 FA_09 HH
0x0A BlurSwitch HH
0x0B FA_0B H
0x0C FA_0C WW
0x0D FA_0D NO_OPERAND

表中的参数定义在这。 基本原则是小写有符号,大写无符号

参数 类型 字节
c/b CHAR 1
C/B UCHAR 1
w/h SHORT 2
W/H USHORT 2
l/i LONG 4
L/I ULONG 4
q LONG64 8
Q ULONG64 8
f FLOAT 4
d DOUBLE 8
s bytes len
S str encoded len + 1
o short label 2
O long label 4

所以上面那个 FA 脚本会被反汇编成:

from FieldAttackChr import *

def main():
    CreateFieldAttack("fachr000._bn", "chr/ch00052.itc", "sysatk00")

    SetChrSubChip(3)
    Sleep(60)
    SetChrSubChip(0)
    Sleep(60)
    Voice(2006, 2007, 2008, 0)
    Sound(533)
    PlayEffect(0xFCE0, 0, 0, 0, 0, 65446, 0x0)
    Sleep(100)
    SetChrSubChip(1)
    Sleep(80)
    SetChrSubChip(2)
    Sleep(80)
    SetChrSubChip(3)
    Sleep(150)
    Voice(3087, 3088, 3089, 0)
    Sound(533)
    PlayEffect(0x3E8, 0, 0, 65516, 45, 110, 0x0)
    SetChrSubChip(4)
    Sleep(80)
    SetChrSubChip(5)
    Sleep(80)
    SetChrSubChip(6)
    Sleep(100)
    Return()

TryInvoke(main)

图中七柱的 FA 脚本

from FieldAttackChr import *

def main():
    #CreateFieldAttack("fachr176._bn", "chr/ch04258.itc", "cr035301")
    CreateFieldAttack("fachr176._bn", "chr/ch04258.itc", "sysatk07")
    SetChrSubChip(0)
    Sleep(120)
    SetChrSubChip(1)
    Sleep(90)
    Voice(3867, 3866, 3876, 0)
    Sound(248)
    BlurSwitch(0x0, 10)
    FA_0B(500)
    PlayEffect(0x0, 1000, 0, 0, 0, 0, 0x0)
    SetChrSubChip(2)
    Sleep(120)
    SetChrSubChip(3)
    Sleep(120)
    SetChrSubChip(4)
    Sleep(120)
    SetChrSubChip(5)
    Sleep(120)
    SetChrSubChip(6)
    Sleep(250)
    Return()

TryInvoke(main)

FA 脚本的分析到此就结束了,最后附上解析 FA Byte Code 的代码位置:

1
2
3
4
5
6
7
8
006F6B48   . /0F84 8A0A0000     je      0x6F75D8
006F6B4E   . |8B45 E8           mov     eax, dword ptr [ebp-0x18]
006F6B51   . |0FB608            movzx   ecx, byte ptr [eax]
006F6B54   . |898D 80FCFFFF     mov     dword ptr [ebp-0x380], ecx
006F6B5A   . |83BD 80FCFFFF 0D  cmp     dword ptr [ebp-0x380], 0xD
006F6B61   . |0F87 6C0A0000     ja      0x6F75D3
006F6B67   . |8B95 80FCFFFF     mov     edx, dword ptr [ebp-0x380]
006F6B6D   . |FF2495 04786F00   jmp     dword ptr [edx*4+0x6F7804]

虽然网上教程不少,但照着做也折腾了我一个下午,可见还是有问题的。

现在以 Windows 8.1 x64 为例,把流程记录一下:

  1. 安装 ruby,假设安装目录是 C:\ruby

    google 搜索 rubyinstaller

    x64 安装包,安装程序可以自动添加 ruby 目录进 PATH

    x64 7z压缩包,需要手动添加 ruby 目录进 PATH,或者写个 run.bat 保存到 ruby 目录:

    1
    
    @set path=%~dp0;%path% & @cmd /k
    

  2. 更新 RubyGems 到最新版

    cmd 下执行

    1
    
    gem update --system
    

  3. 下载 DevKit

    http://rubyinstaller.org/downloads/

    DevKit-mingw64-32-4.7.2-20130224-1151-sfx.exe

    解压到

    1
    
    C:\ruby\devkit
    

  4. 安装 DevKit

    1. 切换到 devkit 目录

      1
      
      cd/d C:\ruby\devkit
      

    2. 1
      
      ruby dk.rb init
      

      此时会生成一个

      1
      
      C:\ruby\devkit\config.yml
      

      打开它,把最后一行的

      1
      
      ---
      

      改成

      1
      
      - C:/ruby
      

    3. 1
      
      ruby dk.rb install
      

  5. 切换到淘宝的 RubyGems 镜像

    http://ruby.taobao.org/

  6. 安装 jekyll、wdm、kramdown

    1. 1
      
      gem install jekyll --version=1.4.2
      

      当前最新版本是

      1
      
      1.4.3
      
      据说跟 Windows 相性不好

    2. 1
      
      gem install wdm
      

      当前最新版是

      1
      
      0.1.0
      

    3. 1
      
      gem install kramdown
      

      当前最新版是

      1
      
      1.3.2
      

另外还有些小问题:

  • 使用绿色版的 python 2.x
# C:\ruby\lib\ruby\gems\2.0.0\gems\pygments.rb-0.5.4\lib\pygments\popen.rb:47

def python_binary
  @python_binary ||= begin
    'D:/Dev/Python27/python.exe'
    #`which python2`
    #$?.success? ? "python2" : "python"
  end
end
# C:\ruby\lib\ruby\2.0.0\webrick\httprequest.rb:217

#@path = HTTPUtils::unescape(@request_uri.path)
@path = HTTPUtils::unescape(@request_uri.path).force_encoding('UTF-8')
  • jekyll 不支持中文,只需要在
    1
    
    _config.yml
    
    里加上一行
    1
    
    encoding: "utf-8"
    

最后可以写个批处理启动 jekyll