内存修改器

使用VC2008制作简单大航海外传内存修改器 作者 :小草日期 :2010/7/4始发于 http://bbs.evewind.net/read.php?tid=2815此教程是本人游戏之作 ,如有雷同 ,纯属抄袭此教程宗旨 :动手实践为主 ,理论解释为辅 .只看不动手者 ,只动手不自学者 ,请回家 . 编程乃至学习这件事不适合你 .简介 :此教程目的是为了记录我个人的学习成果 ,并希望阅读的人掌握文中提到 的知识 . 希望通过这样的方式,教会大家怎么样制作内存修改器,期待有抛砖引 玉的效果.教 程分为2个部分 : 阅读详情
//用宏主要是为了实现看到名字知道其意义,且修改时可以很方便
//定义人物各个属性地址宏
#define JINQIANADDRESS        0x0072D1E8

//王小虎属性地址
#define WANGJINGYANADDRESS    0x0072C2DC
#define WANGTILIADDRESS        0x0072C2E4
#define WANGZHENQIADDRESS    0x0072C2F0

#define WANGWUSHUADDRESS    0x0072C300
#define WANGLINGLIADDRESS    0x0072C308
#define WANGFANGYUADDRESS    0x0072C310

#define WANGSHENFAADDRESS    0x0072C318
#define WANGJIYUNADDRESS    0x0072C320
#define WANGJINQIANADDRESS    JINQIANADDRESS


//李忆如属性地址
#define LIJINGYANADDRESS    0x0072CE94
#define LITILIADDRESS        0x0072CE9C
#define LIZHENQIADDRESS        0x0072CEA8

#define LIWUSHUADDRESS        0x0072CEB8
#define LILINGLIADDRESS        0x0072CEC0
#define LIFANGYUADDRESS        0x0072CEC8

#define LISHENFAADDRESS        0x0072CED0
#define LIJIYUNADDRESS        0x0072CED8
#define LIJINQIANADDRESS    JINQIANADDRESS


//沈欺霜属性地址
#define SHENJINGYANADDRESS    0x0072C6C4
#define SHENTILIADDRESS        0x0072C6CC
#define SHENZHENQIADDRESS    0x0072C6D8

#define SHENWUSHUADDRESS    0x0072C6E8
#define SHENLINGLIADDRESS    0x0072C6F0
#define SHENFANGYUADDRESS    0x0072C6F8

#define SHENSHENFAADDRESS    0x0072C700
#define SHENJIYUNADDRESS    0x0072C708
#define SHENJINQIANADDRESS    JINQIANADDRESS


//苏媚属性地址
#define SUJINGYANADDRESS    0x0072CAAC
#define SUTILIADDRESS        0x0072CAB4
#define SUZHENQIADDRESS        0x0072CAC0

#define SUWUSHUADDRESS        0x0072CAD0
#define SULINGLIADDRESS        0x0072CAD8
#define SUFANGYUADDRESS        0x0072CAE0

#define SUSHENFAADDRESS        0x0072CAE8
#define SUJIYUNNADDRESS        0x0072CAF0
#define SUJINQIANADDRESS    JINQIANADDRESS

//定义人物数组结构体类型
struct _Person
{
    DWORD dwShuXing[9];
};



//定义并初始化人物数组
//用数组存储4个主角的9个属性,可以使用循环来操作它们的值,大大的减少了代码冗余
const _Person stPerson[4] = {
            {WANGJINGYANADDRESS, WANGTILIADDRESS, WANGZHENQIADDRESS,
            WANGWUSHUADDRESS, WANGLINGLIADDRESS, WANGFANGYUADDRESS,
            WANGSHENFAADDRESS, WANGJIYUNADDRESS, WANGJINQIANADDRESS},        //王小虎                   

            {LIJINGYANADDRESS, LITILIADDRESS, LIZHENQIADDRESS,
            LIWUSHUADDRESS, LILINGLIADDRESS, LIFANGYUADDRESS,
            LISHENFAADDRESS, LIJIYUNADDRESS, LIJINQIANADDRESS},        //李忆如
           
            {SHENJINGYANADDRESS, SHENTILIADDRESS, SHENZHENQIADDRESS,
            SHENWUSHUADDRESS, SHENLINGLIADDRESS, SHENFANGYUADDRESS,
            SHENSHENFAADDRESS, SHENJIYUNADDRESS, SHENJINQIANADDRESS},        //沈欺霜

            {SUJINGYANADDRESS, SUTILIADDRESS, SUZHENQIADDRESS,
            SUWUSHUADDRESS, SULINGLIADDRESS, SUFANGYUADDRESS,
            SUSHENFAADDRESS, SUJIYUNNADDRESS, SUJINQIANADDRESS}};        //苏媚

