本章摘要:
1、提高od当中汇编可读性
当我们遇到push offset Console.dasgasuigicashi这种阅读性不高的汇编代码的时候
在od当中,点击:选项》调试设置
逆向微软提供的内核dll也会出现阅读性不高的情况出现
跳转到这个地址
2、为什么写成全局字符数组就不能隐藏字符串了?
》编译器的原因:你本质还是编译器怎么看待你写的数据,应当以什么形式处理
你要是写成局部变量,他就给你写到代码节里面和16进制的代码融为一体,如果是全局的字符数组就给你写到数据节里面,那自然就以字符串的形式存储在数据节的内存里面了
局部:编译成代码 全局:编译成字符串存储
3、壳技术
3.1 壳的基本概念
壳就是把你真实的代码吞到他的肚子里面了(放到他自己的PE文件当中,还是在当前的exe当中),当你真正需要运行代码的时候再吐出来,他是一个字节一个字节地吐出来
3.2 如何判断软件有没有加壳?
把程序拖入od当中,如果提示如下内容,则是加了壳的:
当然还可以通过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语言写内存注册机
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,把报错全部修改之后,重新生成一下
2、按下ctrl+f搜索:今天的作业,以此来找到dllmain的入口点,当然也可以直接搜索dllmain
3、点击,配置属性》高级,修改为生成.drv文件
4、然后把调试命令修改为我们需要附加的exe的文件路径
这样我们遇到问题的时候,就可以直接使用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放到同一目录之下
至此我们已经完成了对CM的dll劫持补丁的编写