服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - 记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

2021-11-02 14:22patanka C/C++

这篇文章主要介绍了记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

作为一个搞破解、逆向的小白,第一发文,请各位大神多指教。

近期需要批量处理一些word和excel文档,开始一直用word的宏,但是发给同事用的时候同事老是不会啊。后来就想写一些VBS的脚本,让他们直接双击运行就好了。可是写VBS脚本也需要调试的呀,没有合适的工具很恼火的。于是上网找到了VBSEdit这么个工具,可是非注册版每次调试都会弹出一个提示框,等好多秒,找破解版要么版本太老,要么就是夹带私货的。于是就想自己动手试一下好了。

下载了x64dbg,启动,打开vbsedit.exe。点击Start Debugging 的按钮,弹出了注册对话框。

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

有点懵。不知从何入手。于是就各种搜啊搜啊,最后决定从找对话框开始,搜索跨模块调用,输入“dialog”,出现了五个相关的调用:

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

于是在第一项处下断点,重新跟到这里后发现是从1401087B4这一行运行来的,于是在这一行下断点。

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

再次跟进来,停下后在右下角的栈区会看到对这个的调用来自vbsedit.00000000140107C8E,再转到这个调用点。

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

然后在从这个调用点往后追溯,就这样追溯几次调用后就会找到一个貌似调用注册对话的地方:

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

就这个Call <vbsedit.#所有对话框>调用(当然后面的注释都是我跟的时候自己加的),先试试NOP掉它。

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

再次运行,注册对话框不弹了。再试了试其他功能,一切正常。成功!

同样的方法,可以把单步调试等弹注册对话框的地方都找到,同样nop掉。启动的注册对话框有一个JNE的判断,改成JE就好了。

然后就是修补文件,另存了exe。再次运行打了补丁的文件,结果一闪而过,程序运行不了啦。

原来这程序有自校验,一个字节都不能改,改了就不能正常运行。要么是没法正常退出,要么是没有语法高亮,总之各种不正常。

怎么办呢?继续破自校验? 算了,对我这个小白来说这个难度有点太大了。

考虑到用x64dbg打开直接在内存修改后可以正常运行,应该说找的爆破位置还是对的,所以如果打个内存补丁应该是可行的。

内存补丁怎么弄呢?没整过耶,于是又是搜啊搜啊,找到了用Dll劫持注入打补丁的方法。

试了试常用的version.dll,发现这个dll是可以利用的。接下来就是需要自己写一个version.dll用来劫持并打内存补丁啦。

祭出了AheadLib这个工具,选择简单的直接转发函数,生成了version.cpp。

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

然后在入口函数里加上自己打补丁的代码就好了,代码如下:(小白水平,勿喷)

#include <Windows.h>
#include <stdio.h>
 
// 导出函数
#pragma comment(linker, "/EXPORT:GetFileVersionInfoA=c:windowssystem32version.dll.GetFileVersionInfoA,@1")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoByHandle=c:windowssystem32version.dll.GetFileVersionInfoByHandle,@2")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoExA=c:windowssystem32version.dll.GetFileVersionInfoExA,@3")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoExW=c:windowssystem32version.dll.GetFileVersionInfoExW,@4")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeA=c:windowssystem32version.dll.GetFileVersionInfoSizeA,@5")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeExA=c:windowssystem32version.dll.GetFileVersionInfoSizeExA,@6")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeExW=c:windowssystem32version.dll.GetFileVersionInfoSizeExW,@7")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeW=c:windowssystem32version.dll.GetFileVersionInfoSizeW,@8")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoW=c:windowssystem32version.dll.GetFileVersionInfoW,@9")
#pragma comment(linker, "/EXPORT:VerFindFileA=c:windowssystem32version.dll.VerFindFileA,@10")
#pragma comment(linker, "/EXPORT:VerFindFileW=c:windowssystem32version.dll.VerFindFileW,@11")
#pragma comment(linker, "/EXPORT:VerInstallFileA=c:windowssystem32version.dll.VerInstallFileA,@12")
#pragma comment(linker, "/EXPORT:VerInstallFileW=c:windowssystem32version.dll.VerInstallFileW,@13")
#pragma comment(linker, "/EXPORT:VerLanguageNameA=c:windowssystem32version.dll.VerLanguageNameA,@14")
#pragma comment(linker, "/EXPORT:VerLanguageNameW=c:windowssystem32version.dll.VerLanguageNameW,@15")
#pragma comment(linker, "/EXPORT:VerQueryValueA=c:windowssystem32version.dll.VerQueryValueA,@16")
#pragma comment(linker, "/EXPORT:VerQueryValueW=c:windowssystem32version.dll.VerQueryValueW,@17")
 
 
//宏 Debug("format string",arg1,arg2,...)
//用于Debug调试信息输出,用法同 printf
#ifdef _DEBUG
#define Debug(...) DllPrintf(__VA_ARGS__) 
#else
#define Debug(...) 
#endif
 