//4个主角姓名,元素下标正好对应组合框的内容所在列,如王小虎下标为0,在组合框中的列值也为0
//其它主角也是一样
CString strPerson[4]={"王小虎", "李忆如", "沈欺霜", "苏媚"};


class CAboutDlg : public CDialog
{
public:
    CAboutDlg();

// Dialog Data
    //{{AFX_DATA(CAboutDlg)
    enum { IDD = IDD_ABOUTBOX };
    //}}AFX_DATA

    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CAboutDlg)
    protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
    //}}AFX_VIRTUAL

// Implementation
protected:
    //{{AFX_MSG(CAboutDlg)
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
    //{{AFX_DATA_INIT(CAboutDlg)
    //}}AFX_DATA_INIT
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CAboutDlg)
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
    //{{AFX_MSG_MAP(CAboutDlg)
        // No message handlers
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy2Dlg dialog

CMy2Dlg::CMy2Dlg(CWnd* pParent /*=NULL*/)
    : CDialog(CMy2Dlg::IDD, pParent)
{
    //{{AFX_DATA_INIT(CMy2Dlg)
    //}}AFX_DATA_INIT
    // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMy2Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    //{{AFX_DATA_MAP(CMy2Dlg)
    DDX_Control(pDX, IDC_SCROLLBAR_FY, m_SBFY);
    DDX_Control(pDX, IDC_SCROLLBAR_JQ, m_SBJQ);
    DDX_Control(pDX, IDC_SCROLLBAR_LL, m_SBLL);
    DDX_Control(pDX, IDC_SCROLLBAR_JY, m_SBJY);
    DDX_Control(pDX, IDC_SCROLLBAR_SF, m_SBSF);
    DDX_Control(pDX, IDC_SCROLLBAR_WS, m_SBWS);
    DDX_Control(pDX, IDC_SCROLLBARZQ, m_SBZQ);
    DDX_Control(pDX, IDC_SCROLLBARTL, m_SBTL);
    DDX_Control(pDX, IDC_SCROLLBARJL, m_SBJL);
    //}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CMy2Dlg, CDialog)
    //{{AFX_MSG_MAP(CMy2Dlg)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTONMODIFY, OnButtonModify)
    ON_WM_HSCROLL()
    ON_BN_CLICKED(IDC_BUTTONABOUT, OnButtonAbout)
    ON_BN_CLICKED(IDC_BUTTON_ALLFULL, OnButtonAllFull)
    ON_BN_CLICKED(IDC_BUTTON_ALLZERO, OnButtonAllZero)
    ON_CBN_SELCHANGE(IDC_COMBORENWU, OnSelchangeComboRenWu)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMy2Dlg message handlers



/*
**======================================
** OnInitDialog
** 初始化控件数组及资源数组
**======================================
*/
BOOL CMy2Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // Add "About..." menu item to system menu.

    // IDM_ABOUTBOX must be in the system command range.
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);            // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon
   
    // TODO: Add extra initialization here

    //检查是否多开,禁止多开

    HWND hwnd=::FindWindow(NULL, "仙剑2内存修改器 v1.0");

    SetWindowText("我要多开");

    //初始化滚动条控件指针数组,为了实现用循环读取或改变滚动条全满或全0等操作
    //消除代码冗余,因为难以想像不用循环而是一句句的读写控件的属性值是一种什么情况
    //SB为滚动条控件前缀,JL 、TL、等是属性值拼音的第一个字母,后面的类似
    m_SBArray[0] = &m_SBJL;
    m_SBArray[1] = &m_SBTL;
    m_SBArray[2] = &m_SBZQ;

    m_SBArray[3] = &m_SBWS;
    m_SBArray[4] = &m_SBLL;
    m_SBArray[5] = &m_SBFY;

    m_SBArray[6] = &m_SBSF;
    m_SBArray[7] = &m_SBJY;
    m_SBArray[8] = &m_SBJQ;

    //初始化当前属性值静态控件数组,实现用循环读写静态控件上的值
    //消除代码冗余
    HandleStaticCurrent[0] = IDC_STATIC_CURRENTLJ;
    HandleStaticCurrent[1] = IDC_STATIC_CURRENTTL;
    HandleStaticCurrent[2] = IDC_STATIC_CURRENTZQ;

    HandleStaticCurrent[3] = IDC_STATIC_CURRENT_WS;
    HandleStaticCurrent[4] = IDC_STATIC_CURRENT_LL;
    HandleStaticCurrent[5] = IDC_STATIC_CURRENT_FY;

    HandleStaticCurrent[6] = IDC_STATIC_CURRENT_SF;
    HandleStaticCurrent[7] = IDC_STATIC_CURRENT_JY;
    HandleStaticCurrent[8] = IDC_STATIC_CURRENT_JQ;

   
    //初始化增加属性值静态控件数组,实现用循环读写增加值静态控件上的值
    //消除代码冗余
    HandleStaticAdd[0] = IDC_STATICJL;
    HandleStaticAdd[1] = IDC_STATICTL;
    HandleStaticAdd[2] = IDC_STATICZQ;
   
    HandleStaticAdd[3] = IDC_STATIC_WS;
    HandleStaticAdd[4] = IDC_STATIC_LL;
    HandleStaticAdd[5] = IDC_STATIC_FY;
   
    HandleStaticAdd[6] = IDC_STATIC_SF;
    HandleStaticAdd[7] = IDC_STATIC_JY;
    HandleStaticAdd[8] = IDC_STATIC_JQ;

    //初始化里程ID为0
    hProcess = 0;

    //初始化游戏运行状态为没有启动
    IfGameRun = false;
       

    //将9个滚动条控件值范围设为0到10w,如果不用数组管理控件,这里要用9行同样的代码
    //来设置这个范围,而且后面涉及到类似的操作都得用大量重复的语句来实现,这就是用数组
    //的好处了
    for(int i = 0; i < 9; i++)
    {
        m_SBArray[i]->SetScrollRange(0, 100000, true);
    }

    //我们要修改的游戏为 仙剑2,这就里为仙剑2 游戏程序名
    //这里我不是通过 窗口标题来获取进程ID的,因而要遍历全部进程直到找到仙剑2进程为止
    strFileName = "Pal2.exe";

    CString strTemp;

    //初始化组合框控件显示内容为 王小虎
    ((CComboBox*) GetDlgItem(IDC_COMBORENWU))->SetCurSel(0);

    //这个变量为 组合框内容所在列,如 王小虎所在列为 0,往下加1
    num = 0;

    //如果游戏没有启动,则不设置相应控件上的值,而使用各自的默认值
    if(!InitProcess())
    {
        return false;
    }

    //从游戏内存中读取4个人物的属性值
    ReadMemory();

    //将读取到的属性值显示到控件上
    ReflashStatic();

    //关闭打开的进程
    MyCloseHandle();

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMy2Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// If you add a minimize button to your dialog, you will need the code below
//  to draw the icon.  For MFC applications using the document/view model,
//  this is automatically done for you by the framework.

