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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

#include <Windows.h>
#include <stdio.h>

// 导出函数
#pragma comment(linker, "/EXPORT:GetFileVersionInfoA=c:\\windows\\system32\\version.dll.GetFileVersionInfoA,@1")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoByHandle=c:\\windows\\system32\\version.dll.GetFileVersionInfoByHandle,@2")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoExA=c:\\windows\\system32\\version.dll.GetFileVersionInfoExA,@3")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoExW=c:\\windows\\system32\\version.dll.GetFileVersionInfoExW,@4")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeA=c:\\windows\\system32\\version.dll.GetFileVersionInfoSizeA,@5")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeExA=c:\\windows\\system32\\version.dll.GetFileVersionInfoSizeExA,@6")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeExW=c:\\windows\\system32\\version.dll.GetFileVersionInfoSizeExW,@7")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoSizeW=c:\\windows\\system32\\version.dll.GetFileVersionInfoSizeW,@8")
#pragma comment(linker, "/EXPORT:GetFileVersionInfoW=c:\\windows\\system32\\version.dll.GetFileVersionInfoW,@9")
#pragma comment(linker, "/EXPORT:VerFindFileA=c:\\windows\\system32\\version.dll.VerFindFileA,@10")
#pragma comment(linker, "/EXPORT:VerFindFileW=c:\\windows\\system32\\version.dll.VerFindFileW,@11")
#pragma comment(linker, "/EXPORT:VerInstallFileA=c:\\windows\\system32\\version.dll.VerInstallFileA,@12")
#pragma comment(linker, "/EXPORT:VerInstallFileW=c:\\windows\\system32\\version.dll.VerInstallFileW,@13")
#pragma comment(linker, "/EXPORT:VerLanguageNameA=c:\\windows\\system32\\version.dll.VerLanguageNameA,@14")
#pragma comment(linker, "/EXPORT:VerLanguageNameW=c:\\windows\\system32\\version.dll.VerLanguageNameW,@15")
#pragma comment(linker, "/EXPORT:VerQueryValueA=c:\\windows\\system32\\version.dll.VerQueryValueA,@16")
#pragma comment(linker, "/EXPORT:VerQueryValueW=c:\\windows\\system32\\version.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 \n");
	}else
	{
		Debug("the hProcess is : %x\n",(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!\n ",dwNumberOfBytesRead);
	}else
	{
		Debug("read error:%d \n", 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 \n", 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 \n", 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:\\windows\\system32\\version.dll.GetFileVersionInfoA,@1") 其中 c:\\windows\\system32\\version.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的同目录即可。

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

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

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

(0)

相关推荐

  • vbs-toolkit VBSEdit 提供 免费的COM组件

    VBSCRIPT 语法简单 强大 但是功能上明显不足 需要第三方的控制 e.g. COM 组件来扩展其功能. VBSEDIT 安装完之后就可以在安装目录下发现 免费提供的 COM 组件 vbs toolkit. 下载 VBSEDIT 工具 32 位 DLL: vbsedit32 60 VBSEdit 提供 64 位 DLL: vbsedit64 61 VBSEdit 提供 注册组件 注册组件需要管理员权限. 可以运行下面命令分别注册 32, 64 位的VBSEDIT 工具箱. regsvr32

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

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

  • iOS通过逆向理解Block的内存模型

    前言 正常情况下,通过分析界面以及 class-dump 出来头文件就能对某个功能的实现猜个八九不离十.但是 Block 这种特殊的类型在头文件中是看不出它的声明的,一些有 Block 回调的方法名 dump 出来是类似这样的: - (void)FM_GetSubscribeList:(long long)arg1 pageSize:(long long)arg2 callBack:(CDUnknownBlockType)arg3; 因为这种回调看不到它的方法签名,我们无法知道这个 Block

  • 详解vue表单——小白速看

    一.基本用法 你可以用 v-model 指令在表单 <input> 及 <textarea> 元素上创建双向数据绑定. 但 v-model 本质上不过是语法糖.它负责监听用户的输入事件以更新数据,并对一些极端场景进行一些特殊处理. v-model 会忽略所有表单元素的 value.checked.selected 特性的初始值而总是将 Vue 实例的数据作为数据来源.你应该通过 JavaScript 在组件的 data 选项中声明初始值. 一组代码,看完text.textarea.

  • 记一次python 内存泄漏问题及解决过程

    最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,这里整理了一次内存泄漏的问题 通常我们写python程序的时候也很少关注内存这个问题(当然可能我的能力还有待提升),可能写c和c++的朋友会更多的考虑这个问题,但是一旦我们的python程序出现了 内存泄漏的问题,也将是一件非常麻烦的事情了,而最近的一次代码中也碰到了这个问题,不过好在最后内存溢出不是我代码的问题,而是所用到的一个包出现了

  • 如何使用Python逆向抓取APP数据

    今天给大伙分享一下 Python 爬虫的教程,这次主要涉及到的是关于某 APP 的逆向分析并抓取数据,关于 APP 的反爬会麻烦一些,比如 Android 端的代码写完一般会进行打包并混淆加密加固,所以除了抓包之外,还需要对 APP 进行查壳脱壳反编译等操作. 所需设备和环境: 设备:安卓手机 抓包: fiddler+xposed+JustTrustme 查壳:ApkScan-PKID 脱壳:frida-DEXDump 反编译:jadx-gui hook:frida 抓包 手机安装app,设置好

  • Android RecyclerView详解及简单实例

    Android  RecyclerView 小白今天第一次接触RecyclerView,前辈大神告诉我这是一个很神奇的控件,一看就是一整天. RecyclerView中有规定好的方法去显示列表,图片甚至视频.还带有删除新建某一列表的方法.相对于ListView这个 RecyclerView控件就更加牛了. 明白的大神看一眼就懂,小白可以自己照源码敲一遍看看效果.这段程序是把A-Z按列排列下来: package com.example.osserver.recycler; import andro

  • Perl学习基本备忘录

    1.Perl数组(1): 1) 初始化数组 @array = ( "stringA" , "stringB" , "stringC" );2) 使用负索引循环检索 print $array[-1];  #输出索引为(-1 + 3) % 3 = 2 的 stringC3) 动态增长 $array[4] = "stringD"; #虽然$array[3]还没有使用,但在动态赋值$array[4]的使用,已经对$array[3]赋空

  • Android开发艺术探索学习笔记(七)

    第七章 Android动画深入分析 Android的动画分为三种:View动画,帧动画,属性动画.帧动画属于View动画. 7.1 View动画 View动画的作用对象是View,共有四种动画效果:平移(Translate),缩放(Scale),旋转(Rotate),透明度(Alpha). 7.1.1 View动画的种类 View动画的保存路径:res/anim/filename.xml.XML格式语法如下: <?xml version="1.0" encoding="

  • Spring Boot设置并使用缓存的步骤

    几个缓存注解的作用: @Cacheable:将方法的返回结果根据key指定的键保存在缓存中,以后要获取相同的数据直接从缓存中共获取 cacheNames/value:指定Cache组件名称 key:指定缓存时使用的key,默认使用方法参数值,可以使用#a0.#p0.#参数名等,支持SpEL表达式,root可省略 keyGenerator:指定key的生成器的组件id,如自定义的KeyGenerator cacheManager:指定缓存管理器 cacheResolver:指定缓存解析器 cond

  • wxPython:python首选的GUI库实例分享

    wxPython是Python语言的一套优秀的GUI图形库,允许Python程序员很方便的创建完整的.功能健全的GUI用户界面. wxPython是作为优秀的跨平台GUI库wxWidgets的Python封装和Python模块的方式提供给用户的. 就如同Python和wxWidgets一样,wxPython也是一款开源软件,并且具有非常优秀的跨平台能力,能够支持运行在32 [1] /64位windows.绝大多数的Unix或类Unix系统.Macintosh OS X下. wxPython是Py

随机推荐