Java外挂开发入门示例

简介:
  由于原文较长,图又比较多,且CSDN博客图片目前无法外部访问|||,所以仅发来部分,全文请去鄙人CSDN的博客: [url]http://blog.csdn.net/cping1982[/url]  ,希望51cto能早日提供博客迁移功能……

  示例运行结果如下图:
  
 
package org.loon.test.os;

/**
        * Copyright 2008
        *
        * Licensed under the Apache License, Version 2.0 (the "License"); you may not
        * use this file except in compliance with the License. You may obtain a copy of
        * the License at
        *
        * [url]http://www.apache.org/licenses/LICENSE-2.0[/url]
        *
        * Unless required by applicable law or agreed to in writing, software
        * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
        * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
        * License for the specific language governing permissions and limitations under
        * the License.
        *
        * @project loonframework
        * @author chenpeng
        * @email:[email]ceponline@yahoo.com.cn[/email]
        * @version 0.1
        */

import java.awt.Dimension;
import javax.swing.JButton;
import java.awt.Rectangle;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.EventQueue;
import java.awt.SystemColor;
import java.awt.Color;

import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.JLabel;

import org.loon.framework.os.ASM;
import org.loon.framework.os.OSProcess;


public  class TestCallForm  extends JFrame {

                  private  static  final  long serialVersionUID = 1L;

                  private JPanel jContentPane =  null;

                  private JButton btnHP =  null;

                  private JButton btnHome =  null;

                  private JButton btnBaseEax =  null;

                  private JButton btnIce =  null;

                  private JButton btnFire =  null;

                  private JButton btnSP =  null;

                  private JTextField txtIntPtr =  null;

                  private JLabel jLabel =  null;

                  public TestCallForm() {
                                  super();
                                 initialize();
                 }

                  private  void initialize() {

                                  this.setResizable( false);
                                  this.setSize(238, 315);
                                  this.setContentPane(getJContentPane());
                                  this.setTitle( "Java外挂开发入门示例");
                                  this.setLocationRelativeTo( null);
                                  this.addWindowListener( new WindowAdapter() {
                                                  public  void windowClosing(WindowEvent e) {
                                                                 System.exit(0);
                                                 }
                                 });
                 }

                  private JPanel getJContentPane() {
                                  if (jContentPane ==  null) {
                                                 jLabel =  new JLabel();
                                                 jLabel.setBounds( new Rectangle(30, 20, 180, 30));
                                                 jLabel.setForeground(Color.white);
                                                 jLabel.setText( "寄存器EAX值(针对本机环境)");
                                                 jContentPane =  new JPanel();
                                                 jContentPane.setLayout( null);
                                                 jContentPane.setSize( new Dimension(236, 241));
                                                 jContentPane.setBackground(SystemColor.activeCaption);
                                                 jContentPane.add(getBtnHP(),  null);
                                                 jContentPane.add(getBtnHome(),  null);
                                                 jContentPane.add(getBaseIntPtr(),  null);
                                                 jContentPane.add(getBtnIce(),  null);
                                                 jContentPane.add(getBtnFire(),  null);
                                                 jContentPane.add(getBtnSP(),  null);
                                                 jContentPane.add(getTxtIntPtr(),  null);
                                                 jContentPane.add(jLabel,  null);
                                 }
                                  return jContentPane;
                 }

                  private JButton getBtnHP() {
                                  if (btnHP ==  null) {
                                                 btnHP =  new JButton();
                                                 btnHP.setBounds( new Rectangle(15, 106, 95, 30));
                                                 btnHP.setText( "吃血");
                                                 btnHP.addMouseListener( new java.awt.event.MouseAdapter() {
                                                                  public  void mouseClicked(java.awt.event.MouseEvent e) {
                                                                                 clickEvent( "hp");
                                                                 }
                                                 });
                                 }
                                  return btnHP;
                 }

                  private JButton getBtnHome() {
                                  if (btnHome ==  null) {
                                                 btnHome =  new JButton();
                                                 btnHome.setBounds( new Rectangle(15, 195, 200, 30));
                                                 btnHome.setText( "回城");
                                                 btnHome.addMouseListener( new java.awt.event.MouseAdapter() {
                                                                  public  void mouseClicked(java.awt.event.MouseEvent e) {
                                                                                 clickEvent( "home");
                                                                 }
                                                 });
                                 }
                                  return btnHome;
                 }