void CMy2Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);

        // Center icon in client rectangle
        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;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

// The system calls this to obtain the cursor to display while the user drags
//  the minimized window.
HCURSOR CMy2Dlg::OnQueryDragIcon()
{
    return (HCURSOR) m_hIcon;
}


/*
**======================================
** GetProcessIDFromProcessName
** 根据进程名(程序名)遍历进程获取进程ID
**======================================
*/
DWORD  CMy2Dlg::GetProcessIDFromProcessName(CString strProcessName) 
{ 
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hSnapshot == INVALID_HANDLE_VALUE)
    {
        return 0;
    }
   
    PROCESSENTRY32 pInfo;
   
    pInfo.dwSize = sizeof(PROCESSENTRY32);
   
    //遍历进程直到找到 Pal2.exe为止
    for (BOOL bRet = Process32First(hSnapshot, &pInfo); bRet; bRet = Process32Next(hSnapshot, &pInfo))
    {
        if(strcmp(strProcessName.GetBuffer(0), pInfo.szExeFile) == 0)
        {
            CloseHandle(hSnapshot);
            return pInfo.th32ProcessID;
        }
    }
   
    return 0;
} 


/*
**======================================
** OnButtonModify
** 增加属性值事件处理函数
**======================================
*/
void CMy2Dlg::OnButtonModify()
{
    // TODO: Add your control notification handler code here

    if(!InitProcess())
    {
        //游戏已关闭,将各个控件值清一下
        ClearExitGame();

        //设置游戏状态为没有启动
        IfGameRun = false;
        MessageBox("请先运行游戏!");

        return;
    }
    else IfGameRun = true;

    //读取当前选择的主角的9个属性值
    ReadMemory();

    //将滚动条的值加上现在人物的属性值后写入属性值空间
    WriteMemory();

    //同时将刷新一下当前人物属性值,即当前属性值对应的静态控件
    ReflashStatic();

    //关闭进程
    MyCloseHandle();   
}   

