C++基础之:扫雷破解
版权声明:
- 本文原创发布于博客园"优梦创客"的博客空间(网址:
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++基础之:扫雷破解的更多相关文章
- mysql数据库( 基础篇加破解)
1.数据库(Database,DB)是按照数据结构来组织.存储和管理数据的,并且是建立在计算机存储设备上的仓库 2.什么是数据库:(用来存储数据的仓库) 数据库:(cs架构套接字) 数据库管理软件分类 ...
- 搭建自己私有的PKM系统,各家PKM大比拼。。附:构建自己熟悉的基础Docker,破解联通光猫
Docker这容器真是很好玩!干啥都想上docker了,快疯了. 这不,最近wiz笔记开始收费,很是不爽,需要寻求新的PKM系统了.备选及落选理由如下: wiz笔记 -- 好用,顺手.要开始收费了,不 ...
- elasticsearch6.8.1 x-pack插件破解
一.为什么要破解x-pack? 因为涉及到了ES服务的安全性.ES服务如果被劫持,数据直接会被删除.ES登录账号和密码的设置是通过x-pack来实现的,官方只给了免费的30天的使用权,而且 ...
- 无线网络WPA加密算法基础
2013-11-13 23:08 (分类:网络安全) 对无线没什么认识,总听说有人蹭网,还有卖蹭网器的,于是补充一下知识. 无线加密有两类:WEP WAP,目前采用WEP加密的非常少了,WEP应该只是 ...
- DVWA靶场练习-暴力破解
一.暴力破解 (Brute Force) 暴力破解是Web安全领域的一个基础技能,破解方法论为:构建常见用户名及弱口令 因此需要好的字典,对应破解场景构建特定的用户名密码,以及还需要具有灵活编写 ...
- 使用Dbvisualizer 连接 Elasticsearch
Dbvisualizer 安装 从网上下载该软件,并破解激活 下载地址:http://www.ddooo.com/softdown/142713.htm 1.下载解压,得到dbvisualizer p ...
- JavaSE理论篇
将已学过的知识记录在此,既能便于以后温习又能方便知识共享,做到共同成长. 计算机语言发展简史 主要分为三个阶段 机器语言:打点机,有点表示1,没有表示0,打点计时器 低级语言:汇编语言 高级语言:Ja ...
- [基础技能] 安全技术——哈希算法密码破解之彩虹表(Rainbow Table)学习
1.基础知识 刚刚学习过数字签名的相关知识,以及数字签名的伪造技术,而伪造数字签名归根结底就是密码破解的一个过程,然而直接破解的速度是非常缓慢的,所以有人想出一种办法,直接建立出一个数据文件,里面事先 ...
- windbg 基础命令实战 - 简单程序破解
以前玩游戏遇到一些实在过不去的管卡,经常会找一些游戏修改软件来修改游戏,让自己变得无比强大,将boss一路砍瓜切菜过足游戏瘾.其实游戏修改软件的功能大多都比较简单,我们可以通过windbg的一些简单命 ...
随机推荐
- c# override用法
要扩展或修改继承的方法.属性.索引器或事件的抽象实现或虚实现,必须使用 override 修饰符. 在此例中,类 Square 必须提供 Area 的重写实现,因为 Area 是从抽象的 Shapes ...
- 1. Django每日一码 之原生View源码
2019-7-4 今日源码:原生 View 1.URL中调用as_view方法 def as_view(cls, **initkwargs): """ Main ent ...
- 剑指offer第二版-7.重建二叉树
描述:输入某二叉树的前序遍历和中序遍历结果,重建该二叉树.假设前序遍历或中序遍历的结果中无重复的数字. 思路:前序遍历的第一个元素为根节点的值,据此将中序遍历数组拆分为左子树+root+右子树,前序遍 ...
- 对于Typora(markdown)的基本使用
对于刚开始使用该软件,应该在熟悉基本的markdown语法的基础上,再进行快捷键的使用! 标题 (快捷键:ctrl + 数字) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 ###### ...
- Java面试题汇总---升级版(附答案)
前几天写了Java面试题汇总---基础版,总结了面试中常见的问题及答案,那我今天基于昨天的话题做一次升级,也就是说,求职者除了要学习了解哪些常见的基础面试题之外,还得准备些什么呢? 对有工作经验的求职 ...
- 简单函数编写_strcpy、_stroverchg、_strcmp
字符串复制函数 void _strcpy(char *tar, const char * res) { char *p = tar; while(assert(tar && res), ...
- 【算法•日更•第十九期】动态规划:RMQ问题
▎前言 首先先来说一下RMB是什么,当然是人民币啦. 今天我们要学的这个东西不一般,叫做RMQ问题,那么它和RMB有什么关系呢?待小编细细说来. ▎前置技能:动态规划 不会的同志请戳这里迅速了解动态规 ...
- Git对象
上一节了解了 Git 的一个重要的概念:暂存区. 暂存区是一个介于工作区和版本库的中间状态,当执行commit时,实际上是将暂存区的内容提交大版本库中,而执行add则是将本次变更添加到暂存区. 上一节 ...
- JS浅学
(变量的名字.focus(); )让打开的新的页面获取焦点 (变量的名字.close();)关闭打开的页面 可以用(!变量名)直接判断是否打开过新的页面 用(变量名.closed)判断是不是被关闭了 ...
- [leetcode] 559. Maximum Depth of N-ary Tree (easy)
原题链接 思路: 简单bfs class Solution { public: int maxDepth(Node *root) { int depth = 0; if (root == NULL) ...