| 
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个字节大的内存。。。。。
 
 ↑先记下来,有空继续研究吧。
 
 | 
 |