MotaHD Repaired CAPIx

由于CAPI1.2不兼容win8以上系统,Defanive大神的MotaHD无法加载CAPI,导致无法在新系统上运行…
本身多么经典的批处理游戏,就这样陪着旧系统长眠了???? NO NO NO 改下加载方式依然复活如初!!!
请允许我不厚道的转载并添加了自己的名字。毕竟这么好的东西没人修复,太可惜了。算是我动手留念吧

论真的修复倒是算不上,只是将CAPI换成CAPIx,并且分别使用两种加载方式而已。

画面,手感,声音,菜单,样样俱全!!但依然是批处理游戏,刺激不!?
我在XPX32和WIN10X64系统下测试,无问题!其他人也可以测试测试

上面是切换加载CAPIx的方式,两行好像都行

下载地址:MotaHD(Repaired by ZhangZsky).7z

以下为原帖地址:
MotaHD defanive
http://www.bathome.net/thread-20217-1-1.html
CAPIx bailong360
http://www.bathome.net/thread-39367-1-1.html
CAPIx 2 bailong360
http://www.bathome.net/thread-43107-1-1.html

关于“MotaHD Repaired CAPIx”我的2个想法

  1. CAPIx 2.0 帮助

    1 简介

    致敬D大和他的CAPI(注入版)

    简介:

    CAPI是bathome的defanvie开发的一款第三方,堪称批处理第三方的登峰造极之作

    CAPI提供的最大功能就是一个:调用系统API 除此之外,CAPI并没有任何功能

    而且其注入式的特点,一方面使得其调用速度得到了飞一般的提升,另一方面也使得其能够保存进程数据

    这两个功能,赋予了CAPI无穷的力量

    何为系统API?简而言之,是MS为了便利开发者,而封装在dll中的一系列函数

    通过这些函数,开发者可以不需要理解系统的内部原理就方便地开发出产品

    比如著名的image(第一代),就是调用了gdi32中的API从而实现了绘图功能

    而利用CAPI,我们可以轻松地实现这个功能,而且由于CAPI是注入式的,我们可以甚至可以实现双缓冲

    即先把图片画到内存中的画布上,等待所有的图片都绘制完成,再将整块画布复制到CMD中

    这样做的最大好处就是可以避免闪烁,实现流畅地绘制

    然而CAPI有几个问题,导致了它虽然强大,但却很少被使用

    1.采取远程线程注入的方法将dll注入到cmd中,这是病毒的常用伎俩,因此误杀率极高

    2.开发者defanvie已经很久没有现身,而且CAPI没有开源.已经无法在最新的系统上运行了

    CAPIx就是为了解决这两个问题而开发的

    首先CAPIx摒弃了远程线程注入的方式,而是使用一个修改过的提取自win 2003的cmd

    这个cmd在启动时会自动加载CAPIx.dll,免去了注入的危险

    其次CAPIx的开发者是可以联系到的,而且CAPIx完全开源,这为修复bug和增加功能提供了方便

    并且CAPIx在API调用的功能上做出了进一步的加强

    在API Call之外又提供了一个新命令API Exec,用来调用遵循__cdecl约定的函数

    简而言之,可以调用其他dll中的函数,比如msvcrt中的大部分函数,像printf, scanf之类的

    又比如调用regex2.dll实现正则匹配,还可以自己写dll供Exec调用,比如写一个浮点运算的dll代替set/a之类的

    CAPIx潜力无限!

    下载地址: https://github.com/YinTianliang/CAPIx/tree/master/bin

    请务必下载CAPIx.dll和cmd.exe, CAPIx_Help.html为详细帮助,建议下载

    使用CAPIx进行的程序只能在上面这个cmd.exe中正常运行

    所以建议使用以下JS启动游戏(该cmd.exe需要与js, capix.dll放在同一目录下)

    或者在批处理开头加上这两行

    为了兼容以前的的CAPI作品, CAPIx的语法和CAPI是一样的, 只是在此基础之上做了加强, 使之更加人性化

    本文档中的大部分内容来自http://www.bathome.net/thread-19238-1-1.html

    2 标识符

    标识符用来添加在参数前面, 指定这个参数的类型

    符号 大小 意义
    . 1B 字节
    : 2B 短整形
    ; 4B 长整形
    ~ 4B 浮点型
    8B 双浮点型
    # - 字符串(ANSI)
    $ - 字符串(Unicode)
    * 4B 变量(的地址),相当于C语言中的&.可以后跟"; # $ "表示这个指针指向的变量的类型,默认为$
    @ - 移动指针,后跟欲移动的距离,可以为负

    3 基本命令

    3.1 Mem

    3.1.1 Alloc

    Mem Alloc [size]

    • 用途:申请一块内存
    • 参数:[size]为该内存块的大小
    • 返回值:该内存块的地址
    • 注意:内存不用时需要释放, 避免造成内存泄漏

    3.1.2 Free

    Mem Free [addr]

    • 用途:释放一块内存
    • 参数:[addr]为欲释放的内存地址

    3.1.3 Put

    Mem Put [s][addr] [s][data] [s][data] …

    • 用途:将数据按格式写入内存地址中
    • 参数:[s][addr]为欲写入的地址, [s]可选"; *". [s][data]为欲写入的数据, [s]可选". : ; ~ # $ * @”
    • 注意:写入的数据量若超过该内存块的大小可能导致cmd崩溃

    3.1.4 Print

    Mem Print [s][addr] [s][var] [s][var] …

    • 用途:将指定地址处的内容输出到变量中
    • 参数:[s][addr]为内存地址, [s]可选”; *”. [s][var]为输出参数, [s]可选”. : ; ~ # $ * @", [var]为变量名

    3.1.5 Copy

    Mem Copy [s][dst] [s][src] [sz]

    • 用途:将源地址的一段内存复制到目标地址
    • 参数:[s]可选"; *"

    3.1.6 用途

    Mem系列的命令提供了对内存的操作,其最大的意义就在于实现结构体或数组

    使用时要注意结构体的对齐

    3.2 API

    3.2.1 Call

    API Call [dll] [s][API] [s][data] [s][data] …

    • 用途:调用遵循__stdcall约定的函数(一般为WINAPI)
    • 参数:[dll]为dll相对路径, [API]为API函数全名, [s]为返回值类型, 默认为";", 可选"~ “. [s][data]为参数, [s]可选”; ~ ` $ # *”
    • 返回值:该API的返回值

    3.2.2 Exec

    API Exec [dll] [s][API] [s][data] [s][data] …

    • 用途:调用遵循__cdecl约定的函数(一般除WINAPI以外都是)

    3.2.3

    API是可以指定返回值类型的

    以上两个命令的[s][API]可以用该函数在内存中对应的地址来表示,此时[dll]应为”0″

    如set CAPI=API Exec 0 16777215 ;0 ;1

    3.3 CAPIDll

    CAPIll /?
    返回CAPIx的基本信息
    CAPIDll Ver
    返回CAPIx的版本, 保存在变量CAPI_Ret中

    3.4 Var

    3.4.1 SetCall

    SetCall Enable
    开启SetCall调用方式,即set CAPI=xxxx,返回值在变量CAPI_Re中t
    SetCall Disable
    关闭SetCall调用方式(默认开启)

    3.4.2 GetCall

    GetCall Enable
    开启GetCall调用方式,即echo %CAPI xxx%,返回值即%CAPI xxx%扩展的结果
    GetCall Disable
    关闭GetCall调用方式

    4 实例

    4.1 Mem Alloc Free

    创建了一块大小为4的内存,内存地址保存在lpAddress里
    在批处理第一次暂停时,使用工具查看cmd.exe内存,可以看到在输出的地址处为4个空白字节的内存,第二次pause时,可以看到内存已经被释放

    4.2 Mem Put

    执行前data变量的内存内容为30 00 31 00 32 00 33 00 34 00 35 00 36 00 37 00 38 00 39 00
    执行写入命令时,此时指针指向第1个字节,.97将1个字节为97写入,于是变成了61 00 31 00 …,指针后移1位,指向第2个字节
    @1将指针后移1位,此时指针指向第3个字节

    :25105,此时指针指向第3个字节,将2个字节为25105写入,于是变成了61 00 62 11 32 00 …,指针后移2位
    #ab,此时指针指向第5位,将2个字节的ANSI字符串ab写入,于是变成了61 00 62 11 61 62 33 00 34 00 …,指针后移2位
    $ab,此时指针指向第7位,将4个字节的Unicode字符串ab写入,于是变成了61 00 62 11 61 62 61 00 62 00 …,指针后移4位
    /h*var,此时指针指向第11位,将var变量h的内容全部写入

    4.3 Mem Copy

    执行时,将var变量的前4个字节复制到data变量中,即是“hel”
    因此输出“hel3456789”

    4.4 Mem Print

    var变量的内容为30 00 31 00 32 00 33 00 34 00 35 00 36 00
    .output_1,此时指向第1个字节,将1字节的内容“31”放入output_1变量中,也就是48
    @2,此时指针指向第2个字节,将指针后移2位,此时指针指向第4个字节
    :output_2,此时指针指向第4个字节,将2字节的内容“00 32”放入output_2变量中,也就是12800
    @1,此时指针指向第6个字节,将指针后移1位,此时指针指向第7个字节
    #output_3,此时指针指向第7个字节,将接下来的内容作为ANSI字符串放入output_3变量中,也就是“33”,字符串3
    $output_4,此时指针指向第9个字节,将接下来的内容作为Unicode字符串放入output_4变量中,也就是“34 00 35 00 36 00”,字符串456

    4.5 API Call

    调用API MessageBox,第一个参数为0,第二个参数为data变量的地址,第三个参数为Unicode字符串title,第四个参数为1
    由于CMD内部将变量data储存为Unicode,因此应使用Unicode版本的API,也就是MessageBoxW
    (注:CAPIx的*标识符得到了增强,可以使用*#data来强制将data转换为ANSI字符串)

    4.6 API Exec

    调用C语言库函数sscanf,该函数遵循cdecl调用协定,因此只能使用Exec调用
    第一个参数*#data表示取变量data的内容, 转换为ANSI字符串, 第二个参数为sscanf的Format, 第三个和第四个参数取了两个整形变量地址

    调用C语言库函数sqrt,且指定返回值类型为双浮点数

    调用C语言库函数scanf, *;_1 的意思是取环境变量_1的地址,将其当作整形变量传给scanf

    4.7 GetCall

    5 CAPIx相对CAPI有哪些改进

    • “@”可以接受负值
    • 参数类型中增加了浮点数和双浮点数
    • 为函数返回值提供了类型
    • “*”可以通过后跟”; # $”来指定该变量类型
    • “*”不只是取变量内容, 而是取变量地址.API对该地址的修改会同步到变量中
    • “Exec”命令的加入
    • 可以运行内存中的函数

    6 等待加入的功能

    • COM调用

    Author: aiwozhonghuaba

    Created: 2017-02-11 Sat 19:55

    Emacs 25.1.1 (Org mode 8.2.10)

    Validate

  2. 呃,后来发现CAPIx作者有发布过修复版……自己多余了……
    但是,这个可以也在xp上运行

发表评论

电子邮件地址不会被公开。 必填项已用*标注

1 × 1 =