外挂技术-调试游戏久了为何异常的原因

外挂辅助研究中常遇到的问题

1、游戏异常的原因

2、用C++代码模拟游戏中异常冲突

为何游戏运行时间短不出问题 但一运行久了就出现未知异常错误!

很多时候这是由于多线程访问共享数据造成的。

// MultiThreadDlg.h : 头文件

//

#pragma once

// CMultiThreadDlg 对话框

class CMultiThreadDlg : public CDialogEx

{

// 构造

public:

CMultiThreadDlg(CWnd* pParent = NULL);    // 标准构造函数

// 对话框数据

enum { IDD = IDD_MULTITHREAD_DIALOG };

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现

protected:

HICON m_hIcon;

// 生成的消息映射函数

virtual BOOL OnInitDialog();

afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

afx_msg void OnPaint();

afx_msg HCURSOR OnQueryDragIcon();

DECLARE_MESSAGE_MAP()

public:

afx_msg void OnBnClickedButton1();

afx_msg void OnBnClickedButton2();

afx_msg void OnBnClickedButton3();

};

// MultiThreadDlg.cpp : 实现文件

//

#include "stdafx.h"

#include "MultiThread.h"

#include "MultiThreadDlg.h"

#include "afxdialogex.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#endif

// 用于应用程序“关于”菜单项的 CAboutDlg 对话框

class CAboutDlg : public CDialogEx

{

public:

CAboutDlg();

// 对话框数据

enum { IDD = IDD_ABOUTBOX };

protected:

virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

// 实现

protected:

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)

{

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)

END_MESSAGE_MAP()

// CMultiThreadDlg 对话框

CMultiThreadDlg::CMultiThreadDlg(CWnd* pParent /*=NULL*/)

: CDialogEx(CMultiThreadDlg::IDD, pParent)

{

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMultiThreadDlg::DoDataExchange(CDataExchange* pDX)

{

CDialogEx::DoDataExchange(pDX);

}

BEGIN_MESSAGE_MAP(CMultiThreadDlg, CDialogEx)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_BN_CLICKED(IDC_BUTTON1, &CMultiThreadDlg::OnBnClickedButton1)

ON_BN_CLICKED(IDC_BUTTON2, &CMultiThreadDlg::OnBnClickedButton2)

ON_BN_CLICKED(IDC_BUTTON3, &CMultiThreadDlg::OnBnClickedButton3)

END_MESSAGE_MAP()

// CMultiThreadDlg 消息处理程序

BOOL CMultiThreadDlg::OnInitDialog()

{

CDialogEx::OnInitDialog();

// 将“关于...”菜单项添加到系统菜单中。

// IDM_ABOUTBOX 必须在系统命令范围内。

ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

ASSERT(IDM_ABOUTBOX < 0xF000);

CMenu* pSysMenu = GetSystemMenu(FALSE);

if (pSysMenu != NULL)

{

BOOL bNameValid;

CString strAboutMenu;

bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);

ASSERT(bNameValid);

if (!strAboutMenu.IsEmpty())

{

pSysMenu->AppendMenu(MF_SEPARATOR);

pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);

}

}

// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

//  执行此操作

SetIcon(m_hIcon, TRUE);            // 设置大图标

SetIcon(m_hIcon, FALSE);        // 设置小图标

// TODO: 在此添加额外的初始化代码

return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

void CMultiThreadDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialogEx::OnSysCommand(nID, lParam);

}

}

// 如果向对话框添加最小化按钮,则需要下面的代码

//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,

//  这将由框架自动完成。

void CMultiThreadDlg::OnPaint()

{

if (IsIconic())

{

CPaintDC dc(this); // 用于绘制的设备上下文

SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

// 使图标在工作区矩形中居中

int cxIcon = GetSystemMetrics(SM_CXICON);

int cyIcon = GetSystemMetrics(SM_CYICON);

CRect rect;

GetClientRect(&rect);

int x = (rect.Width() - cxIcon + 1) / 2;

int y = (rect.Height() - cyIcon + 1) / 2;

// 绘制图标

dc.DrawIcon(x, y, m_hIcon);

}

else

{

CDialogEx::OnPaint();

}

}