/*
**======================================
** OnHScroll
** 移动滚动条时触发此函数
**======================================
*/
void CMy2Dlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    // TODO: Add your message handler code here and/or call default

    //如果游戏没有启动,拖动滚动条时不作处理
    if (IfGameRun == false)
    {
        return;
    }

   
    switch  (nSBCode) 
    { 
    case  SB_THUMBTRACK:    //直接拖动滚动条时
        pScrollBar->SetScrollPos(nPos); 
        break; 
    case  SB_LINERIGHT:  //鼠标点击滚动条右边的滚动箭头时
        pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 1000); 
        break; 
    case  SB_RIGHT:  // 
        pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 1000); 
        break; 
    case  SB_PAGERIGHT://  鼠标点击滚动条右边的滚动栏时
        pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() + 10000); 
        break;
    case  SB_PAGELEFT:  //  鼠标点击滚动条左边的滚动栏时
        pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 10000); 
        break;//4 
    case  SB_LEFT:  // 
        pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 1000); 
        break;
    case  SB_LINELEFT:  //  鼠标点击滚动条左边的滚动箭头时
        pScrollBar->SetScrollPos(pScrollBar->GetScrollPos() - 1000); 
        break; 
    }


    CString  s; 
   
    //将滚动条位置值转换为字符串
    s.Format("%d", pScrollBar->GetScrollPos()); 
   
    //根据滚动条的值设置增加属性值静态控件上的值
    for(int i = 0; i < 9; i++)
    {
        if(pScrollBar == m_SBArray[i])
        {
            GetDlgItem(HandleStaticAdd[i])->SetWindowText(s);
            break;
        }
    }

    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}


/*
**======================================
** OnButtonAbout
** 弹出关于框
**======================================
*/
void CMy2Dlg::OnButtonAbout()
{
    // TODO: Add your control notification handler code here
    CAboutDlg dlgAbout;

    dlgAbout.DoModal();
}


/*
**======================================
** OnButtonAllFull
** 设置滚动条值为满
**======================================
*/
void CMy2Dlg::OnButtonAllFull()
{
    // TODO: Add your control notification handler code here

    //如果游戏没有启动,不作处理
    if (IfGameRun == false)
    {
        return;
    }

    //将9个滚动条控件值设为10w
    for(int i = 0; i < 9; i++)
    {
        m_SBArray[i]->SetScrollPos(100000);
    }

    //将相应的9个静态控件设置为"100000"
    for (i = 0; i < 9; i++)
    {
        GetDlgItem(HandleStaticAdd[i])->SetWindowText("100000");       
    }
}

