[原]做了个魔兽钓鱼外挂,说说开发思路

网易魔兽总是忘了开,于是练小号,,,冲**技能,大号钓就不说了.小号再来重复,心头就纠结了.
观察了下**的流程.于是作了2个方案的假设,目的就是为了自动**...


方案1,走修改封包的路线.
使用sniffer抓了半天的包,没看出什么名堂来,也没找到加密特征..放弃.
方案2,模拟人工外挂吧。


捣鼓了一个晚上,今天又修正了些小bug,当然,因为是小东西,就没用工程设计模式了.代码太难看,就没传上来了,这里只是说说思路..每天讨论aspx,


还是来点winform的调剂调剂三.


最终制作这个外挂的思路定为模拟人的操作,人有哪些操作呢,我们来做个list
1抛竿,按钮放到按钮1上面,,,是固定的.
2人的眼睛会找浮漂的位置,然后把鼠标移到上面去等待点右键
3听到上钩的声音点右键 即可.
重复以上3步


我目前就打算模拟以上三步.
第一步,抛竿,好做,.NET2.0+已经可以直接调用SendKeys了


第二步,浮漂搜寻,.NET我没找到方法,不过没关系,大部分不可能的东西,都可以通过API找到,API不行我们还有C语言嘛...呵呵.API中 mouse_event


SetCursorPos GetCursorInfo 这些API用于模拟鼠标右键 和 移动鼠标逐行扫描(就像CRT显示器成像一样,只是有个灵敏度问题,我调成20个像素的


delta,就很合适了) 还有 鼠标形状变化检测(因为鼠标移动到饵上面,会变成齿轮形状,这样能鼠标自动移动到饵上面就会暂停)


第三步,上钩的声音触发右键,鼠标操作前面已经说了,声音触发,无非就是捕获声卡输出的波形,从wave的峰值上,检测是否有高于某个值的脉冲峰值(


这个不同的机器,不同音量,峰值不同,所以做成可以输入参数的这么一种UI即可),声卡有个特*,可以把输出的波形通过回路,直接输入到"输入音频


缓冲区",这样通过mmsAPI即可捕获声音波形,绘制,并进一步分析,这部分比较复杂一点,给出部分API:
  // WaveOut calls
  [DllImport(mmdll)]
  public static extern int waveOutGetNumDevs();
  [DllImport(mmdll)]
  public static extern int waveOutPrepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
  [DllImport(mmdll)]
  public static extern int waveOutUnprepareHeader(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
  [DllImport(mmdll)]
  public static extern int waveOutWrite(IntPtr hWaveOut, ref WaveHdr lpWaveOutHdr, int uSize);
  [DllImport(mmdll)]
  public static extern int waveOutOpen(out IntPtr hWaveOut, int uDeviceID, WaveFormat lpFormat, WaveDelegate


dwCallback, int dwInstance, int dwFlags);
  [DllImport(mmdll)]
  public static extern int waveOutReset(IntPtr hWaveOut);
  [DllImport(mmdll)]
  public static extern int waveOutClose(IntPtr hWaveOut);
  [DllImport(mmdll)]
  public static extern int waveOutPause(IntPtr hWaveOut);
  [DllImport(mmdll)]
  public static extern int waveOutRestart(IntPtr hWaveOut);
  [DllImport(mmdll)]
  public static extern int waveOutGetPosition(IntPtr hWaveOut, out int lpInfo, int uSize);
  [DllImport(mmdll)]
  public static extern int waveOutSetVolume(IntPtr hWaveOut, int dwVolume);
  [DllImport(mmdll)]
  public static extern int waveOutGetVolume(IntPtr hWaveOut, out int dwVolume);


  // WaveIn calls
  [DllImport(mmdll)]
  public static extern int waveInGetNumDevs();
  [DllImport(mmdll)]
  public static extern int waveInAddBuffer(IntPtr hwi, ref WaveHdr pwh, int cbwh);
  [DllImport(mmdll)]
  public static extern int waveInClose(IntPtr hwi);
  [DllImport(mmdll)]
  public static extern int waveInOpen(out IntPtr phwi, int uDeviceID, WaveFormat lpFormat, WaveDelegate dwCallback,


int dwInstance, int dwFlags);
  [DllImport(mmdll)]
  public static extern int waveInPrepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);
  [DllImport(mmdll)]
  public static extern int waveInUnprepareHeader(IntPtr hWaveIn, ref WaveHdr lpWaveInHdr, int uSize);
  [DllImport(mmdll)]
  public static extern int waveInReset(IntPtr hwi);
  [DllImport(mmdll)]
  public static extern int waveInStart(IntPtr hwi);
  [DllImport(mmdll)]
  public static extern int waveInStop(IntPtr hwi);
 
    之前走了个弯路,一开始对于浮漂的定位,我打算通过分析A图形在B图形中的位置来做,但是考虑到客户端环境的多样*,放弃了这种思路.
另外就是扫描效率,一开始我是全魔兽世界window扫描,但是扫描的速度太快,鼠标含不住浮漂,扫的太慢,鱼都跑了,最后就做了个踩点选项,用于定位


浮漂扔出去之后落点的范围,取值是这个area的左上角和右下角.这样,效率高多了,.
    还有就是,因为是模拟人的操作,从游戏服务器端是看不出来的,所以不会被封号....当然如果由于你在一个点钓鱼太久,然后中途又杀了几个小


BL,那么别人举报你之后,难免GM来找你问话,如果这个时候看到你的行为像挂机的,,,,呵呵,,,那就不关我的事了,,,
    我打算今天去哀嚎洞穴钓变异鱼做美味风蛇卖,嘿嘿,睡觉之前挂起,挂它几个晚上,去G团买装备去.

posted on 2010-10-18 16:01  koumi's blogs  阅读(2868)  评论(3编辑  收藏  举报

导航