                  private JButton getBtnIce() {
                                  if (btnIce ==  null) {
                                                 btnIce =  new JButton();
                                                 btnIce.setBounds( new Rectangle(120, 150, 95, 30));
                                                 btnIce.setText( "冰系魔法");
                                                 btnIce.addMouseListener( new java.awt.event.MouseAdapter() {
                                                                  public  void mouseClicked(java.awt.event.MouseEvent e) {
                                                                                 clickEvent( "ice");
                                                                 }
                                                 });
                                 }
                                  return btnIce;
                 }

                  private JButton getBtnFire() {
                                  if (btnFire ==  null) {
                                                 btnFire =  new JButton();
                                                 btnFire.setBounds( new Rectangle(15, 150, 95, 30));
                                                 btnFire.setText( "火系魔法");
                                                 btnFire.addMouseListener( new java.awt.event.MouseAdapter() {
                                                                  public  void mouseClicked(java.awt.event.MouseEvent e) {
                                                                                 clickEvent( "fire");
                                                                 }
                                                 });
                                 }
                                  return btnFire;
                 }

                  private JButton getBtnSP() {
                                  if (btnSP ==  null) {
                                                 btnSP =  new JButton();
                                                 btnSP.setBounds( new Rectangle(120, 106, 95, 30));
                                                 btnSP.setText( "加蓝");
                                                 btnSP.addMouseListener( new java.awt.event.MouseAdapter() {
                                                                  public  void mouseClicked(java.awt.event.MouseEvent e) {
                                                                                 clickEvent( "sp");
                                                                 }
                                                 });
                                 }
                                  return btnSP;
                 }

                  private JButton getBaseIntPtr() {
                                  if (btnBaseEax ==  null) {
                                                 btnBaseEax =  new JButton();
                                                 btnBaseEax.setBounds( new Rectangle(15, 235, 200, 30));
                                                 btnBaseEax.setText( "获得本机EAX数值");
                                                 btnBaseEax.addMouseListener( new java.awt.event.MouseAdapter() {
                                                                  public  void mouseClicked(java.awt.event.MouseEvent e) {
                                                                                 clickEvent( "find");
                                                                 }
                                                 });
                                 }
                                  return btnBaseEax;
                 }

                  private JTextField getTxtIntPtr() {
                                  if (txtIntPtr ==  null) {
                                                 txtIntPtr =  new JTextField();
                                                 txtIntPtr.setBounds( new Rectangle(18, 57, 199, 30));
                                                 txtIntPtr.setText( "00D52070");
                                 }
                                  return txtIntPtr;
                 }

                  /**
                        * 触发事件
                        *
                        * @param eventName
                        */

                  private  void clickEvent( final String eventName) {
                                  int pid = OSProcess.findWindowProcessId( "TForm1""游戏找CALL练习实例one");
                                  if (pid == 0) {
                                                 JOptionPane.showMessageDialog( this"您的游戏程序尚未启动,外挂无法加载!");
                                                  return;
                                 }
                                  int eaxPtr = 0;
                                  try {
                                                 eaxPtr = ASM.getHexStringToInt( this.txtIntPtr.getText().trim());
                                 }  catch (Exception ex) {
                                                 JOptionPane.showMessageDialog( this"寄存器数值设定格式有误,外挂无法加载!");
                                                  return;
                                 }
                                  // 从基址获取寄存器中eax数值
                                  if ( "find".equalsIgnoreCase(eventName)) {
                                                  this.txtIntPtr.setText(OSProcess.readProcessMemory(pid, 0x456D68));
                                 }
                                  // 实例化asm类以进行java与汇编混合操作
                                 ASM asm =  new ASM();

                                  // 保存所有寄存器,即全部进栈
                                 asm._PUSHAD();
                                  // 示例程序执行时,目标寄存器eax中的必备数值(PS:在我的机器上是00D52070,
                                  // 而找Call测试程序作者提供的是00D51FE4,请自行查找。错误时目标程序将崩溃。)
                                 asm._MOV_EAX(eaxPtr);
                                  // 吃红
                                  if ( "hp".equalsIgnoreCase(eventName)) {
                                                 asm._MOV_EDX(0x453028);
                                                 asm._CALL(0x452E98);
                                 }
                                  // 吃蓝
                                  else  if ( "sp".equalsIgnoreCase(eventName)) {
                                                 asm._MOV_EDX(0x453040);
                                                 asm._CALL(0x452E98);
                                 }
                                  // 火系魔法
                                  else  if ( "fire".equalsIgnoreCase(eventName)) {
                                                 asm._MOV_ECX(0x45309C);
                                                 asm._MOV_EDX(2);
                                                 asm._CALL(0x452DF8);
                                                  // 冰系魔法
                                 }  else  if ( "ice".equalsIgnoreCase(eventName)) {
                                                 asm._MOV_ECX(0x45307C);
                                                 asm._MOV_EDX(1);
                                                 asm._CALL(0x452DF8);
                                 }
                                  // 回城
                                  else  if ( "home".equalsIgnoreCase(eventName)) {
                                                 asm._MOV_EDX(0x45305C);
                                                 asm._CALL(0x452E98);
                                 }
                                  // 还原所有寄存器,即全部出栈
                                 asm._POPAD();
                                  // 结尾标记,操作开始执行
                                 asm._RET();

                                  // 要求进行代码注入的进程id
                                 asm.doInject(pid);

                 }