/*
**======================================
** OnButtonAllZero
** 设置滚动条值为0
**======================================
*/
void CMy2Dlg::OnButtonAllZero()
{
    // TODO: Add your control notification handler code here

    //如果游戏没有启动,不作处理
    if (IfGameRun == false)
    {
        return;
    }

    //将9个滚动条控件值清0
    for(int i = 0; i < 9; i++)
    {
        m_SBArray[i]->SetScrollPos(0);
    }

    //将9个表示增加属性值的静态控件设置为"0"
    for (i = 0; i < 9; i++)
    {
        GetDlgItem(HandleStaticAdd[i])->SetWindowText("0"); 
    }
}


/*
**======================================
** OnSelchangeComboRenWu
** 下拉列表内容改变时触发此函数
**======================================
*/
void CMy2Dlg::OnSelchangeComboRenWu()
{
    // TODO: Add your control notification handler code here

    if(!InitProcess())
    {   
        //因为游戏没有启动或已关闭,要将滚动条控件和静态控件上的值清除一下
        ClearExitGame();

        IfGameRun = false;

        return;
    }
    else IfGameRun = true;
   
    //读取内存中游戏人物属性
    ReadMemory();
   
    //将读取出来的值显示到当前属性值对应的静态控件上
    ReflashStatic();
   
    //关闭进程
    MyCloseHandle();   
}

/*
**======================================
** ReadMemory
** 读取游戏进程内存各个属性值
**======================================
*/
void CMy2Dlg::ReadMemory()
{   
    CString strTemp = "";
   
    //取当前选择的人物,为了实现一次只改变一个人物的属性
    ((CComboBox*) GetDlgItem(IDC_COMBORENWU))->GetWindowText(strTemp);
   
    for (int i = 0; i < 4; i++)
    {
        if (strTemp == strPerson[i])
        {
            //记录该人物在组合框中的列值,这个很重要,因为要根据列值
            //来读取人物属性数组中的地址,来实现读或写属性值的操作
            num = i;
            break;
        }
    }

    //读当前选择的人物的9个属性值
    for (i = 0; i < 9; i++)
    {
        ReadProcessMemory(hProcess, (LPVOID) stPerson[num].dwShuXing[i], &DataShuXing[i], 4, NULL);

    }
}

/*
**======================================
** WriteMemory
** 将新属性值写入游戏进程的指定内存单元
**======================================
*/
void CMy2Dlg::WriteMemory()
{
    //将读取出来的属性值和滚动条的值相加后写入内存,改变人物属性
    //人物各个属性地址见相应数组元素
    for (int i = 0; i < 9; i++)
    {
        DataShuXing[i] += m_SBArray[i]->GetScrollPos();

        WriteProcessMemory(hProcess, (LPVOID) stPerson[num].dwShuXing[i], &DataShuXing[i], 4, NULL);
    }
}


/*
**======================================
** InitProcess
** 打开游戏进程并获取读写进程的权限
**======================================
*/
bool CMy2Dlg::InitProcess()
{
    //传送游戏程序名来获取它的进程ID,这里仙剑2只有唯一进程
    dwProcessID = GetProcessIDFromProcessName(strFileName);

    //如果失败返回0
    if(dwProcessID == 0)
    {
        return false;
    }
   
       
    //打开进程并得到读与权限       
    hProcess = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_TERMINATE |
                            PROCESS_VM_OPERATION | PROCESS_VM_READ |
                            PROCESS_VM_WRITE, FALSE, dwProcessID);   
   
    //打开进程失败返回0
    if(hProcess == NULL)
    {
        return false;
    }

    return true;
}


