精华内容
下载资源
问答
  • 2019-08-04 22:52:26

    获取植物大战僵尸进程

    我用的是植物大战僵尸汉化第二版,基址是0x006A9EC0
    编译器是VC++6.0
    (注:未经说明且不是函数定义的代码添加于按钮处)
    声明基址

    const int baseaddr = 0x006A9EC0;
    

    首先是获取植物大战僵尸进程

    	PROCESSENTRY32 pe32;
    	pe32.dwSize = sizeof(pe32);
    	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
    	BOOL have_more = ::Process32First(hProcessSnap,&pe32);
    	int processid = -1;
    	while(have_more)
    	{
    		if(!_tcscmp(pe32.szExeFile,_T("PlantsVsZombies.exe")))
    		{
    			processid = pe32.th32ProcessID;
    			break;
    		}
    		have_more = ::Process32Next(hProcessSnap,&pe32);
    	}
    	if(processid == -1)
    	{
    		AfxMessageBox("找不到游戏进程");
    		ExitThread(-1);
    	}
    	CloseHandle(hProcessSnap);
    	HANDLE hprocess = ::OpenProcess(PROCESS_ALL_ACCESS,FALSE,processid);
    

    hprocess就是植物大战僵尸进程了

    改变阳光数

    接着就要改变阳光数了,阳光地址是0x006A9EC0 + 0x786 + 0x5560
    (即0x006A9EC0的值加上0x786后作为地址,取值加0x5560为阳光地址,之后的不另做解释)

    	CString ssun;
    	DWORD sun = 0;
    	m_edit1.GetWindowText(ssun);//获取增加阳光数
    	int addr;
    	//改变阳光数
    	::ReadProcessMemory(hprocess,(LPVOID)(baseaddr),&addr,4,0);
    	::ReadProcessMemory(hprocess,(LPVOID)(addr+0x768),&addr,4,0);
    	::ReadProcessMemory(hprocess,(LPVOID)(addr+0x5560),&sun,4,0);
    	sun += atoi(ssun);
    	::WriteProcessMemory(hprocess,(LPVOID)(addr+0x5560),&sun,4,0);
    

    改变金币数

    再其次是改变金币数,金币数地址是0x006A9EC0 + 0x82c+ 0x28
    (注:实际金币数为该地址的值乘上10后的结果)

    	CString smoney;
    	DWORD money = 0;
    	m_edit2.GetWindowText(smoney);
    	//改变金币数
    	::ReadProcessMemory(hprocess,(LPVOID)(baseaddr),&addr,4,0);
    	::ReadProcessMemory(hprocess,(LPVOID)(addr+0x82c),&addr,4,0);
    	::ReadProcessMemory(hprocess,(LPVOID)(addr+0x28),&money,4,0);
    	money += atoi(smoney)/10;
    	::WriteProcessMemory(hprocess,(LPVOID)(addr+0x28),&money,4,0);
    

    CD循环清零

    再接着是CD循环清零,每个格子CD地址0x006A9EC0 + 0x768+ 0x144 +(0x70+0x50i) (0<=i<10)
    (注:(0x70+0x50
    i)表示括号内为直接运算即可)
    先在构造函数处添加如下代码

    hthread = INVALID_HANDLE_VALUE;
    

    再在按钮事件添加如下代码

    //判断是否启动/终止CD循环清零
    	if(m_check1.GetCheck() == 1 && hthread == INVALID_HANDLE_VALUE)
    	{
    		hthread = CreateThread(NULL,0,hackthread,&hprocess,0,NULL);
    	}else if(m_check1.GetCheck() != 1 && hthread != INVALID_HANDLE_VALUE)
    	{
    		TerminateThread(hthread,0);
    		hthread = INVALID_HANDLE_VALUE;
    	}
    
    DWORD _stdcall hackthread(LPVOID lpparam)
    {
    	const int baseaddr = 0x006A9EC0;
    	HANDLE hprocess = *((HANDLE*)lpparam);
    	int value = 1;
    	int addr;
    	while(true)
    	{
    		ReadProcessMemory(hprocess,(LPVOID)(baseaddr),&addr,4,0);
    		ReadProcessMemory(hprocess,(LPVOID)(addr+0x768),&addr,4,0);
    		ReadProcessMemory(hprocess,(LPCVOID)(addr+0x144),&addr,4,0);
    		for(int i = 0;i < 10;i++)//利用循环每次加50,循环10次实现10个方框无冷却
    		{
    			WriteProcessMemory(hprocess,(LPVOID)(addr+0x70+(0x50)*i),&value,4,0);
    		}
    	}
    	return 0;
    }
    

    运行结果

    运行结果

    更多相关内容
  • 外挂修改器终结者.zip

    2021-05-14 13:55:09
    该程序可拦截修改器所进行的操作,如修改游戏数据,会拦截下被修改游戏数据的基 址,非常方便
  • H5页面修改器.zip

    2020-09-30 16:08:24
    H5页面修改器,可用于页面编辑,修改,制作 H5页面修改器,可用于页面编辑,修改,制作 H5页面修改器,可用于页面编辑,修改,制作 H5页面修改器,可用于页面编辑,修改,制作 H5页面修改器,可用于页面编辑,修改,...
  • C#简易内存修改器.zip

    2021-11-09 11:08:48
    C#制作的内存修改工具类,压缩包内为工程源码,bin目录下有编译后的dll文件。
  • 制作游戏修改器

    千次阅读 2019-03-27 00:10:07
    本次教程从最基础的内容开始, 讲述如何去制作一个游戏修改器的全部过程, 从分析内存数据开始到破解器的开发等出发做起. 0x00: 使用工具 Cheat Engine 5.6.1 将要修改游戏 PlantsVsZombies....

     

    本次教程从最基础的内容开始, 讲述如何去制作一个游戏修改器的全部过程, 从分析内存数据开始到破解器的开发等出发做起.

    0x00:
    • 使用工具 
      Cheat Engine 5.6.1
    • 将要修改游戏 
      PlantsVsZombies.exe - 植物大战僵尸
    • 修改器开发环境 
      MingW and gcc

    注:

    VC等IDE也可以.

    相关文件会在后面添加下载链接

    0x01:
    使用CE查询分析游戏内存数据

    首先打开游戏, 开始游戏, 然后暂停游戏.

     
     

    这时候使用CE打开PlantsVsZombies.exe进程 

     

    在CE中输入当前阳光值的大小, 默认一开始是50, 点击首次查询 
    会出现很多地址, 别担心, 我们进一步继续挖掘. 

     

    再回到游戏里面, 等待收集一个阳光值. 

     

    再到CE中输入75点击再次扫描, 现在的结果比较好了, 只有一个值了. 

     

    双击这个地址, 添加到地址列表里面, 验证找的对不对, 可以修改这个地址的值, 
    在游戏中查看阳光值是否发生变化, 在这里我就不再演示了. 

     

    这个地址上面右击选择, 找出是什么改写了了这个地址 
     
     

    回到游戏中去种一颗植物, 会在列表中找到一个操作. 
     
    点击详细信息 
     
     

    可以看到一些汇编代码, 和寄存器的值. 我们先记录下来

    • EAX=0000004B
    • EBX=00000032
    • ECX=FFFFFFFF
    • EDX=20C8DCA8
    • ESI=00000019
    • EDI=20C8DCA8
    • EBP=0018FB94
    • ESP=0018FAE8
    • EIP=00433F8C
    • Probable base pointer =20C8DCA8
    • 00433f82 - jg 00433f90
    • 00433f84 - sub esi,ebx
    • 00433f86 - mov [edi+00005578],esi
    • 00433f8c - mov al,01
    • 00433f8e - pop esi
     

    其中有一个mov指令, 这个是写入内存值的操作, 偏移是0x5578, 那么其实它写入的地址为EDI+0x5578 
    这个我看一下EDI寄存器的值是: 0x20C8DCA8

    • 00433f86 - mov [edi+00005578],esi
     

    我们再次回到CE中勾选hex, 输入EDI寄存器的值, 点击新的扫描 
    这次找到的东西也不少, 也是比较麻烦的, 只能根据经验和多次尝试了. 
    这里有一个小技巧, 首先去找那些和别的地址不太一样的地址, 比如我在这里就比较轻松的找到了. 

     

    好了, 到了这一步, 我们点击手动添加地址, 勾选指针, 输入我们找的那个地址和上面的偏移值. 
     
    如果是这样的, 说明我们找的没错 
     
     

    下一步, 我们在第二个指针上面右击, 这次选择找出是什么访问了这个地址 
     
     

    选择第一个, 切换到游戏里面 
     
     

    很快在列表里面出现好多访问

     
     

    我们选择其中任意一个地址, 看一下详细信息, 找到可能值为ESI寄存器的值, 我们去查询一下, 出现我们想要的结果了 
    图中我们看到了地址为绿色的, 第一个绿色的地址就是我们要找的地址.  
    我们再次记录一下这个 
    我们找到的地址是: 0x7794F8 偏移: 0x868

    • EAX=023BB760
    • EBX=20D1A534
    • ECX=09B802B6
    • EDX=00A50002
    • ESI=00000021
    • EDI=20C8DCA8
    • EBP=00189760
    • ESP=0018968C
    • EIP=00476667
    • Probable base pointer =023BB760
    • 0047665e - int 3
    • 0047665f - int 3
    • 00476660 - cmp dword ptr [eax+00000868],00
    • 00476667 - jne 0047666c
    • 00476669 - xor al,al

    下一步, 手动添加地址 
    勾选指针, 输入我们找到的地址: 0x7794F8, 偏移0x868 
    再点击添加指针, 输入偏移0x5578, OK. 
     
    最后的结果, 可以在第三个地址修改值, 看看游戏中的阳光值变化. 

    第一步完成了, 找到了我们最终要使用的地址和偏移值.

    • 我们的要找的正确的内存地址的计算方式: *(*(*(0x7794f8) + 0x868) + 0x5578)

    0x02:
    修改器的开发, 我们这里使用C语言

    首先了解一下做修改器的关键API:

    • BOOL ReadProcessMemory(
    • HANDLE hProcess,
    • PVOID pvAddressRemote,
    • PVOIDpvBufferLocal,
    • DWORD dwSize,
    • PDWORDpdwNumBytesRead
    • );
    • 参数:
    • hProcess                [in]远程进程句柄, 被读取者
    • pvAddressRemote         [in]远程进程中内存地址, 从具体何处读取
    • pvBufferLocal           [out]本地进程中内存地址, 函数将读取的内容写入此处
    • dwSize                  [in]要传送的字节数, 要写入多少
    • pdwNumBytesRead         [out]实际传送的字节数, 函数返回时报告实际写入多少
    • BOOL WriteProcessMemory(
    • HANDLE hProcess,
    • LPVOID lpBaseAddress,
    • LPVOID lpBuffer,
    • DWORD nSize,
    • LPDWORD lpNumberOfBytesWritten
    • );
    • 参数:
    • hProcess            [in]远程进程句柄, 被读取者
    • lpBaseAddress       [in]要写的内存首地址, 再写入之前, 此函数将先检查目标地址是否可用, 并能容纳待写入的数据.
    • lpBuffer            [in]指向要写的数据的指针.
    • nSize               [in]要写入的字节数.
    • 返回值
    • 非零值代表成功.

    0x03:原理
    修改器的基本原理就是读取游戏线程的内存数据, 根据我们之前找到的计算方式, 在最后得到地址写入阳光值.
    关键代码实现
    •     DWORD d1, d2;
    •     // 得到0x7794f8地址的内存值, 其值保存到d1, d2为真实读到数据的大小, 这里如果不为4则读取错误
    •     ReadProcessMemory(hProc, (void *)0x7794f8, &d1, 4, &d2);
    •     printf("0x%X 0x%X\n", d1, d2);
    •     // 得到上面地址+0x868的内存值
    •     ReadProcessMemory(hProc, (void *)(d1+0x868), &d1, 4, &d2);
    •     printf("0x%X 0x%X\n", d1, d2);
    •     // 要写入阳光值的地址
    •     ads_ps = d1+0x5578;
    •     // 得到上面地址+0x5578的内存值
    •     ReadProcessMemory(hProc, (void *)(d1+0x5578), &d1, 4, &d2);
    •     // 输出当前阳光值的大小
    •     printf("%d 0x%X\n", d1, d2);
    •     printf("ads_ps: 0x%X\n", ads_ps);
    •     // 在我计算出来的地址里面写入阳光值的大小
    •     WriteProcessMemory(hProc,(void *)ads_ps, &value, 4, NULL);    //写内存

    0x04:

    最后来一个效果图, 希望这个教程会帮助大家学习


    0x05:

    下载地址: 
    PlantsVsZombies: http://pan.baidu.com/s/1kVDck5L 密码: 7ooj 
    修改器源码: http://pan.baidu.com/s/1c1HJRu4 密码: wa2n

    解压密码: 52pojie




     

    搜狗截图20161211155351.png

     

    dc459cea-58cf-4a7c-81ab-83e8a757032b.png

    展开全文
  • 顺便供上一块免费且好用的windows11修改器 点个赞留个关注吧!!! 现在应该大部分人都使用win11系统吧,不用也要强行给你更新到win11,win11其实挺好用哈,只是有一点不好用,就是右键的菜单,今天做个小程序,...

    快五一了,在这里祝大家五一快乐。顺便供上一块免费且好用的windows11修改器

    点个赞留个关注吧!!!

    现在应该大部分人都使用win11系统吧,不用也要强行给你更新到win11,win11其实挺好用哈,只是有一点不好用,就是右键的菜单,今天做个小程序,就是应该修改win11的一个应用程序

    先来看一段视频哈!

    windows11修改器

    提取码:phu3 源代码加编译后的文件

    提取码:7fl1 该程序的安装包 已被博主做成了安装包

    这款软件纯python制作,内容简单

    1、可以将win11的右键改为win10经典版,还可以进行恢复

    2、可以去掉win11右键的终端(也就是win11的最高管理员窗口)

    ,win10可没有

    3、可以修改桌面任务栏的最对齐或居中对齐

    全面的三哥功能只能在win11里操作,win10没有任何效果,接下来的功能是可以在win10 和 win11 里进行操作的

    这两个功能可以能对普通人没有太大的用哈,尤其是win10,

    【添加记事本】最高对关于编程的人来说用的很多,有的时候看到不明文件就要右键用记事本打开看看,我就是这样哈😁,所以不知道代码的这个就不要操作了,因为会占你的右键菜单位置哈

    【固定任务栏】这个对对于win10就没必要了,因为这个主要是添加应用程序到任务栏,可以快捷的操作,win10可以直接拖拽到任务栏已到达到固定的效果,win11就不一样了,win11这个必须要右键文件在菜单里找到固定到任务栏,否则是没有办法固定到任务栏的

    所以说,这个小程序就是为win11定制开发的,win10没必要,但是可以收藏一下,你们早晚要用到win11系统,以后可以用这个软件快捷操作嘛,如果遇到同事不会操作也可以用这个软件装一下😁。

    废话不多说 完整代码:

    import tkinter
    from tkinter import *
    from tkinter.ttk import *
    from PIL import Image
    import win32api,win32con
    import os
    import wmi
    import subprocess
    def main():
        root = Tk()
        root.title('剑工坊-Windongs-修改器')  # 程序的标题名称
        root.geometry("480x320+512+288")  # 窗口的大小及页面的显示位置
        root.resizable(False, False)  # 固定页面不可放大缩小
        root.iconbitmap("picture.ico")  # 程序的图标
    
        canvas = tkinter.Canvas(root, bg="#ebebeb", height=400, width=700, borderwidth=-3)  # 创建画布
        canvas.pack(side='top')  # 放置画布(为上端)
    
        canvas_4 = tkinter.Canvas(root, bg="#ebebeb", height=200, width=300, borderwidth=-2)
        canvas_4.place(x=-40, y=40)
    
        image_file_4 = tkinter.PhotoImage(file="./windwos10.png")  # 加载图片文件
        canvas_4.create_image(0, 0, anchor='nw', image=image_file_4)  # 将图片置于画布上
        def Label():
            # 标签
            tkinter.Label(canvas, bg="#ebebeb", fg='#8f8f8f', text='适配:win10、win11').place(x=350, y=290)
            w = wmi.WMI()
            for OS in w.Win32_OperatingSystem():
                windwos = 'Windows 10'
                RR = OS.Caption  # Microsoft Windows 10 家庭中文版
                if RR.find(windwos) == 10:
                    tkinter.Label(canvas, bg="#ebebeb",fg='#575757' ,text='当前版本:Windwos 10').place(x=10, y=290)
                else:
                    windwos_2 = 'Windows 11'
                    if RR.find(windwos_2) == 10:
                        tkinter.Label(canvas, bg="#ebebeb",fg='#575757' , text='当前版本:Windwos 11').place(x=10, y=290)
                    else:
                        tkinter.Label(canvas, bg="#ebebeb",fg='#575757' , text='未检测出系统版本!!').place(x=10, y=290)
    
        Label()
    
        
    
    
    
        # windwos 标志
        canvas_3 = tkinter.Canvas(root, bg="#ebebeb", height=50, width=480, borderwidth=-2)
        canvas_3.place(x=0, y=0)
        image_file_3 = tkinter.PhotoImage(file="./windows.png")  # 加载图片文件
        canvas_3.create_image(0, 0, anchor='nw', image=image_file_3)  # 将图片置于画布上
    
        # 放置二维码
        canvas_2 = tkinter.Canvas(root, bg="red", height=80, width=200, borderwidth=-2)
        canvas_2.place(x=250, y=50)
        image_file_2 = tkinter.PhotoImage(file="./share.png")  # 加载图片文件
        canvas_2.create_image(0, 0, anchor='nw', image=image_file_2)  # 将图片置于画布上
    
        def Align_left():  # 左对齐
            subprocess.Popen("reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced /v TaskbarAl /t REG_DWORD /d 0 /f", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
        def Right_align():  # 居中对齐
            subprocess.Popen("reg add HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced /v TaskbarAl /t REG_DWORD /d 1 /f", shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
        def Right_click_Add():  # 右键添加 记事本打开
            subprocess.Popen(
                "reg add HKEY_CLASSES_ROOT\*\shell\用记事本打开 /v HasLUAShield /f",
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
            subprocess.Popen(
                "reg add HKEY_CLASSES_ROOT\*\shell\用记事本打开 /v ICON /d C:/windows/system32/notepad.exe /f",
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            subprocess.Popen(
                "reg add HKEY_CLASSES_ROOT\*\shell\用记事本打开 /v SeparatorBefore /d \ /f",
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            subprocess.Popen(
                "reg add HKEY_CLASSES_ROOT\*\shell\用记事本打开 /v SeparatorAfter /d \ /f",
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            subprocess.Popen(
                "reg add HKEY_CLASSES_ROOT\*\shell\用记事本打开 /v Position /d Center /f",
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            subprocess.Popen(
                'reg add HKEY_CLASSES_ROOT\*\shell\用记事本打开\command /d "notepad.exe ""%1""" /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
        def Fixed_taskbar():   # 固定到任务栏
            subprocess.Popen(
                'reg add HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\{90AA3A4E-1CBA-4233-B8BB-535773D48449} /d "Taskband Pin" /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
    
        def Windows_Terminal():   # 去除右键(Open in Windows Terminal)项
            subprocess.Popen(
                'reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v {9F156763-7844-4DC4-B2B1-901F640F5155} /d "Windows Terminal" /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
        def default_Windows_Terminal():  # 恢复右键(Open in Windows Terminal)项
            subprocess.Popen(
                'reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v {9F156763-7844-4DC4-B2B1-901F640F5155} /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
    
        def Old_right_button():  # 右键改为win10
            subprocess.Popen(  # 恢复右键(Open in Windows Terminal)项
                'reg add HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32 /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            T = win32api.MessageBox(0, "刷新后即可显现 是否刷新", "安全窗口", win32con.MB_YESNO)
            if T == 6:  # 6表示是
                subprocess.Popen(  # 恢复右键(Open in Windows Terminal)项
                    'sihost.exe',
                    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        def New_right_button():   # 右键改为win11
            subprocess.Popen(  # 恢复右键(Open in Windows Terminal)项
                'reg delete HKCU\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2} /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            T = win32api.MessageBox(0, "刷新后即可显现 是否刷新", "安全窗口", win32con.MB_YESNO)
            if T == 6:  # 6表示是
                subprocess.Popen(  # 恢复右键(Open in Windows Terminal)项
                    'sihost.exe',
                    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
        def default_fiel():   # 恢复默认
            subprocess.Popen(   # 恢复记事本
                'reg delete HKEY_CLASSES_ROOT\*\shell\用记事本打开 /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            subprocess.Popen(  # 恢复固定到任务栏
                'reg delete HKEY_CLASSES_ROOT\*\shellex\ContextMenuHandlers\{90AA3A4E-1CBA-4233-B8BB-535773D48449} /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            subprocess.Popen(   # 恢复右键(Open in Windows Terminal)项
                'reg delete "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Blocked" /v {9F156763-7844-4DC4-B2B1-901F640F5155} /f',
                shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
            Right_align()  # 任务栏居中
            New_right_button()   # 右键改为win11
            T = win32api.MessageBox(0, "刷新后即可恢复 是否刷新", "安全窗口", win32con.MB_YESNO)
            if T == 6:  # 6表示是
                subprocess.Popen(  # 恢复右键(Open in Windows Terminal)项
                    'sihost.exe',
                    shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    
    
    
        Button(root, text='任务栏左对齐',width=14,   command=Align_left).place(x=238, y=130)
        Button(root, text='任务栏居中对齐',width=14, command=Right_align).place(x=356, y=130)
    
        Button(root, text='右键添加(用记事本打开)',width=31, command=Right_click_Add).place(x=238, y=160)
        Button(root, text='右键添加(固定任务栏)',width=31, command=Fixed_taskbar).place(x=238, y=190)
    
        Button(root, text='去除右键的(Open in Windows Terminal)项', width=44, command=Windows_Terminal).place(x=90, y=220)
        Button(root, text='右键改为经典win10',width=44, command=Old_right_button).place(x=90, y=250)
        Button(root, text='恢复\n 全\n默认', width=7, command=default_fiel).place(x=410, y=220)
        Button(root, text='恢复终端', width=10, command=default_Windows_Terminal).place(x=10, y=220)
        Button(root, text='恢复win11', width=10, command=New_right_button).place(x=10, y=250)
    
        root.mainloop() #运行
    
    if __name__ == '__main__':
        main()
    
    
    展开全文
  • 如何制作游戏修改器.docx
  • 此工具可以改变installshield制作的安装包的皮肤, 在installshield2010环境下亲测通过,并且可以制作成皮肤文件,供发布包时选择应用的皮肤。 压缩包内附有详细的说明和脚本文件。
  • 易语言取CE修改器脚本源码
  • 在平时玩游戏的过程中,大家肯定会接触过形形色色的修改,特别是看到一些高手出的某某全能修,x项修改器,煞是羡慕,其实制作这样写一个这样的修改器一点也不神秘,好了,请各位看官一同随我去揭开修改器之谜.........
  • C#游戏辅助制作教程-通用修改器源码-抓取内存基址,适合C#初学者,从培养兴趣爱好开始。。
  • 如何利用VB制作游戏修改器.docx
  • 易语言制作网络游戏内存搜索修改器内附源码。
  • 怎么制作游戏修改器,适合初学者.docx
  • 可以根据你的需要制作专用的游戏修改程序,支持指针和汇编修改操作!
  • CE修改器(Cheat Engine)是一款内存修改编辑工具,CE允许你修改游戏。它包括16进制编辑,反汇编程序,内存查找工具。与同类修改工具相比,它具有强大的反汇编功能,且自身附带了辅助工具制作工具,可以用它直接生成...
  • 制作.rpgsave存档修改器

    万次阅读 2020-12-12 22:47:45
    解码成json字符串: base64字符串 -> json字符串 -> json对象 修改rpgsave存档.html 修改rpgsave存档 将文件拖到此处,或点击上传 原文: 解码: 金钱 = 1"> 姓名 等级 生命 魔力 攻击 魔攻 ...

    1. 桌面右键,新建文本文档,文件名任意,后缀改为.html

    2. 文档右键,编辑,复制代码到文档里

    3. 双击打开html页面

    直接下载(蓝奏云)

    存档本身是一个json对象,
    默认的加密就是使用 LZString.compressToBase64 方法,编码json字符串:
    json对象 ->
    json字符串 -> base64字符串

    使用时再用 LZString.decompressFromBase64 方法,解码成json字符串:
    base64字符串 -> json字符串 -> json对象

     

    修改rpgsave存档.html

    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    	<meta name="author" content="hlmio 2020-12-13">
        <title>修改rpgsave存档</title>
    
        <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
        <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/theme-chalk/index.css">
        <script src="https://cdn.jsdelivr.net/npm/element-ui@2.14.1/lib/index.min.js"></script>
        <script async src="https://cdn.jsdelivr.net/npm/lz-string@1.4.4/libs/lz-string.min.js"></script>
        <script async src="https://cdn.jsdelivr.net/npm/file-saver@2.0.5/dist/FileSaver.min.js"></script>
    </head>
    <body>
        <div id="app">
            <el-row :gutter="10">
                <el-col :xs="24" :sm="10" style="margin-top: 50px;">
                    <div style="display: flex; flex-direction: column; align-items: center;">
                        <!-- (1) 选取文件 -->
                        <div>
                            <el-upload
                                class="upload-demo"
                                drag
                                :auto-upload="1==2"
                                :on-change="upload"
                                :on-preview="clickFile"
                                action="#"
                                >
                                <i class="el-icon-upload"></i>
                                <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                            </el-upload>
                        </div>
    
                        <!-- (2) 加密内容 -->
                        <div style="margin-top: 50px;">
                            <el-input v-model="加密内容" placeholder="未读取文件">
                                <template slot="prepend">原文:</template>
                                <el-button slot="append"  v-on:click="ctrl_c(加密内容)" icon="el-icon-document-copy"></el-button>
                            </el-input>
                        </div>
    
                        <!-- (3) 加密按钮 -->
                        <div style="margin-top: 15px;">
                            <el-button v-on:click="decodeText_to_encodeText" icon="el-icon-upload2"></el-button>
                        </div>
    
                        <!-- (4) 解密内容 -->
                        <div style="margin-top: 15px;">
                            <el-input v-model="解密内容" placeholder="请输入内容">
                                <template slot="prepend">解码:</template>
                                <el-button slot="append" v-on:click="ctrl_c(解密内容)" icon="el-icon-document-copy"></el-button>
                            </el-input>
                        </div>
    
                    </div>
                </el-col>
    
                <el-col :xs="24" :sm="13" style="margin-top: 40px;">
                    <div style="display: flex; flex-direction: column; align-items: center;">
                        <!-- (5) json内容 -->
                        <div style="margin-top: 15px; width: 90%;">
                            <el-input type="textarea" v-model="json内容" placeholder="请输入内容" :rows="18">
                            </el-input>
                        </div>
    
                        <!-- (6) 转换按钮 -->
                        <div style="margin-top: 15px;">
                            <el-button v-on:click="change_and_encode_and_save(json内容)" icon="el-icon-download"></el-button>
                            <el-button v-on:click="change_and_encode_and_ctrlC(json内容)"  type="primary"  icon="el-icon-check"></el-button>
                            <el-button v-on:click="ctrl_c(json内容)" icon="el-icon-document-copy"></el-button>
                        </div>
                    </div>
                </el-col>
            </el-row>
            
            <el-row style="margin-top: 50px;">
                <!--左占位--><el-col :xs="3" :sm="8">&nbsp;</el-col>
                <el-col :xs="18" :sm="8" style="margin-top: 10px;">
                    <el-input v-model.number="金钱" type="number" placeholder="未读取">
                        <template slot="prepend">金钱</template>
                    </el-input>
                </el-col>
                <!--右占位--><el-col :xs="3" :sm="8">&nbsp;</el-col>
            </el-row>
    
            <el-row style="margin-top: 15px;">
                <template v-for="(角色,index) in 角色列表" v-if="index >= 1">
                    <!--左占位--><el-col :xs="3" :sm="1">&nbsp;</el-col>
                    <el-col :xs="18" :sm="6" style="margin-top: 15px;">
                        <div>
                            <el-input v-model="角色['_name']" placeholder="未读取">
                                <template slot="prepend">姓名</template>
                            </el-input>
                            <el-input v-model.number="角色['_level']" type="number" placeholder="未读取" style="margin-top: 10px;">
                                <template slot="prepend">等级</template>
                            </el-input>
                            <el-input v-model.number="角色['_paramPlus']['@a'][0]" type="number" placeholder="未读取">
                                <template slot="prepend">生命</template>
                            </el-input>
                            <el-input v-model.number="角色['_paramPlus']['@a'][1]" type="number" placeholder="未读取">
                                <template slot="prepend">魔力</template>
                            </el-input>
                            <el-input v-model.number="角色['_paramPlus']['@a'][2]" type="number" placeholder="未读取" style="margin-top: 5px;">
                                <template slot="prepend">攻击</template>
                            </el-input>
                            <el-input v-model.number="角色['_paramPlus']['@a'][4]" type="number" placeholder="未读取">
                                <template slot="prepend">魔攻</template>
                            </el-input>
                            <el-input v-model.number="角色['_paramPlus']['@a'][6]" type="number" placeholder="未读取">
                                <template slot="prepend">敏捷</template>
                            </el-input>
                        </div>
                    </el-col>
                    <!--右占位-->
                    <el-col :xs="3" :sm="1" style="margin-top: 10px; visibility: hidden">
                        <el-input placeholder="未读取">
                            <template slot="prepend">占位</template>
                        </el-input>
                    </el-col>
                </template>
            </el-row>
    
            <el-row style="margin-top: 15px;">
                <el-col :xs="24" :sm="24" style="margin-top: 15px;">
                    <div style="display: flex; justify-content: center;">
                        <el-button v-on:click="change_and_encode_and_save(json对象)" icon="el-icon-download"></el-button>
                        <el-button v-on:click="change_and_encode_and_ctrlC(json对象)"  type="primary"  icon="el-icon-check"></el-button>
                    </div>
                </el-col>
            </el-row>
    
            <el-row>
                <el-col :xs="20" :sm="6" style="margin-top: 50px;">
                </el-col>
            </el-row>
    
            <el-backtop></el-backtop>
        </div>
    
    
        <script>
            var app = new Vue({
                el: '#app',
                data: {
                    文件路径: null,
                    加密内容: null,
                    解密内容: null,
                    json内容: null,
                    json对象: {},
    
                    角色列表: []
                },
                computed: {
                    金钱: {
                        get: function () {     
                            try {
                                var _ = this.json对象["party"]["_gold"]
                            } catch (error) {
                                console.log(error)
                                _ = "未取到值"
                            }
                            return _
                        },
                        set: function (value){
                            try {
                                this.json对象["party"]["_gold"] = value
                            } catch (error) {
                                console.log(error)
                            }
                        }
                    }
                },
                watch: {
                    加密内容(新值, 旧值) {
                        this.解密内容 = this.读取解密内容(新值)
                    },
                    解密内容(新值, 旧值) {
                        this.json内容 = this.读取json内容(新值)
                    },
                    json内容(新值, 旧值) {
                        this.json对象 = this.to_json_obj(新值)
                        try {
                            this.角色列表 = this.json对象["actors"]["_data"]["@a"]
                        } catch (error) {
                            console.log(error)
                            this.角色列表 = []
                        }
                    }
                },
                methods: {
                    // (1)
                    upload: function (file, fileList) {
                        this.文件路径 = file.name
                        file.文件路径 =  this.文件路径
                        this.读取加密内容(file.raw)
                    },
                    clickFile: function (file) {
                        this.读取加密内容(file.raw)
                        this.文件路径 = file.文件路径 
                    },
    
                    // (2)
                    读取加密内容: function (file) {
                        var _this = this
                        var reader = new FileReader()
                        reader.readAsText(file)
                        reader.onload = function(){
                            _this.加密内容 = this.result
                        }
                    },
                    
                    // (3)
                    decodeText_to_encodeText: function () {
                        this.加密内容 = this.encode(this.解密内容)
                        this.ctrl_c(this.加密内容)
                    },
    
                    // (4)
                    读取解密内容: function (加密内容) {
                        return this.decode(加密内容)
                    },
    
                    // (5)
                    读取json内容: function (解密内容) {
                        return JSON.stringify(JSON.parse(解密内容),null,2)
                    },
    
                    // (6)
                    change_and_encode_and_save: function (obj) {
                        this.change_and_encode(obj)
                        this.save(this.加密内容, this.文件路径)
                    },
                    change_and_encode_and_ctrlC: function (obj) {
                        this.change_and_encode(obj)
                        this.ctrl_c(this.加密内容)
                    },
    
    
    
                    // ------------ 辅助方法 ------------
    
                    change_and_encode: function (obj) {
                        let _ = this.to_json_str(obj)
                        this.加密内容 = this.encode(_)
                    },
    
                    ctrl_c: function (text) {
                        this.copyText(text)
                        this.$message('已复制');
                    },
    
    
                    // ------------ 工具方法 ------------
    
                    to_json_obj: function (obj) {
                        return JSON.parse(obj)
                    },
                    to_json_str: function (obj) {
                        if(typeof(obj) == "string"){
                            return JSON.stringify(JSON.parse(obj))
                        }
                        return JSON.stringify(obj)
                    },
                    encode: function (text) {
                        return LZString.compressToBase64(text)
                    },
                    decode: function (text) {
                        return LZString.decompressFromBase64(text)
                    },
                    save: function (text, 文件名 = "a1.txt") {
                        let pos = 文件名.lastIndexOf("/")
                        文件名 = 文件名.substring(pos+1)
                        var file = new File([text], 文件名, { type: "text/plain;charset=utf-8" })
                        saveAs(file)
                    },
    
    
                    // 复制的方法
                    copyText: function(text, callback){ // text: 要复制的内容, callback: 回调
                        var tag = document.createElement('input');
                        tag.setAttribute('id', 'cp_hgz_input');
                        tag.value = text;
                        document.getElementsByTagName('body')[0].appendChild(tag);
                        document.getElementById('cp_hgz_input').select();
                        document.execCommand('copy');
                        document.getElementById('cp_hgz_input').remove();
                        if(callback) {callback(text)}
                    }
                }
            })
        </script>
    </body>
    </html>

    代码里没写多少修改项,这个网站比较全

    https://www.saveeditonline.com/

    展开全文
  • VB制作植物大战僵尸修改器 Private Sub Command1_Click() Dim hwd As Long Dim phandle As Long Dim address As Long Dim a As Long a = Text1 hwd = FindWindow(vbNullString, "PlantsVsZombies.exe") ...
  • MagicEXIF元数据编辑器(EXIF修改器)在提供强大的修改功能的同时,MagicEXIF 可以最大限度保证图像的原始性,保证修改后的图像结构不被破坏,并且修改过后的图像与操作系统完全兼容。它还全面支持中文编码和Unicode...
  • 易语言制作的CE工具,没有代码,但是很好用,非常好用
  • Res资源文件修改器

    2016-09-07 09:41:13
    制作PE系统时修改系统相关设置用工具,
  • GG修改器正版

    千次阅读 2020-12-30 16:00:19
    GG修改器正版是一款模拟游戏的辅助游戏,在这个修改器中我们可以尽情的使用模拟各种辅助游戏的方式,让我们可以在游戏中得到更多的游戏帮助,操作简单,并且包含了大量的游戏辅助能力,是一款非常好用的游戏辅助。...
  • RPG修改器制作教程

    2010-11-07 13:26:09
    详细的制作教学过程 能尽快掌握制作修改器~

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 185,909
精华内容 74,363
关键字:

怎样制作修改器