                  public  static  void main(String[] args) {

                                 EventQueue.invokeLater( new Runnable() {
                                                  public  void run() {
                                                                 TestCallForm callForm =  new TestCallForm();
                                                                 callForm.setVisible( true);
                                                 }
                                 });

                 }

}

最后,再额外补充两点:

 一,示例程序和真正的CALL外挂开发虽然原理上一样,工作量却是天差地别的,时间不充裕者请不要轻易尝试--|||

 二,这个示例仅仅演示了localos的一部分功能,比如dll注入的接口在其中也提供了, 有兴趣者可以尝试一下,但要注意权限问题.           

 程序源码及示例下载地址: [url]http://code.google.com/p/greenvm/downloads/list[/url]  (暂时先丢这里,源码在jar内)

 OD下载地址: [url][/url]

 PS:由于本例中有些敏感API的调用,运行时杀软对Javaw.exe报警请不要少见多怪...下个版本争取干掉杀软^^


本文转自 cping 51CTO博客,原文链接:http://blog.51cto.com/cping1982/125588


相关文章
|
2月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
15天前
|
自然语言处理 Java
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
85 60
|
23天前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
9天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
1月前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
71 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
2月前
|
Java
在Java中实现接口的具体代码示例
可以根据具体的需求,创建更多的类来实现这个接口,以满足不同形状的计算需求。希望这个示例对你理解在 Java 中如何实现接口有所帮助。
95 38
|
1月前
|
存储 JavaScript 前端开发
基于 SpringBoot 和 Vue 开发校园点餐订餐外卖跑腿Java源码
一个非常实用的校园外卖系统,基于 SpringBoot 和 Vue 的开发。这一系统源于黑马的外卖案例项目 经过站长的进一步改进和优化,提供了更丰富的功能和更高的可用性。 这个项目的架构设计非常有趣。虽然它采用了SpringBoot和Vue的组合,但并不是一个完全分离的项目。 前端视图通过JS的方式引入了Vue和Element UI,既能利用Vue的快速开发优势,
122 13
|
1月前
|
算法 Java API
如何使用Java开发获得淘宝商品描述API接口?
本文详细介绍如何使用Java开发调用淘宝商品描述API接口,涵盖从注册淘宝开放平台账号、阅读平台规则、创建应用并申请接口权限,到安装开发工具、配置开发环境、获取访问令牌,以及具体的Java代码实现和注意事项。通过遵循这些步骤,开发者可以高效地获取商品详情、描述及图片等信息,为项目和业务增添价值。
82 10
|
1月前
|
前端开发 Java 测试技术
java日常开发中如何写出优雅的好维护的代码
代码可读性太差,实际是给团队后续开发中埋坑,优化在平时,没有那个团队会说我专门给你一个月来优化之前的代码,所以在日常开发中就要多注意可读性问题,不要写出几天之后自己都看不懂的代码。
66 2
|
1月前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####