- 3D工具
- MikuMikuDance
- 绘画工具
- Flash
- 音乐工具
- Audacity
- 所属类型
- 調教
  

0
9
0
UID: 111156
权限: 40
属性: 宇宙人 发帖: 201
(1精)
积分: 540
章鱼: 3
大葱: 14
茄子: 2688
注册:2012/8/18
存在感:476
|
我觉得V3的lua解释器挺好玩,就是api太少了不过瘾,于是:
我拿上次写的那个批量调教洛天依的job开刀。
把定义挪到前面,开头改成:
- function main(processParam, envParam)
- local msgboxret
- local LyricNum
- local LyricCycle
- local Interval
- local Lyric1
- local Lyric2
- local PitchCycle
- local LengthChange1
- local LengthChange2
- local CyclePatterns = {60, 60, 60, 60}
- local temppattern
-
- msgboxret = VSMessageBox("abc", 0)
- msgboxret = VSMessageBox(msgboxret, 0)
- ret, temppattern = VSDlgGetStringValue("CyclePattern1")
- VSMessageBox(ret, 0)
复制代码
正常运行的话会出来一个abc的msgbox,然后又出来一个1的msgbox(运行成功的返回值),然后再出来一个0的返回值。
Vocaloid3实在太庞大了,我在DSCL3里半天找不到可疑的导出函数名,干脆在user32的MessageBoxW下断点。
运行job,成功停在了MessageBoxW,几步跟出,找到了这个地方:
这貌似是lua解释器的函数调用器。通过ECX的值取得被调用函数的地址然后Call。
在Msgbox的时候,call的地址是VOCALOID.004FCED0
在GetStringValue的时候,call的地址是VOCALOID.004FCD70
我跟入004FCD70,
跑到这里的时候,EAX指向了"CyclePattern1",这是传入的参数。
继续跑……
好吧。。。玩脱了。。。没找到什么有价值的东西,因为我还没有初始化对话框,这个函数执行应该会失败。。。
反正我后面还调用了好几次这个东西。。我把调用器的断点去掉,给GetStrVal加了断点,继续……
好嘞。。恶心的对话框出来了,叫我给它填参数。。。我就把Lyric1随便填了个东西,继续……
好嘞。。中断卡住了,单步,到这里又遇见了传入参数,继续单步……
跑到这一步,eax变成了刚才输入的东西,说明真正的函数可能在红框内执行完毕,我转到EAX的地址,把eawfewfw改掉:
水表。。。。
我把中断去掉,运行:
于是就出来十个水表,不是十个eaw什么东西的……
这只是个很简单的演示,找到了改变解释器GetStringVal函数的方法。
我的想法是在两个字符串出现的地方跳出去,
执行我们自己的函数,然后改掉return的值。
这样就可以用原有的api实现更多的功能了……
我们甚至可以开发一种语法,让job可以调用windows api什么的,像这样:
ret, voidvar = VSDlgGetIntValue(".push 1000")
ret, ptr = VSDlgGetIntValue(".invoke kernel32.malloc')
然后我们自己的怪异的迷你的不完善的解释器,往内存里压了1000这个参数,去申请了1000个字节大的内存。。。。。
↑先记下来,有空继续研究吧。
|
|