/*
**======================================
** ReflashStatic
** 刷新一下各个静态控件上的文本
**======================================
*/
void CMy2Dlg::ReflashStatic()
{

    //如果游戏没有启动不作操作
    if (IfGameRun == false)
    {
        return;
    }

    CString strTemp[9];   
   
    //将9个属性值转换为字符串存储到数组,这9个属性值可以是刚从内存中读取出来的
    //也可以是读取之后修改了的值
    for (int i = 0; i < 9; i++)
    {
        strTemp[i].Format("%d", DataShuXing[i]);
    }

    //将属性值显示在相应控件上
    for (i = 0; i < 9; i++)
    {
        GetDlgItem(HandleStaticCurrent[i])->SetWindowText(strTemp[i]); 
    }
}

/*
**======================================
** MyCloseHandle
** 关闭打开的进程
**======================================
*/
void CMy2Dlg::MyCloseHandle()
{
    //关闭进程
    CloseHandle(hProcess);
}

/*
**======================================
** ClearExitGame
** 当游戏退出时,要将人物当前属性值清0
**======================================
*/
void CMy2Dlg::ClearExitGame()
{
    //当游戏已经退出时,将9个增加属性值静态控件上的值空
    OnButtonAllZero();

    //将9个当前属性静态控件上的值清空
    for (int i = 0; i < 9; i++)
    {
        GetDlgItem(HandleStaticCurrent[i])->SetWindowText("0"); 
    }

}
游戏修改器制作教程四:用API读写内存 上一章讲了用CE读写内存,本章讲如何自己编程实现 本文以制作东方辉针城修改器的实战讲解读写内存 阅读详情

相关推荐

内存修改器实现源码

#include "stdafx.h" #include #include #include #include using namespace std; DWORD g_arList[1024]; int g_nListCnt; HANDLE g_hProcess; BOOL WriteMemory(DWORD dwAddr, DWORD dwValue);

ripya的专栏 2225

delphi tlistbox添加横向滚动条

//delphi tlistbox添加横向滚动条procedure TForm1.SetWidth(pListBox:TListBox);var  i, w: Integer;begin  w := 0;  for i := 0 to pListBox.Items.Count - 1 do  begin    Canvas.Font.Name := pListBox.Font.Name;    C...

1525

Delphi实现的三种内存修改器代码实例

Delphi,作为Pascal语言的一个分支,自1995年推出以来,一直是开发人员喜爱的编程语言之一。它以其强大的编译器、丰富的组件库和高效的运行时性能而闻名。Delphi不仅仅是一个快速应用开发(RAD)工具,更是一个成熟、稳定的开发环境,尤其在Windows平台上有着无可比拟的优势。本章将带你了解Delphi的基本特点和它的独特之处,同时也将探讨其在现代开发环境中的地位和作用。内存修改器(Memory Editor)是一种用于在运行时查看和修改计算机程序内存中数据的工具。

weixin_35756373的博客 1074

Delphi界面添加滚动条

Delphi界面添加滚动条

旭旭的博客 1027

C#内存修改器最新源码深度解析与实战

在unsafe上下文中,C#支持多种指针类型的声明。基本语法为,其中type可以是任何值类型(如intdoublestruct等),但不能是指针本身以外的引用类型(除非使用void*例如:unsafeint x = 42;// 指向整数x的指针// 初始化为空指针// void*可接收任意指针逐行解析- 第3行:声明一个int变量x并赋值。- 第4行:使用取地址符获取x的内存地址,并将其赋给int*类型的指针px。

weixin_42124497的博客 1127

nsct_toolbox.rar

nsct_toolbox.rar

Delphi 滚动条的自绘

一开始想让TListview 滚动条好看一点,进行自绘尝试。 写着写着就发现,这应该是个通用的类。 想想也是应该的。WINDOWS所有控件的滚动条原理都是一样的。 本自绘滚动条类,是通用类,可针对所有WINDOWS控件(除了IE滚动条)。 本自绘滚动条类,是替换了WINDOWS控件的原来的滚动条,用 TPanel 代替,在 TPanel 中进行自绘滚动条。 代码如下: unit untFMS...

dbyoung的Delphi专栏 2727

xcode7.3镜像文件

解决Xcode在ipad/iphone 9.3 系统真机测试时出现could not find developer disk image问题

