破解Demo
需要破解的程序界面如下:
需要破解的程序的主要代码如下:
void CEasyCrackMeDlg::OnBnClickedButtonOk()
{
// TODO: 在此添加控件通知处理程序代码
TCHAR szID[MAXBYTE] = {};
TCHAR szPassword[MAXBYTE] = {};
TCHAR szTempPassword[MAXBYTE] = {}; GetDlgItemText(IDC_EDIT_ID, szID, MAXBYTE);
GetDlgItemText(IDC_EDIT_PASSWORD, szPassword, MAXBYTE); if (lstrlen(szID) == )
{
return;
} if (lstrlen(szPassword) == )
{
return;
} if (lstrlen(szID) < )
{
return;
} for (int i = ; i < lstrlen(szID); i++)
{
if (szID[i] == _T('Z') || szID[i] == _T('z') || szID[i] == _T(''))
{
szTempPassword[i] = szID[i];
}
else
{
szTempPassword[i] = szID[i] + ;
}
} if (lstrcmp(szTempPassword, szPassword) == )
{
AfxMessageBox(_T("密码正确"));
}
else
{
AfxMessageBox(_T("密码错误"));
}
} void CEasyCrackMeDlg::OnBnClickedButtonCancel()
{
// TODO: 在此添加控件通知处理程序代码
OnCancel();
}
需要破解的程序的下载地址:
http://pan.baidu.com/s/1jG2ZV06
一、文件补丁
用OD打开上面的程序,下断点:bp lstrcmpW,运行到断点处后跳出该程序,会看到判断的地方JNZ(代码为75h),把它修改为JZ(代码为74h)即可,该行对应的地址为内存中的虚拟地址VA,转换成FileOffset后修改75h为74h即可。
文件补丁的具体代码如下:
#include <Windows.h>
#include <iostream> using namespace std; int main(int argc, char **argv)
{
DWORD dwFileOffset = ; #ifdef _DEBUG
dwFileOffset = 0x00001FED;
#else
dwFileOffset = 0x00000828;
#endif BYTE bCode = ;
DWORD dwReadNum = ; if (argc != )
{
cout << "Please input two argument!" << endl;
return -;
} DWORD dwErr = ; //打开文件
HANDLE hFile = CreateFile(argv[], GENERIC_WRITE | GENERIC_READ, FILE_SHARE_WRITE | FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE == hFile)
{
dwErr = GetLastError();
cout << __LINE__ << " : CreateFile error ( " << dwErr << " )" <<endl;
return -;
} if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, dwFileOffset, NULL, FILE_BEGIN))
{
dwErr = GetLastError();
cout << __LINE__ << " : SetFilePointer error ( " << dwErr << " )" <<endl;
return -;
} if ( == ReadFile(hFile, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum, NULL))
{
dwErr = GetLastError();
cout << __LINE__ << " : ReadFile error ( " << dwErr << " )" <<endl;
return -;
} //比较当前位置是否为JNZ
if (TEXT('\x75') != bCode)
{
cout << bCode << endl;
CloseHandle(hFile);
return -;
} //修改为JZ
bCode = TEXT('\x74');
if (INVALID_SET_FILE_POINTER == SetFilePointer(hFile, dwFileOffset, , FILE_BEGIN))
{
dwErr = GetLastError();
cout << __LINE__ << " : SetFilePointer error ( " << dwErr << " )" <<endl;
CloseHandle(hFile);
return -;
} if ( == WriteFile(hFile, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum, NULL))
{
dwErr = GetLastError();
cout << __LINE__ << " : WriteFile error ( " << dwErr << " )" <<endl;
CloseHandle(hFile);
return -;
} cout << "Write JZ is Successfully !" << endl; CloseHandle(hFile); //运行修改后的程序
//int iLen = WideCharToMultiByte(CP_ACP, 0, argv[1], -1, NULL, 0, NULL, NULL);
//char *pszFileName = new char[iLen];
//WideCharToMultiByte(CP_ACP, 0, argv[1], -1, pszFileName, iLen, NULL, NULL);
//WinExec(pszFileName, SW_SHOW);
//delete[] pszFileName;
WinExec(argv[], SW_SHOW); return ;
}
这里把上面需要破解的程序拖到文件补丁上打开即可破解。
二、内存补丁
具体方法同上面的文件补丁,只是不需要做VA到FileOffset的转换。
具体代码如下:
#include <Windows.h>
#include <iostream> using namespace std; int main(int argc, char **argv)
{
DWORD dwVAddress = ;
#ifdef _DEBUG
dwVAddress = 0x01262BED;
#else
dwVAddress = 0x01011428;
#endif
BYTE bCode = ;
DWORD dwReadNum = ;
DWORD dwErr = ; if (argc != )
{
cout << "Please input two argument!" <<endl;
return -;
} STARTUPINFO si = {};
si.cb = sizeof(STARTUPINFO);
si.wShowWindow = SW_SHOW;
si.dwFlags = STARTF_USESHOWWINDOW; PROCESS_INFORMATION pi = {}; BOOL bRet = CreateProcess(argv[], NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
if (FALSE == bRet)
{
dwErr = GetLastError();
cout << __LINE__ << " : CreateProcess Error ( " << dwErr << " )" << endl;
return -;
} ReadProcessMemory(pi.hProcess, (LPVOID)dwVAddress, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum); //判断是否为JNZ
if (TEXT('\x75') != bCode)
{
dwErr = GetLastError();
cout << bCode << endl;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
return -;
} //将JNZ修改为JZ
bCode = TEXT('\x74');
WriteProcessMemory(pi.hProcess, (LPVOID)dwVAddress, (LPVOID)&bCode, sizeof(BYTE), &dwReadNum); ResumeThread(pi.hThread); CloseHandle(pi.hThread);
CloseHandle(pi.hProcess); cout << "Write JZ is Successfully !" << endl; return ;
}
破解Demo的更多相关文章
- 学习笔记:暴力破解WIFI小软件
小弟 自己的学习笔记,做练习的 ,缺陷还很多,做到无法解决速度问题就不想做下去了,如果要看的话 主要是思路问题,获取句柄,控制句柄而已,代码比较简单.大神勿喷啊 破解DEMO源码:http://dow ...
- C# 反编译破解软件方法
我们有时在使用一些小工具软件时,会提示购买License(注册码之类的东东)后才能正常使用.在这里我们来尝试直接绕过License验证直接使用软件,实现简单的软件破解. 主要实现方式: 通过反编译工具 ...
- 微信web开发者工具、破解文件、开发文档和开发Demo下载
关注,QQ群,微信应用号社区 511389428 下载: Win: https://pan.baidu.com/s/1bHJGEa Mac: https://pan.baidu.com/s/1slhD ...
- Java 多线程 破解密码 demo
功能要求: 具体类: Decrypt 测试类,用来启动破解和日志线程 DecryptThread 破解线程类,用来生成测试的字符串,并暴力破解 LogThread 日志类,将输出每次生成的字符串结果 ...
- 破解 jeb 2.3.7 demo
前言 使用的技术和上文的一样. mips 版本的修改版 修改版: https://gitee.com/hac425/jeb-mips 正文 安卓版 jeb-2.3.7.201710262129-JEB ...
- 【腾讯Bugly干货分享】移动App入侵与逆向破解技术-iOS篇
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e0acc896e9ebb6865f321 如果您有耐心看完这篇文章,您将懂 ...
- Android动态方式破解apk终极篇(加固apk破解方式)
一.前言 今天总算迎来了破解系列的最后一篇文章了,之前的两篇文章分别为: 第一篇:如何使用Eclipse动态调试smali源码 第二篇:如何使用IDA动态调试SO文件 现在要说的就是最后一篇了,如何应 ...
- Android动态方式破解apk前奏篇(Eclipse动态调试smail源码)
一.前言 今天我们开始apk破解的另外一种方式:动态代码调试破解,之前其实已经在一篇文章中说到如何破解apk了: Android中使用静态方式破解Apk 主要采用的是静态方式,步骤也很简单,首先使用 ...
- 移动端的拖拽这个demo实现的功能
SQL数据库适合那些需求确定和对数据完整性要去严格的项目.NoSQL数据库适用于那些对速度和可扩展性比较看重的那些不相关的,不确定和不断发展的需求. 总所周知,网页的加载速度跟图片是有很大的关系的,因 ...
随机推荐
- java网络编程之TCP实例
Dgram类 package Socket; import java.net.DatagramPacket; import java.net.InetAddress; public class Dgr ...
- .NET 请求被挂起,前端轮询,委托
起因:因项目需要监控方法中计算进度,故而想通过AJAX调用,返回前端显示进度,结果开发中遇到第二个AJAX请求被挂起,需要等到第一个请求(计算)完成后,才会被处理到. 百度种种,知其原因是在Sessi ...
- Flask-SQLAlchemy 学习总结
初始化和配置 ORM(Object Relational Mapper) 对象关系映射.指将面对对象得方法映射到数据库中的关系对象中.Flask-SQLAlchemy是一个Flask扩展,能够支持多种 ...
- python实现的json数据以HTTP GET,POST,PUT,DELETE方式页面请求
一.JSON简介 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成.它基于JavaScript Programm ...
- Codeforces 119C DP
题意: 有n天,m门课和常数k; 每天上一门课,每门课程有两个属性,最少作业量a,最多作业量b,和难度c. 1<=a<=b<=1e16 c<=100 1<=n<=m ...
- [POJ 1385] Lifting the Stone (计算几何)
题目链接:http://poj.org/problem?id=1385 题目大意:给你一个多边形的点,求重心. 首先,三角形的重心: ( (x1+x2+x3)/3 , (y1+y2+y3)/3 ) 然 ...
- Hardwood Species(水)
Time Limit:10000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u SubmitStatus Descrip ...
- Js字符串与十六进制的相互转换
开发过程中,字符串与十六进.二进制之间的相互转换常常会用到,尤其是涉及到中文的加密时,就需要把中文转换为十六进制.下面说说具体的转换方法. 1.字符串转换为十六进制 主要使用 charCodeAt() ...
- JDK6的switch支持不是很好
在switch中只支持int或者枚举型值: 不支持其他类型,如String,会报错 Cannot switch on a value of type String for source level b ...
- JDBC数据更新
在JDBC中通常用Statement类的对象实现对数据库的更新(增.删.查.改)操作 //1.获取数据库连接 connection = getConnection(); //2.准备sql语句 Str ...