7.破解的最简单例子

书上分析的那些东西,我手里没有相关PE文件,我就自己随便写一个最简单的,然后来破解下吧(代码我最后公布):

先双击运行下,发现是这个样子:

 

OK 看到的是 MessageInt.NO,点击确定之后,程序就退出了。到底是个啥,当然此时我们也不知道,直接先定位到这个字符串附近,看看代码啥意思:

双击

然后突然觉得应该是搜索MessageBoxW才对,这样如果上层是if判断实处NO或者YES啥的也方便看,结果:

发现只有一次调用。而且之前字符串查找的时候也只发现一个MessageInt.NO没有发现什么别的YES啥的字符串,其实这个地方是我的问题,我不是说自己写的Demo然后分析吗,我开了优化,自动把代码优化掉了。最后看我C++代码就知道啦。所以这个地方把优化全都关闭了,或者VS的直接Debug生成程序。然后再分析:

直接查函数调用

 

OK是两个,点进去看下:

jnz 如果不相等,直接跳转到013B1758执行,否则执行继续执行下一行。OK第一反应是直接把这个jnz改成je或者jz就好了。看看效果:

 

在汇编代码区域右键,复制可执行文件。然后点击保存,生成XXX.exe文件,双击XXX的EXE文件看效果:

OK 破解成功了。其实分析那块汇编部分破解方式还有很多种,比如:

分析完是这样,我都写在注释里了。

可以用IDA看一下:

继续IDA按F5反编译:

 

额...看到的是这么个东西。好吧。

然后我修订了0x1234+0x5678的正确值

继续执行,发现输出YES。保存文件之后,重新点击PE文件是破解了的。

IDA看下发现其实比较的地方那个值已经修改了:

还有其他的破解方式,大家自己探索吧,我把源代码贴到下面(很简单,经过上面也都看出来了)VS2015 C++

#include "stdafx.h"
#include <iostream>
#include <windows.h>
using namespace std;
int main(){
	DWORD dwNumber1 = 0x1234;
	DWORD dwNumber2 = 0x5678;
	if (dwNumber1 + dwNumber2 == 0x1234) {
		MessageBox(NULL ,L"MessageInt.YES" , L"Title", NULL);
	}
	else {
		MessageBox(NULL, L"MessageInt.NO", L"Title", NULL);
	}
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值