//当用户拖动最小化窗口时系统调用此函数取得光标

//显示。

HCURSOR CMultiThreadDlg::OnQueryDragIcon()

{

return static_cast<HCURSOR>(m_hIcon);

}

#include <Windows.h>

void DbgPrintf_Mine(char*pszFormat,...)

{

#ifdef _DEBUG

char szbufFormat[0x1000];

char szBufFormat_Game[0x1008]="Game:";

va_list argList;

va_start(argList,pszFormat);//参数列表初始化

//int i=va_arg(argList,int);

//int j=va_arg(argList,int);

//char*s=va_arg(argList,char*);

//int k=va_arg(argList,int);

vsprintf_s(szbufFormat,pszFormat,argList);

//printf("%d,%d,%s %d \r\n",i,j,s,k);

//printf(szbufFormat);

strcat_s(szBufFormat_Game,szbufFormat);

OutputDebugStringA(szBufFormat_Game);

va_end(argList);

#endif

}

CRITICAL_SECTION my_section;

DWORD g_ndGameData[10]={111,222,333,444,555,666,777,888,999,000};

DWORD *g_pndGameData[10];

void  UseGoods(char* szGoodName)

{

EnterCriticalSection(&my_section);

for (int i=0;i<10;i++)

{

DbgPrintf_Mine("%s ,,%d \r\n",szGoodName,*g_pndGameData);

Sleep(200);

}

LeaveCriticalSection(&my_section);

return ;

}

DWORD WINAPI GameMainThreadProc(LPVOID lpData)

{

while(1)

{

EnterCriticalSection(&my_section);

memset(g_pndGameData,NULL,sizeof(g_pndGameData));

for (int i=0;i<10;i++)

{

g_pndGameData=g_ndGameData+i; //&g_ndGameData; 赋值

Sleep(800);

}

//物品使用CALL

LeaveCriticalSection(&my_section);

Sleep(2000);

UseGoods("游戏主线程:");

}

}

DWORD WINAPI MyThreadProc(LPVOID lpData)

{

while(1)

{

UseGoods("外挂线程222:");

Sleep(1000);

}

}

void CMultiThreadDlg::OnBnClickedButton1()

{

// TODO: 在此添加控件通知处理程序代码

CreateThread(NULL,NULL,GameMainThreadProc,NULL,0,NULL);

}

void CMultiThreadDlg::OnBnClickedButton2()

{

// TODO: 在此添加控件通知处理程序代码

CreateThread(NULL,NULL,MyThreadProc,NULL,0,NULL);

}

void CMultiThreadDlg::OnBnClickedButton3()

{

// TODO: 在此添加控件通知处理程序代码

InitializeCriticalSection(&my_section);

}

时间: 2024-11-08 12:13:57

外挂技术-调试游戏久了为何异常的原因的相关文章

游戏外挂技术

     1.首先打开植物大战僵尸.进入如下界面. 2.打开MemSearch工具.截图如下: 注意:可以通过查找出的内存地址来修改阳光值.如果左侧查找出了多个,重新输入目标值,然后点击累计查找,直到找到确切的内存地址. 3.然后新建一个项目:挂中挂,截图如下: 4.点击确定 5.源文件-à新建一个.c文件. 6.通过指针的方式间接修改阳光的值.例如: 7.调试以下程序: (1)在程序中打断点à点击"本地Windows调试器" (2)点击调试à窗口à内存à内存4(4) 然后在地址

外挂技术汇总及书籍推荐

本节介绍游戏安全领域一些入门必备书籍,包含开发.逆向和游戏安全基础.读者可以根据自身情况选择性阅读. 1.开发基础 游戏安全领域逆向是核心技能,但在学习逆向技术之前,必须拥有牢固的开发基础.因为编写外挂需要一定的开发基础:再来只有有一定开发基础,并对程序架构,运行原理了解,才能在逆向领域走的更深入. 对于没有开发基础的读者,这里推荐<C语言程序设计>入门,作者是C语言和UNIX系统的发明人,书比较薄,但却不失为经典.游戏安全领域主流开发语言为C/C++,在有一定C语言基础后,可以尝试阅读下&l