int DllPrintf(char *fmt,...)
{
	//dll调试时打开控制台窗口显示调试信息
	//用法同printf
 
	va_list argptr;
	va_start(argptr,fmt);
	char buffer[512] ={0};
	int cnt = vsprintf_s(buffer,fmt,argptr);
	va_end(argptr);
 
	static HANDLE ghConsole = INVALID_HANDLE_VALUE;
	if(INVALID_HANDLE_VALUE == ghConsole)
	{
		AllocConsole();
		ghConsole = GetStdHandle(STD_OUTPUT_HANDLE);
	}
	DWORD dw;
	WriteConsole(ghConsole ,buffer,(DWORD)strlen(buffer),&dw,NULL);
	return cnt;
}
 
void Patch(void)
{
	DWORD dwProcessId;
	dwProcessId = GetCurrentProcessId();
 
	HANDLE hProcess;
	hProcess = OpenProcess(PROCESS_ALL_ACCESS,false,dwProcessId);
	if(hProcess == 0){
		Debug("open process error 
");
	}else
	{
		Debug("the hProcess is : %x
",(INT)hProcess);
	}
 
	LPVOID lpAddressStart,lpAddressDebug,lpAddressDebugStep;
 
	lpAddressStart=(LPVOID)0x000000014009147F;//启动注册框的爆破地址
	lpAddressDebug=(LPVOID)0x00000001400E3ED7;//debug对话框的爆破地址
	lpAddressDebugStep=(LPVOID)0x00000001400DA343;//debug step over对话框的爆破地址
 
	char je=0x74;//je指令
	SIZE_T dwNumberOfBytesRead;
	dwNumberOfBytesRead=0;
 
	if(WriteProcessMemory(hProcess,lpAddressStart,&je,sizeof(je),&dwNumberOfBytesRead))
	{
		Debug("%d byte writed,start dialog patch ok!
 ",dwNumberOfBytesRead);
	}else
	{
		Debug("read error:%d 
", GetLastError());
 
	}
 
 
	unsigned char temp[5]={0x90,0x90,0x90,0x90,0x90};
 
	if(WriteProcessMemory(hProcess,lpAddressDebug,&temp,sizeof(temp),&dwNumberOfBytesRead))
	{
		Debug("%d byte writed,debug dialog patch ok!",dwNumberOfBytesRead);
	}else
	{
		Debug("read error:%d 
", GetLastError());
 
	}
 
 
	if(WriteProcessMemory(hProcess,lpAddressDebugStep,&temp,sizeof(temp),&dwNumberOfBytesRead))
	{
		Debug("%d byte writed,debug step over dialog patch ok!",dwNumberOfBytesRead);
	}else
	{
		Debug("read error:%d 
", GetLastError());
 
	}
 
	CloseHandle(hProcess);
}
 
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		DisableThreadLibraryCalls(hModule);
 
		Patch();
 
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
	}
 
	return TRUE;
}

代码很简单,有个地方我犯过错误,这里记录一下:

导出函数的#pragma comment(linker, "/EXPORT:GetFileVersionInfoA=c:windowssystem32version.dll.GetFileVersionInfoA,@1") 其中 c:windowssystem32version.dll这个地方,这是用于64位程序的,所以是这个路径。也可以写成改名后的dll文件名,比如你把原version.dll文件改成了oldversion.dll,那么就写成#pragma comment(linker, "/EXPORT:GetFileVersionInfoA=oldversion.dll.GetFileVersionInfoA,@1") 就可以了。不过这样你需要把oldversion.dll 同样拷贝到vbsedit.exe的同目录。如果是我的写法就只需要把生成的version.dll拷贝到vbsedit.exe程序目录就行了。

另外dll在控制台输出调试信息的方法我也是找了好久,开始一直用MessageBox,很痛苦的。

爆破地址只能适用于vbsedit 9.1226版本。

生成的version.dll拷贝到VBSEdit.exe的同目录即可。

记逆向小白的第一次vbsedit 9爆破及内存补丁制作过程

再次运行,这次没有了注册提示框。打开几个vbs文件,试了试编辑、调试等功能,测试一切正常,成功!

总结:破解逆向好像也没那么难,呵呵! 我也行 ^_^

到此这篇关于记逆向小白的第一次vbsedit 9爆破及内存补丁制作的文章就介绍到这了,更多相关vbsedit 9爆破及内存补丁内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/patanka/article/details/110940146

延伸 · 阅读

精彩推荐
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22