04 编写自己的破解补丁

本章摘要:

04 编写自己的破解补丁_第1张图片

1、提高od当中汇编可读性

当我们遇到push offset Console.dasgasuigicashi这种阅读性不高的汇编代码的时候

在od当中,点击:选项》调试设置

04 编写自己的破解补丁_第2张图片

逆向微软提供的内核dll也会出现阅读性不高的情况出现

跳转到这个地址

04 编写自己的破解补丁_第3张图片

2、为什么写成全局字符数组就不能隐藏字符串了?

》编译器的原因:你本质还是编译器怎么看待你写的数据,应当以什么形式处理

你要是写成局部变量,他就给你写到代码节里面和16进制的代码融为一体,如果是全局的字符数组就给你写到数据节里面,那自然就以字符串的形式存储在数据节的内存里面了

局部:编译成代码 全局:编译成字符串存储

3、壳技术

3.1 壳的基本概念

壳就是把你真实的代码吞到他的肚子里面了(放到他自己的PE文件当中,还是在当前的exe当中),当你真正需要运行代码的时候再吐出来,他是一个字节一个字节地吐出来

3.2 如何判断软件有没有加壳?

把程序拖入od当中,如果提示如下内容,则是加了壳的:

04 编写自己的破解补丁_第4张图片

当然还可以通过DIE等查壳工具来判断是加的什么壳

3.3 著名的强壳

比如safeengine(se壳),他还会对API进行移位操作,比如messagebox函数,给你移位之后,你再去下断点,他就断不下来了

3.5 加了壳的软件应该如何修改他的代码?

对于加了壳子的软件,你想要修改他的内存,时机就非常重要了!你需要等壳子把原始的代码吐出来之后再区别修改关键位置的代码,那么怎么卡这个时机呢?

思路一:我可不可以让程序sleep几秒之后再调用API?

》不行。你dll是先加载的,之后才会执行exe的源代码,你不加载完,让人家怎么还原+执行?

思路二:在dll attach的时候启动一个线程,然后就循环判断有没有解码就了,你在dll里面启动一个线程,其实也就相当于在exe当中启动了一个线程,自然他也具备和exe一样抢占处理机的能力,他和你exe当中的线程没有什么区别,而且他还不影响主线程的执行,他也可以直接修改主线程当中的内容!!!

常见的处理方式有两种:

1. 通过inline hook api来打补丁

2. 判断解密操作是否执行完毕(上面使用的方法)

插曲:易语言的代码崩溃了怎么办?如果是别人写的模板的问题,就去网上找他的源码来看,易语言的代码都是可以完全反编译成为C语言的源码的,这样你自己慢慢地调就可以了

4、使用c语言写内存注册机

04 编写自己的破解补丁_第5张图片

52:00 易语言的模块

4.1 内存注册机 VS Dll劫持补丁 

内存注册机是当软件已经运行起来之后,使用另外一个exe通过openprocess+writeprocessmem函数来修改软件的内存数据的(打内存补丁)

dll劫持补丁是通过dll劫持技术来把我们的dll加载到exe文件当中,然后通过dll文件来修改我们关键位置的代码,实现破解

4.2 dll劫持技术

dll劫持说白了就是本身我这个exe查导出表,发现需要加载系统的dll文件,但是当你当前文件夹下有同样名称的dll的时候,系统会优先加载当前目录下的dll文件

注意:其实最后exe相当于是加载了2份同名的dll文件,只不过二者的路径不同

但是万一exe需要调用系统dll当中的函数怎么办呢?

》使用API转发技术,通过loadlibrary加载原始的dll文件(所以说是两份),然后我这个dll收到的消息就原封不动地转发给系统的dll文件(通过loadlibrary+getproprocess)

 

5、加壳软件的dll劫持补丁的编写

1、打开winspool.sln,把报错全部修改之后,重新生成一下

04 编写自己的破解补丁_第6张图片

2、按下ctrl+f搜索:今天的作业,以此来找到dllmain的入口点,当然也可以直接搜索dllmain

04 编写自己的破解补丁_第7张图片

3、点击,配置属性》高级,修改为生成.drv文件

04 编写自己的破解补丁_第8张图片

4、然后把调试命令修改为我们需要附加的exe的文件路径

04 编写自己的破解补丁_第9张图片

这样我们遇到问题的时候,就可以直接使用vs来调试dll文件了

5、编写dll劫持代码

对于加壳软件,无非就是等待他解密的时机问题

dllmain函数:

// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
	if (dwReason == DLL_PROCESS_ATTACH)
	{
		::MessageBoxA(0, "今天的作业来了\n\n根据我提供的劫持补丁模板\n\n给此模板增加代码,实现劫持补丁\n\n", "恭喜你领到作业一份", 0);
		CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);
		DisableThreadLibraryCalls(hModule);

		return Load();
	}
	else if (dwReason == DLL_PROCESS_DETACH)
	{
		Free();
	}

	return TRUE;
}

线程处理函数:

DWORD WINAPI ThreadProc(LPVOID lpParam) {

	DWORD detectAddr = 0x4010f0;
	char byteRead = 0;
	char writeBuf[] = { 0x90,0x90,0x90,0x90,0x90,0x90 };
	while (true)
	{
		ReadProcessMemory((HANDLE)-1, (LPVOID)detectAddr, &byteRead, 1, NULL);
		if (byteRead == 0x53) {
			WriteProcessMemory((HANDLE)-1, (char*)0x4010fd, writeBuf, sizeof(writeBuf), NULL);
			break;
		}
	}
	return 0;
}

6、把exe放到同一目录之下

04 编写自己的破解补丁_第10张图片

至此我们已经完成了对CM的dll劫持补丁的编写

04 编写自己的破解补丁_第11张图片

 04 编写自己的破解补丁_第12张图片

你可能感兴趣的:(软件对抗,windows,c语言,c++,汇编)