应用层反外挂技术研究

标 题: 应用层反外挂技术研究作 者: choday时 间: 2013-06-19,17:02:32链 接: http://bbs.pediy.com/showthread.php?t=173897 此技术不算原创,但算是整理,详解 话说神秘人物v校,73%可能性为女性.此技术是从他那里学来的.此人说话言简意赅,需要耐心体会. 外挂,与反外挂,是矛与盾的关系,要想做好反外挂,必须了解矛的构成,以及盾的技术,才能制造出一个较好的盾. 纵观当前反外挂形势,就像是世界大战,各种驱动满天横飞.战火连天,

OllyICE 调试的程序无法处理异常 解决方法

问题描述 在用OllyICE打开可执行文件时出现如下图所示错误 解决方法 1. 选项 -> 调试设置 , 打开调试选项 2. 切换到 异常 页签 3. 取消勾选 忽略(传递给程序)以下异常: 单步中断 4. 确定保存设置 OK, 重新加载可执行文件, 会出现单步中断, 按F9继续执行即可, 问题解决! 我也不清楚为何这样可以解决, 如果有高手知道原因, 请不吝赐教, 谢谢:)

android eclipse调试报java.lang.ClassCastException异常

在布局文件中 ImageView 位置第一次先放在Button之前 编译代码没有出错 然后调整两者的位置 再次编译 报如下错误 异常提示Button类型不能转换成ImageView类型 为什么会这么报错呢,我明明没有让它们之间进行转换. 原来由于eclipse的编译是基于时间戳的判断机制的.所以当你按build all的时候有些eclipse认为时间戳没有改变的类不会被编译.因此你可以先clean一下再编译.这个时候eclipse会将所有的以前编译信息清除然后编译. 在调换两个控件的前后位置再次

w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常

一.问题描述 昨天系统联调,用到了VS2010 附件进程,把w2wp.exe 进程添加到vs2010 的调试进程中,这样其他系统访问我们系统,就可以捕获断点进行调试 但是,今天F5 调试的时候,发现直接报错"w2wp.exe 已附加有调试器,但没有将该调试器配置为调试此未经处理的异常.若要调试此异常,必须分离当前的调试器" 二.问题分析: w2wp.exe:是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行

NIOS II CPU复位异常的原因及解决方案

NIOS II CPU复位异常的原因及解决方案 ? 近期在用nios ii做项目时,发现一个奇怪的现象,在NIOS II EDS软件中编写好的代码,烧写到芯片中,第一次能够正常运行,但是当我按下板卡上的复位键之后,系统却卡死了,再也运行不起来,除非重新下载程序.经过分析系统可知,系统的硬件设计和Qsys系统中NIOS II CPU系统的搭建都是没有任何问题的.那么为什么会存在这样的问题呢,这里我先简单介绍下我的系统: 我的系统主要由NIOS II最强板CPU,SDRAM.预留系统定时器.预留时间

Cpp引入异常的原因以及关于异常的吐槽

在知乎上看到关于“Cpp的异常”的讨论,在此整理一下. C++ 引入异常的原因: 1.为了能让构造函数报错(析构函数不能抛异常这是大家都知道的常识),毕竟构造函数没有返回值,没有异常的话调用方如何得知对象构造是否成功呢? 2.让 dynamic_cast<Derived&>(baseReference) 能报错,因为没有 null reference. 3.让 overloaded operator 能报错,毕竟 operator 的返回类型往往无法包含 error code,例如 o

Struts2中使用execAndWait后,在 Action中调用getXXX()方法报告java.lang.NullPointerException异常的原因和解决方法

使用 Struts2 编写页面,遇到一个要长时间运行的接口,因此增加了一个execAndWait ,结果在 Action 中调用 getContext()的时候报告异常 1 ActionContext context = ActionContext.getContext(); 2 ServletContext servletContext = (ServletContext) context.get(ServletActionContext.SERVLET_CONTEXT); //抛空指针异常