破解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数据库适用于那些对速度和可扩展性比较看重的那些不相关的,不确定和不断发展的需求. 总所周知,网页的加载速度跟图片是有很大的关系的,因 ...
随机推荐
- linux 挂载(转载)
From:http://forum.ubuntu.org.cn/viewtopic.php?t=257333 用linux,就一定要用linux的方式去思维.嗯,说的容易做起来难.我的D盘哪去了?恐怕 ...
- Java Volatile相关文章目录
参考资料: http://www.google.com/cse?sa.x=0&sa.y=0&cx=010284515138798138769%3Aajbqkpwaapm&ie= ...
- Enumerator yielder.yield 与 Proc.yield 区别
最近看ruby cookbook遇到这个用法,google一下,这里原文解释 http://stackoverflow.com/questions/18865860/enumerator-yielde ...
- CyclicBarrier
用于多线程计算数据,最后合并计算结果的应用场景 CyclicBarrier 的字面意思是可循环使用(Cyclic)的屏障(Barrier) 它要做的事情是,让一组线程到达一个屏障(也可以叫同步点)时被 ...
- [SQL]SQL中把一个字段的数据分多行显示
其实你完全可以写个自定义函数就OK了 . =================================================================== create func ...
- SQL(Oracle)
http://blog.csdn.net/winter13292/article/details/7011377 SQL 对大小写不敏感! 在 SQL 中增加 HAVING 子句原因是,WHERE ...
- onmousemove和onmouseout事件的调用,和js使用双引号、单引号的时候应该注意的问题
使用js的时候,统一使用双引号,然后通过反斜杠进行转义 ①如果同时使用单引号.和双引号的情况下容易出现问题,导致标签中表示的事件不能调用, ②导致由于标签没有封口而出现样式布局错误 <!DOCT ...
- Win2008远程多用户登陆的配置方法 另附详细设置: Windows server 2008 R2实现多用户远程连接
Win2008远程多用户登陆的配置方法 在使用Windows 2008远程登录功能时,如果需要进行多用户登录,可以采用以下配置方法: 首先要启用远程桌面这一功能:右击“我的电脑”→ 属性 → ...
- C#将C++动态库的回调函数封装成事件
关于C#调用C++动态库的文章很多,调用动态库中回调函数的方法也不在少数.但大多数调用回调函数的方法依然保留了C++的语法特点. 比如有一段C++的回调函数代码,为了表达它的意思,我把注释也粘贴了进来 ...
- easyui combo下拉框多选框
按照自己的方式,先晒下效果图: 选一个值,那么就在input里面显示一个,去掉勾选,那么input就会少一个 其实做法很简单,今天就是快下班了,闲着没事加篇博客而已,下面带上代码. 1.页面的展示,i ...