该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-24
最后修改:2008-11-24
以下是我在大三时,武林外传游戏还在公测时写的一个外挂,辅助玩游戏。以前在大学时用着很好用,和大家共享出来。希望有朋友能够进行重构,发布一些更好用的JAVA实现的外挂程序。
由于这是本人的处女做,所以代码结构有些乱,但由于程序本身并不是很复杂,有心人是一定会看懂的,此外还有一些简单的注释。
由于当时不会使用IDE,仅用记事本写的,所以写得比较辛苦,也花费了较长时间。希望对大家能够有所帮助。
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; //主类 public class Action { static int TimeNumber=0; public static void main(String[] args) { ViewFlow vf=new ViewFlow(); vf.addActionlistener(); } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; class MyActionListener2 implements ActionListener//核心类(实现主要功能) { static int ip=0; public void actionPerformed(ActionEvent e2) { try { Robot robot=new Robot(); int x=73,y=23, x2=ViewFlow.slider1.getValue(), y2=23, x3=228,y3=26, x4=0,y4=0; /* int i=ViewFlow.slider1.getValue(),j=23,k=0; { try { Robot rb=new Robot(); while(k<1) { rb.mouseMove(i,j); rb.getPixelColor(i,j); System.out.print((k++)+": "+rb.getPixelColor(i,j)+": "); System.out.println("(i="+(i++)+",j="+j+");"); } } catch(AWTException e3){} } */ if(robot.getPixelColor(x,y).equals(new Color(255,75,53))&&MyActionListener2.ip==1)//自动打怪 { robot.keyPress(KeyEvent.VK_5);//捡东西 if( robot.getPixelColor(x3,y3).equals(new Color(255,107,87)) ||robot.getPixelColor(x3,y3).equals(new Color(255,107,86))) { robot.keyPress(KeyEvent.VK_1);//技能1 //robot.keyPress(KeyEvent.VK_2);//技能2 //robot.keyPress(KeyEvent.VK_3);//技能3 //robot.keyPress(KeyEvent.VK_4);//打怪1 } else { robot.keyPress(KeyEvent.VK_TAB); robot.keyRelease(KeyEvent.VK_TAB); } } //System.out.println(MyActionListener.myTimer.getDelay());//改变加血速度测试 if(!robot.getPixelColor(x,y).equals(new Color(255,75,53))) { ViewFlow.setText1("提示:请启动游戏"); //System.out.println(ViewFlow.slider1.getValue());//测试1 //System.out.println(ViewFlow.slider2.getValue());//测试2 } else if( robot.getPixelColor(x2,y2).equals(new Color(255,75,53)) //加血位置与血的颜色相等 ||robot.getPixelColor(x,y).equals(robot.getPixelColor(x2,y2)) //加血位置与指定的理想的血的位置的颜色相等 /* ||robot.getPixelColor(x2,y2).equals(new Color(255,159,147)) //加血位置与指血的颜色1比较 ||robot.getPixelColor(x2,y2).equals(new Color(247,193,186)) //加血位置与指血的颜色2比较 ||robot.getPixelColor(x2,y2).equals(new Color(228,103,88)) //加血位置与指血的颜色3比较 ||robot.getPixelColor(x2,y2).equals(new Color(245,72,51)) //加血位置与指血的颜色4比较 ||robot.getPixelColor(x2,y2).equals(new Color(255,183,174)) //加血位置与指血的颜色5比较 ||robot.getPixelColor(x2,y2).equals(new Color(228,91,75)) //加血位置与指血的颜色6比较 ||robot.getPixelColor(x2,y2).equals(new Color(248,73,52)) //加血位置与指血的颜色7比较 ||robot.getPixelColor(x2,y2).equals(new Color(225,195,188)) //加血位置与指血的颜色8比较 ||robot.getPixelColor(x2,y2).equals(new Color(235,141,130)) //加血位置与指血的颜色9比较 ||robot.getPixelColor(x2,y2).equals(new Color(235,69,49)) //加血位置与指血的颜色10比较 ||robot.getPixelColor(x2,y2).equals(new Color(239,154,144)) //加血位置与指血的颜色11比较 */ ) { ViewFlow.setText1("不需加血"); } else if( robot.getPixelColor(x,y).equals(new Color(255,75,53))//加血 &&!robot.getPixelColor(x,y).equals(robot.getPixelColor(x2,y2)) ) { robot.keyPress(KeyEvent.VK_F8);//加血的键位 //ViewFlow.setText1("自动加血开始"); } } catch(AWTException eException1){} } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; class MyActionListener3 implements ActionListener { public void actionPerformed(ActionEvent e3) { MyActionListener.myTimer.stop(); ViewFlow.setText1(" 外挂程序已停止"); } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; class MyActionListener4 implements ActionListener { public void actionPerformed(ActionEvent e7) { if(e7.getSource()==ViewFlow.helpMenuItem1)//打开使用帮助网页 { try { Runtime.getRuntime().exec("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"http://blog.csdn.net/sunnyjavamoon/archive/2006/10/27/1352772.aspx"); } catch(IOException eIO){} } else if(e7.getSource()==ViewFlow.helpMenuItem2)//打开在线更新网页 { try { Runtime.getRuntime().exec("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"http://blog.csdn.net/sunnyjavamoon/archive/2006/11/04/1366552.aspx"); } catch(IOException eIO){} } else if(e7.getSource()==ViewFlow.helpMenuItem3)//打开作者主页网页 { try { Runtime.getRuntime().exec("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"http://blog.csdn.net/SunnyJavaMoon/"); } catch(IOException eIO){} } else if(e7.getSource()==ViewFlow.helpMenuItem4)//打开关于网页 { try { Runtime.getRuntime().exec("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"http://blog.csdn.net/sunnyjavamoon/archive/2006/10/27/1352772.aspx"); } catch(IOException eIO){} } else if(e7.getSource()==ViewFlow.exchangeItem1)//论坛交流 { try { Runtime.getRuntime().exec("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"http://vip3.getbbs.com/Board/TList.aspx?BID=5177"); } catch(IOException eIO){} } else if(e7.getSource()==ViewFlow.exchangeItem2)//论坛主页 { try { Runtime.getRuntime().exec("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"http://ljf365.getbbs.com"); } catch(IOException eIO){} } else if(e7.getSource()==ViewFlow.jbt3)//论坛主页 { try { Runtime.getRuntime().exec("\"C:\\Program Files\\Internet Explorer\\iexplore.exe\"http://blog.csdn.net/sunnyjavamoon/archive/2006/11/04/1366552.aspx"); } catch(IOException eIO){} } } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; class MyActionListener implements ActionListener { static Timer myTimer=new Timer(1500,new MyActionListener2());//速度控制 public void actionPerformed(ActionEvent e) { ViewFlow.setText1(" 外挂程序启动中......"); MyActionListener.myTimer.start(); } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; class MyChangeListener1 implements ChangeListener { public void stateChanged(ChangeEvent e4) { ViewFlow.setText2("加血位置:"+ViewFlow.slider1.getValue()+"/170"); } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; class MyChangeListener2 implements ChangeListener { public void stateChanged(ChangeEvent e5) { ViewFlow.setText3("加血速度:"+ViewFlow.slider2.getValue()+" 毫秒/次"); MyActionListener.myTimer.setDelay(ViewFlow.slider2.getValue()); } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; //界面类 class ViewFlow { Container jfContainer=null; JButton jbt1=null; JButton jbt2=null; static JButton jbt3=null; JPanel jp1=null; JPanel jp2=null; JPanel jp3=null; JPanel jp4=null; static JSlider slider1=null; static JSlider slider2=null; static JTextField jf1=new JTextField("请启动游戏",15); static JTextField jf2=new JTextField("加血位置:100"+"/170",15); static JTextField jf3=new JTextField("加血速度:1500"+" 毫秒/次",15); static JRadioButton jrb1=null; static JRadioButton jrb2=null; JMenuBar jmb=null; JMenu helpMenu=null; static JMenuItem helpMenuItem1=null; static JMenuItem helpMenuItem2=null; static JMenuItem helpMenuItem3=null; static JMenuItem helpMenuItem4=null; JMenu hightSet=null; static JMenuItem hightSetItem1=null; static JMenuItem hightSetItem2=null; static JMenuItem hightSetItem3=null; JMenu exchangeMenu=null; static JMenuItem exchangeItem1=null; static JMenuItem exchangeItem2=null; ButtonGroup bg=null; ViewFlow() { JFrame jf=new JFrame("武林外挂1.0"); jf.setSize(218,490); jf.setLocation(550,70); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); jfContainer=jf.getContentPane(); jfContainer.setLayout(new GridLayout(4,1,10,15)); //面版 jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jp4=new JPanel(); //jp1.setSize(20,5); //jp2.setSize(30,30); jp1.setLayout(new FlowLayout(FlowLayout.CENTER,20,5)); jp2.setLayout(new FlowLayout(FlowLayout.CENTER,20,5)); jp3.setLayout(new FlowLayout(FlowLayout.CENTER,20,5)); jp1.setBorder(BorderFactory.createTitledBorder("主控制区")); jp2.setBorder(BorderFactory.createTitledBorder("加血位置调整")); jp3.setBorder(BorderFactory.createTitledBorder("加血速度调整")); jp4.setBorder(BorderFactory.createTitledBorder("打怪模式设定")); jbt1=new JButton("开启"); jbt2=new JButton("停止"); jbt3=new JButton("在线升级"); jbt3.setSize(10,20); jfContainer.add(jp1);//框架加入面版1 jfContainer.add(jp2);//框架加入面版2 jfContainer.add(jp3);//框架加入面版3 jfContainer.add(jp4);//框架加入面版4 //滑杆1 slider1=new JSlider(75,170,100); slider1.setPaintTicks(true); slider1.setMajorTickSpacing(20); slider1.setMinorTickSpacing(2); slider1.setSnapToTicks(true); //slider1.setPaintLabels(true);//显示刻度数字 slider1.setPaintTrack(true); //滑杆2 slider2=new JSlider(300,3000,1500); slider2.setPaintTicks(true); slider2.setMajorTickSpacing(300); slider2.setMinorTickSpacing(50); slider2.setSnapToTicks(true); //slider2.setPaintLabels(true);//显示刻度数字 slider2.setPaintTrack(true); //单选按键 jrb1=new JRadioButton("手动打怪"); jrb2=new JRadioButton("自动打怪"); bg=new ButtonGroup(); //菜单 jmb=new JMenuBar(); jmb.setOpaque(true); jf.setJMenuBar(jmb); hightSet=buildHeightFileNenu();//生成高级选项菜单 jmb.add(buildHeightFileNenu());//加载菜单 exchangeMenu=builExchangeFileNenu();//生成问题交流菜单 jmb.add(exchangeMenu);//加载菜单 helpMenu=buildHelpFileMenu();//生成帮助菜单 jmb.add(helpMenu);//加载菜单 //面版 jp1.add(jbt1);//面版1加入按键 jp1.add(jbt2);//面版1加入按键 jp1.add(jf1); bg.add(jrb1); bg.add(jrb2); jp2.add(slider1); jp2.add(jf2); jp3.add(slider2); jp3.add(jf3); jp4.add(jrb1); jp4.add(jrb2); jp4.add(jbt3); jf.setVisible(true); } // public JMenu buildHeightFileNenu() { JMenu file2=new JMenu("高级设置");//菜单1 hightSetItem1=new JMenuItem("加血速度");//菜单2_菜单项1 hightSetItem2=new JMenuItem("加血位置");//菜单2_菜单项2 hightSetItem3=new JMenuItem("打怪模式");//菜单3_菜单项3 file2.add(hightSetItem1); file2.addSeparator(); file2.add(hightSetItem2); file2.addSeparator(); file2.add(hightSetItem3); return file2; } public JMenu builExchangeFileNenu() { JMenu file2=new JMenu("问题交流");//菜单2 exchangeItem1=new JMenuItem("论坛交流");//菜单2_菜单项1 exchangeItem2=new JMenuItem("龙旋风论坛");//菜单2_菜单项2 file2.add(exchangeItem1); file2.addSeparator(); file2.add(exchangeItem2); return file2; } public JMenu buildHelpFileMenu()//菜单内容生成 { JMenu file1=new JMenu("帮助");//菜单3 helpMenuItem1=new JMenuItem("使用帮助");//菜单1_菜单项1 helpMenuItem2=new JMenuItem("在线更新");//菜单1_菜单项2 helpMenuItem3=new JMenuItem("作者主页");//菜单1_菜单项2 helpMenuItem4=new JMenuItem("关于");//菜单1_菜单项3 file1.add(helpMenuItem1); file1.addSeparator(); file1.add(helpMenuItem2); file1.addSeparator(); file1.add(helpMenuItem3); file1.addSeparator(); file1.add(helpMenuItem4); return file1; } public void addActionlistener() { jbt1.addActionListener(new MyActionListener()); jbt2.addActionListener(new MyActionListener3()); jbt3.addActionListener(new MyActionListener4()); slider1.addChangeListener(new MyChangeListener1()); slider2.addChangeListener(new MyChangeListener2()); jrb1.addItemListener(new MyItemListener1()); jrb2.addItemListener(new MyItemListener1()); MyActionListener4 MenuItemListener=new MyActionListener4();//菜单监视器 //帮助菜单 helpMenuItem1.addActionListener(MenuItemListener); helpMenuItem2.addActionListener(MenuItemListener); helpMenuItem3.addActionListener(MenuItemListener); helpMenuItem4.addActionListener(MenuItemListener); //高级设置 hightSetItem1.addActionListener(MenuItemListener); hightSetItem2.addActionListener(MenuItemListener); hightSetItem3.addActionListener(MenuItemListener); //问题交流 exchangeItem1.addActionListener(MenuItemListener); exchangeItem2.addActionListener(MenuItemListener); } public static void setText1(String str) { jf1.setText(str); } public static void setText2(String str) { jf2.setText(str); } public static void setText3(String str) { jf3.setText(str); } }
package game; import javax.swing.*; import java.awt.*; import java.awt.event.*; import javax.swing.event.*; import java.lang.*; import java.io.*; class MyItemListener1 implements ItemListener { public void itemStateChanged(ItemEvent e6) { if(e6.getSource()==ViewFlow.jrb1) { MyActionListener2.ip=0;//手动 //System.out.println(ViewFlow.ip);//测试单选键1 } else if(e6.getSource()==ViewFlow.jrb2) { MyActionListener2.ip=1;//自动 //System.out.println(ViewFlow.ip);//测试单选键2 } } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-24
最后修改:2008-11-24
支持个```第一次看到用色彩比对搞外挂。。。还以为是解析封包那种。。
|
|
返回顶楼 | |
发表时间:2008-11-24
repsihWDX 写道 支持个```第一次看到用色彩比对搞外挂。。。还以为是解析封包那种。。 实践证明,很多时候这种方式运行起来很难被发现,如果做的足够好,和人的操作几乎一样。反外挂程序检测不到。修改或者解析游戏程序本身的外挂很容易被发现,当然号也一被封了。在使用的半年里没有发现被封的情况。 |
|
返回顶楼 | |
发表时间:2008-11-25
楼主用颜色比较的想法十分有创意。。。。。。不过有没有可能有不准的情况?
|
|
返回顶楼 | |
发表时间:2008-11-25
ailu5949 写道 楼主用颜色比较的想法十分有创意。。。。。。不过有没有可能有不准的情况? 谢谢! 目前国产的几款游戏中我观察了一下,基本的功能用简单的算法还是能够实现的。 要说有问题,由于当时个人水平有限,我遇见的最大问题是透明的颜色不知道如果去分析,这个问题得留给你们这些牛人去解决了。 我想如果颜色问题都能够分析出来,在此基础算法设计好,设计模式运用的恰当,多么复杂的问题都能够解决。 |
|
返回顶楼 | |
发表时间:2008-11-25
而且可以不同的游戏只要修改下配置就可以了,可以量产外挂了
|
|
返回顶楼 | |
发表时间:2008-11-25
范三山 写道 而且可以不同的游戏只要修改下配置就可以了,可以量产外挂了
你没发现roboot这类没有么 没有解析过程啊..... |
|
返回顶楼 | |
发表时间:2008-11-25
不错啊,以前我用VB写了一个,天天看着游戏人物自动在那玩,比自己玩还有快感
|
|
返回顶楼 | |
发表时间:2008-11-25
现roboot这类没有么
抛出异常的爱 写道 范三山 写道 而且可以不同的游戏只要修改下配置就可以了,可以量产外挂了你没发现roboot这类没有么 没有解析过程啊..... Hi, Robot这个类是java库,如果有需要可以对其扩展,如果可能一叫SuperRobot吧,呵呵。 Robot给定的功能不多,真的需要复杂功能就继承它吧!! |
|
返回顶楼 | |
发表时间:2008-11-25
使用颜色对比是常见的做法之一。
楼主挺执着的,当年玩游戏也想着做个挂自己玩的,结果现在也没见着。哈哈 |
|
返回顶楼 | |