java实现内存修改器_魔兽3内存修改器 v8

原文 http://tctianchi.yo2.cn/articles/%e9%ad%94%e5%85%bd3%e5%86%85%e5%ad%98%e4%bf%ae%e6%94%b9%e5%99%a8-v8.html[下载]Filename: war3trainerv8.rarFilesize: 69 kBUpload-Date: 2009/9/8Download-Link:請勿用下载工具下載,否...

weixin_29388659的博客 1175

visual c++ vc修改其它进程的内存值,写游戏修改器,内存修改器用

visual c++ vc修改其它进程的内存值,写游戏修改器用.zip

雷达信号处理DDC数字下变频

由于接收到的雷达信号频率较高,不能对其进行直接采样并数据处理,所以需要对雷达信号进行预处理,在降低其采样率的同时,将其由中频降低到低频,然后对输出的基带信号进行后续的解析,以便于获取雷达信号的特征参数。 本文采用数字正交下变频,将单通道信号转化为正交双通道信号,数字下变频(DDC)的原型为模拟下变频,通过对窄带雷达信号或单频信号进行数字混频,然后对信号进行正交采样,提取 I、Q 两路正交分量,最后通过滤波去除信号中的高频分量,将信号由中高频搬移至低频。 模拟下变频的系统框图如下: 其数学推导.

qq_44033461的博客 5234

怎么修改android内存,安卓内存修改器怎么用?

安卓内存修改器怎么用?内存搜索是手游修改器普遍都具有的一项功能,也是目前最主流的游戏修改方式,安全、快速、效果显著,并且不会轻易被官方封号,GG助手除了拥有大内高手不断升级制作的插件外,也集成了一个标配的内存修改器。下面学习啦小编给大家分享下具体的方法,希望对大家有帮助!安卓内存修改器怎么用?内存修改器的原理安卓内核,也就是Linux底层,会为每个运行中的游戏,动态分配内存空间,用于存放游戏中产生...

weixin_42512012的博客 8000

防止加入域主机脱离域的控制(管理员权限)

一、简介   当公司所有主机加入到域后,SA首要工作就是防止加入域的主机脱离域的控制。让我发现该工作的必要性是一程序猿,前一天刚配完禁止执行QQ、微信执行,第二天就看到那家伙在用微信聊天,肯定是用回旧的本地账号登陆了。   本人所在公司安装软件的类型繁杂,无管理员权限运行不少软件会报错,不得不授予「域账号」本地管理员权限。过大的权限带也来了一系列后果:用户可随意退出域、创建本地管理员...

der69615的博客 3176

内存修改器原理

