版权声明:

  • 本文原创发布于博客园"优梦创客"的博客空间(网址:http://www.cnblogs.com/raymondking123/)以及微信公众号"优梦创客"
  • 您可以自由转载,但必须加入完整的版权声明!

内存扫描

使用Cheat Engine这款软件对扫雷的进程的内存进行扫描。查找与游戏获胜相关的内存区域。

扫描结果如下:

<?xml version="1.0" encoding="utf-8"?>
<CheatTable CheatEngineTableVersion="26">
<CheatEntries>
<CheatEntry>
<ID>0</ID>
<Description>"棋盘首地址"</Description>
<LastState Value="15" RealAddress="01005361"/>
<VariableType>Byte</VariableType>
<Address>扫雷.exe+5361</Address>
</CheatEntry>
<CheatEntry>
<ID>1</ID>
<Description>"玩家未确定的地雷数"</Description>
<LastState Value="10" RealAddress="01005194"/>
<VariableType>Byte</VariableType>
<Address>扫雷.exe+5194</Address>
</CheatEntry>
</CheatEntries>
<UserdefinedSymbols/>
</CheatTable>

代码跟踪

使用x32dbg工具调试扫雷的进程,追踪扫雷代码。发现扫雷的判断条件是内存0x010057A4和0x010057A0值是否相等。

判定代码在代码段的0x0100359c区域。

破解

获取扫雷窗口句柄

获取扫雷进程号

获取扫雷进程句柄

修改代码段内存的保护属性

修改判定代码

详细代码

Injection.h

#pragma once

#include <string>
#include <Windows.h>
//#define ___DEBUG
class Injection
{
public:
Injection(const char*);
bool Init();
bool DoInjection();
void UnInit();
private:
std::wstring className;
HWND hw;
DWORD pid;
HANDLE hp;
SIZE_T wr;
};

Injection.cpp

#include "stdafx.h"
#include "Injection.h"
#include <comutil.h>
#pragma comment(lib, "comsuppw.lib") Injection::Injection(const char * className)
:hw(0), pid(0), hp(0), wr(0)
{
_bstr_t tmp = className;
this->className = (wchar_t*)tmp;
} bool Injection::Init()
{
hw = FindWindow(this->className.c_str(), NULL);
if (hw) printf("找到目标进程窗口,窗口句柄:%X\n", hw);
else return false; GetWindowThreadProcessId(hw, &pid);
if(pid) printf("成功获取目标进程号:%d\n", pid);
else return false; hp = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
if (hp) printf("成功获取目标进程句柄:%X\n", hp);
else return false; return true;
}
// 0x010057A4
// 0x010057A0 // 0x0100359c
bool Injection::DoInjection()
{
#ifndef ___DEBUG
if (VirtualProtectEx(hp, (int*)0x0100359c, 5, PAGE_EXECUTE_READWRITE, &wr))
printf("成功修改代码段内存保护属性\n");
else return false;
// mov eax, dword ptr ds : [0x010057A0]
char a[] = { 0xA1, 0xA0, 0x57, 0x00, 0x01 };
if (WriteProcessMemory(hp, (int*)0x0100359c, a, 5, &wr))
printf("成功修改内存\n");
else return false;
#endif
return true;
} void Injection::UnInit()
{
CloseHandle(hp);
}

main.cpp

#include"Injection.h"

void main(int argc, char *argv[])
{
#ifndef ___DEBUG
if (!argc)
return;
Injection inj(argv[1]);
#else
Injection inj("扫雷");
#endif // !1
if (inj.Init()) printf("Init Success!\n");
else return;
inj.DoInjection();
inj.UnInit();
}

C++基础之:扫雷破解的更多相关文章

  1. mysql数据库( 基础篇加破解)

    1.数据库(Database,DB)是按照数据结构来组织.存储和管理数据的,并且是建立在计算机存储设备上的仓库 2.什么是数据库:(用来存储数据的仓库) 数据库:(cs架构套接字) 数据库管理软件分类 ...

  2. 搭建自己私有的PKM系统,各家PKM大比拼。。附:构建自己熟悉的基础Docker,破解联通光猫

    Docker这容器真是很好玩!干啥都想上docker了,快疯了. 这不,最近wiz笔记开始收费,很是不爽,需要寻求新的PKM系统了.备选及落选理由如下: wiz笔记 -- 好用,顺手.要开始收费了,不 ...

  3. elasticsearch6.8.1 x-pack插件破解

    一.为什么要破解x-pack?       因为涉及到了ES服务的安全性.ES服务如果被劫持,数据直接会被删除.ES登录账号和密码的设置是通过x-pack来实现的,官方只给了免费的30天的使用权,而且 ...

  4. 无线网络WPA加密算法基础

    2013-11-13 23:08 (分类:网络安全) 对无线没什么认识,总听说有人蹭网,还有卖蹭网器的,于是补充一下知识. 无线加密有两类:WEP WAP,目前采用WEP加密的非常少了,WEP应该只是 ...

  5. DVWA靶场练习-暴力破解

    一.暴力破解 (Brute Force)    暴力破解是Web安全领域的一个基础技能,破解方法论为:构建常见用户名及弱口令 因此需要好的字典,对应破解场景构建特定的用户名密码,以及还需要具有灵活编写 ...

  6. 使用Dbvisualizer 连接 Elasticsearch

    Dbvisualizer 安装 从网上下载该软件,并破解激活 下载地址:http://www.ddooo.com/softdown/142713.htm 1.下载解压,得到dbvisualizer p ...

  7. JavaSE理论篇

    将已学过的知识记录在此,既能便于以后温习又能方便知识共享,做到共同成长. 计算机语言发展简史 主要分为三个阶段 机器语言:打点机,有点表示1,没有表示0,打点计时器 低级语言:汇编语言 高级语言:Ja ...

  8. [基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习

    1.基础知识 刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是非常缓慢的,所以有人想出一种办法,直接建立出一个数据文件,里面事先 ...

  9. windbg 基础命令实战 - 简单程序破解

    以前玩游戏遇到一些实在过不去的管卡,经常会找一些游戏修改软件来修改游戏,让自己变得无比强大,将boss一路砍瓜切菜过足游戏瘾.其实游戏修改软件的功能大多都比较简单,我们可以通过windbg的一些简单命 ...

随机推荐

  1. MySQL主从、主主、半同步节点架构的的原理及实验总结

    一.原理及概念: MySQL 主从复制概念 MySQL 主从复制是指数据可以从一个MySQL数据库服务器主节点复制到一个或多个从节点.MySQL 默认采用异步复制方式,这样从节点不用一直访问主服务器来 ...

  2. Java多线程(六):wait(),notify()和notifyAll()

    wait(),notify()和notifyAll()介绍 1.wait() 使当前线程等待,直到另一个线程调用notify(),notifyAll()或者中断,当前线程调用wait()之前必须持有锁 ...

  3. git rebase VS git merge? 更优雅的 git 合并方式值得拥有

    写在前面 如果你不能很好的应用 Git,那么这里为你提供一个非常棒的 Git 在线练习工具 Git Online ,你可以更直观的看到你所使用的命令会产生什么效果 另外,你在使用 Git 合并分支时只 ...

  4. java Springboot 生成 二维码 +logo

    上码,如有问题或者优化,劳请广友下方留言 1.工具类 import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHint ...

  5. C语言指针专题——如何理解指针

    本文为原创,欢迎转发! 最近在研读C primer plus 5版中文版,老外写的,还是很经典的,推荐给读者们,有需要的朋友可以在这里购买:C primer plus 5版中文版 指针,传说中是C语言 ...

  6. mplayer+ffmpeg 组合截图

    mplayer截图的优点:对于一个时长很长的视频,可以任意指定一个时间点截图,mplayer会直接跳到这个时间点开始解码截图: 缺点:由于是直接跳到指定的时间点,也就是直接跳过了之前的帧,这样解码出来 ...

  7. ServiceFabric极简文档-3. 发布脚本

    web: Trap { Write-Host $_.Exception.Message; Continue }; Connect-ServiceFabricCluster Remove-Service ...

  8. Learning the Depths of Moving People by Watching Frozen

    基于双目的传统算法 对静止的物体, 在不同的 viewpoints 同一时刻进行拍摄, 根据拍摄到的结果, 使用三角测量算法计算出平面 2D 图像在 3D 图像中的坐标 单目 Ground Truth ...

  9. redis分布式锁的问题和解决

    分布式锁 在分布式环境中,为了保证业务数据的正常访问,防止出现重复请求的问题,会使用分布式锁来阻拦后续请求.具体伪代码如下: public void doSomething(String userId ...

  10. php 自己封装一个调用第三方接口的函数

    ①在php.ini中开启php_curl扩展(必须开启) ②建议在php.ini中开启php_openssl扩展(本身不是curl必须的,是调用一些第三方接口需要的 ③如果以上操作重启apache后, ...