BOOL WINAPI ReadProcessMemory(                   HANDLE hProcess,    //待读进程的句柄                   LPCVOID lpBaseAddress,    //目标进程中待读内存的起始地址                   LPVOID lpBuffer,    //用来读取数据的缓冲区          

Ginvar的专栏 1630

手把手教你用Cadence Virtuoso完成LNA全套仿真:基于SpectreRF手册的实战补充

本文详细指导如何使用Cadence Virtuoso和SpectreRF完成LNA的全套仿真,涵盖噪声仿真、增益压缩、THD分析及双音IP3测量等关键步骤。针对官方手册中的常见问题,提供了12个实战解决方案,包括hbnoise函数选择、双音信号源配置等,帮助工程师高效完成射频IC设计。

weixin_29102619的博客 524

SAR成像概述

1. 发展概述 雷达是英文Radar(Radio detection and ranging)的音译,原意为“无线电探测与测距”。雷达的发明是无线电发展史上的里程碑,二战时,英国急需通过雷达探测空中金属物体来帮助搜寻德国飞机,这期间,雷达技术飞速发展,发展出了地对空、空对地轰炸、空对空火控、敌我识别等功能。雷达在第二次世界大战中发挥了重大作用,至今仍是军用和许多民用领域的重要传感器。 早期雷达系统通过时间延迟来测距,通过天线指向来测角,通过多普勒频移测速。1951年,Carl Wiley发现,通..

5077

打造自己的游戏修改器和内存补丁

   相信很多人打游戏的时候都用修改器,这里我介绍怎样用VB编写修改器。          1、其实修改器原理很简单,一般来说,在游戏运行的时候我们对游戏内存空间中必要的数据进行修改就可以了。举个例子来说,一款拳皇模拟器里游戏人物的“血”地址是&H567DC0,当这个人物挨打的时候,这个地址的数据就要减少,只要我们把这个数据再改回去,人物的“血”就有了。要是我们作一个循环,不断地保持这个地址得

w9521423的博客 4985

使用mid360运行lio-livox对比fast-lio2

msg_type为激光雷达发出的数据格式,有livox自定义数据类型格式CustomMsg和ros标准的PointCloud2格式,因此首先需要确定激光雷达端配置的是哪种格式。可以从激光雷达的ros驱动中看到驱动端有三种格式可以选,驱动端的数字2对应lio-livox中的1,驱动端的0对应lio-livox的格式0。如果使用的是Ubuntu18.04编译完成后运行直接成功,如果使用20.04运行会报错,需要修改以下源代码。针对livox-mid360 运行lio-livox的一些问题。

z1872385的博客 1231

内存搜索修改器

#pragma once #include #include class SearchMomery { private: HANDLE g_hProcess; private: BOOL ComparePage(DWORD dwBaseAddr, DWORD dwValue); public: DWORD g_nCount; DWORD g_list[4096];

qq_33760134的博客 1344

[Python] -项目实战10- 用 Python 自动化批量重命名文件

本文介绍了使用Python实现文件批量重命名的技术方法。主要内容包括:1)使用os和pathlib模块进行基础文件操作;2)提供多种实用脚本示例,如添加序号、替换字符、添加时间戳等;3)进阶功能包括用户输入和错误处理;4)GUI工具实现方案;5)常见问题与优化建议。文章详细讲解了从简单到复杂的批量重命名实现方法,帮助读者快速掌握这一提高工作效率的技能。建议开发者注意路径处理、错误管理等细节,确保脚本稳健运行。

每日出拳老爷子的博客 815

SPI为什么不需要加上拉电阻

大家好,我是记得诚。I2C因为其开漏的结构,无法输出高电平,所以外部加上拉电阻。我们在使用SPI的时候,发现是不需要加上拉电阻的。主要因为SPI多为推挽的结构,推挽电路,高低电平都可以输出,所以外部不需要加上拉电阻。推挽电路可以用2个三极管或者2个MOS管搭建而成。

记得诚 2631

游戏内存修改器原理

BOOLWINAPIReadProcessMemory(                                    HANDLE hProcess,    //待读进程的句柄                                    LPCVOID lpBaseAddress,    //目标进程中待读内存的起始地址           

一步一步 5186

ICC2 user guide(二)Placement and Optimization

ICC2 place阶段user guide

m0_61544122的博客 9228

Windows编程_Lesson008_内存_内存修改器

内存修改器修改指定进程名字中的内存单线程版本#include <Windows.h> #include <stdio.h> #include <vector> // 第一次查找 void FirstFind(HANDLE hProcess, BYTE *pBuffer, DWORD dwPageSize, DWORD dwVal, std::vector<DWORD> &vecAddr) {

艺术人生的专栏 292

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【术】游戏内存修改器原理及游戏敏感数值加密建议

介绍市面上主流游戏内存修改器的原理,对症下药,让游戏从数据加密层面上更好的抵御这类内存修改器。 主流游戏内存修改器有三大内存搜索功能: 1. 基础数值搜索 2. 模糊搜索 3. 反加密搜索基础数值搜索是这么一个工作流程:首先搜一个特定的数值,比如金钱100就搜100,待金钱变化后,比如110就再搜110,如此重复3到4步操作,内存修改器就能定位到金钱所在的内存地址,接着就可以进行修改了。模糊搜

Kingous-惊蛰 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

上一篇: 驱动和应用层的三种通信方式
下一篇: 利用DNS漏洞攻击的Ruby代码
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值