易语言lsp劫持_[原创]不用导出任何函数的DLL劫持注入,完美!
.
最近在写SOCKS5代理,用的是LSP.代理成功了,但是因为LSP模块没办法隐藏,各种三方模块啊
删除PE头,强制删除文件,游戏都会闪退
想来想去,就想到这个法子,HOOK LdrLoadDll返回的模块句柄
把返回句柄替换成真实的DLL句柄,这种劫持的方式好处就是不用任何导出函数
不管什么是DLL劫持都可以,只要你能替换原来的DLL,LSP也挺方便的,哈哈哈
不过这种lsp劫持注入,只能用API HOOK来完成 SOCKS5代理
基本框架已经测试通过,抽空来分享一下劫持注入部分的代码
首先是HOOK部分PBYTE gethookadd(PBYTE pLdrLoad) //搜索LdrLoadDll返回
{
BYTE bsearch[3] = {0xC2,0x10,0x00};
while (TRUE)
{
if (memcmp(pLdrLoad, bsearch,3)==0)
{
break;
}
pLdrLoad++;
}
return pLdrLoad;
}
void hookLdrLoadDll(bool bHook)
{
if (pLdrLoadDll==NULL)
{
pLdrLoadDll = (PBYTE)GetProcAddress(GetModuleHandle(L"ntdll.dll"), "LdrLoadDll");
pLdrLoadDll = gethookadd(pLdrLoadDll);
VirtualProtect(pLdrLoadDll, 10, PAGE_EXECUTE_READWRITE, NULL);
}
if (bHook )
{
if (!pVEH1) //如果没注册VEH就注册一个,全局变量
pVEH1 = AddVectoredExceptionHandler(1, (PVECTORED_EXCEPTION_HANDLER)FirstVectExcepHandler);
BYTE bNewcode[1] = { 0xCC };
WriteProcessMemory(GetCurrentProcess(), pLdrLoadDll, bNewcode, 1, NULL);
}
else
{
BYTE bNewcode[1] = { 0xC2 };
WriteProcessMemory(GetCurrentProcess(), pLdrLoadDll, bNewcode, 1, NULL);
if (pVEH1)//删除VEH
{
RemoveVectoredExceptionHandler(pVEH1);//这里好像删除不成功,所以写道卸载模块的线程里了,删除不成功就卸载不了模块
//MessageBoxA(0, "删除VRH",0,0);
}
}
}
本来之前用的是inlinehook,XP测试的,弄成功了发现XP WIN7 WIN10中的HOOK地址汇编代码不一样,
而HOOK地址中 只有三个字节,所以就想到了用VEH来HOOK,只需要修改一个字节就行了
然后是处理HOOK部分:NTSTATUS NTAPI NewLdrLoadDll(
IN PWCHAR PathToFile OPTIONAL,
IN ULONG Flags OPTIONAL,
IN PUNICODE_STRING ModuleFileName,
OUT PHANDLE ModuleHandle)
{
if (*ModuleHandle == m_Module)//如果返回的句柄是自身模块句柄
{
*ModuleHandle = LoadLibrary(L"NTDLL.DLL");//假设劫持NTDLL
hookLdrLoadDll(false);//结束HOOK
// MessageBox(0, ModuleFileName->Buffer, 0, 0);
FreeLib();
}
return 0;
}
LONG CALLBACK FirstVectExcepHandler(_In_ PEXCEPTION_POINTERS ExceptionInfo)//异常处理
{
switch (ExceptionInfo->ExceptionRecord->ExceptionCode)
{
case STATUS_BREAKPOINT:
{
if (ExceptionInfo->ContextRecord->Eip==(DWORD)pLdrLoadDll)//如果是我们的HOOK地址
{
ExceptionInfo->ContextRecord->Eip = (DWORD)NewLdrLoadDll;//跳转到处理函数
return EXCEPTION_CONTINUE_EXECUTION;
}
}
}
return EXCEPTION_CONTINUE_SEARCH;
}
因为RET的时候堆栈各种参数跟函数入口的时候都是一样了,
所以这里的HOOK函数(NewLdrLoadDll)直接跟LdrLoadDll一样就行了
先判断LdrLoadDll返回的句柄是不是自己的,如果是,说明我们的DLLMain函数执行完成,要返回了
然后把返回的句柄替换成被劫持的DLL
然后还原HOOK地址,完成我们想要的操作(比如内存注入自己,创建独立的工作线程),
最后卸载自身模块,不留痕迹
卸载模块部分:void FreeLib() //退出线程
{
BYTE bCode[100] = { 106,80,184,0,0,16,0,255,208,104,0,0,1,0,184,0,16,0,0,255,208,194,4,0 };
DWORD i=0;
//删除VEH
shellcodeAppend(bCode, 0x68, (LONG)pVEH1, 4, TRUE);//push pVEH1
shellcodeAppend(bCode, 0xB8, (LONG)RemoveVectoredExceptionHandler, 4, false);//mov eax,RemoveVectoredExceptionHandler
shellcodeAppend(bCode, 0xFFD0, 0, 0, false);//call eax
//等待50毫秒
shellcodeAppend(bCode, 0x68, 0x50, 4, false);//push 50
shellcodeAppend(bCode, 0xB8, (LONG)Sleep,4,false);//mov eax,sleep
shellcodeAppend(bCode, 0xFFD0, 0,0,false);//call eax
//卸载自身模块
shellcodeAppend(bCode, 0x68, (LONG)m_Module, 4, false);//push m_Module
shellcodeAppend(bCode, 0xB8, (LONG)FreeLibrary, 4, false);//mov eax,FreeLibrary
shellcodeAppend(bCode, 0xFFD0, 0, 0, false);//call eax
//返回
LONG lCodeLen= shellcodeAppend(bCode, 0xC20400, 0, 0, false);//ret 04
LPVOID lpADD = VirtualAlloc(NULL, lCodeLen, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
if (lpADD)
{
//memLoadself(); //内存加载自身,论坛有源码,自己去弄一个,
//内存注入那通过DLLMain传入lpADD,DllMain(code,0,lpADD),然后再执行释放内存lpADD,哈哈,完美!
RtlCopyMemory(lpADD, bCode, lCodeLen);
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)lpADD, 0, 0, NULL);
}
}
因为DLL不能自己Free自己,所以申请一块独立的内存,使用线程来卸载自己
测试的时候,发现hookLdrLoadDll(false),竟然不能删除VEH,导致线程不能卸载模块
然后把删除VEH也添加到了线程中处理
写着写着shellcode,发现好烦啊,都是用od写好汇编代码,复制数据出来
再RtlCopyMemory修改shellcode参数
因为这个特别烦,就是撸了几把LOL,
回来就写了个shellcode组装的函数 shellcodeAppend()
看着用起来挺方便,拿出来个大家瞧瞧/**
* 功能描述:拼接 shelllcode汇编指令
* bCode shellcode指针
* lHead 汇编指令头
* lData 汇编指令数据
* dLen 数据长度
* bReset 重新设置指令指针
*
* 返回 shellcode 长度
*/
LONG shellcodeAppend(PBYTE bCode, LONG lHead, LONG lData, LONG dLen, BOOL bReset)
{
static LONG lcurp = 0;//当前指针
LONG i = 0;
LONG hLen = 4;//最多4位
if (bReset)//重置
lcurp = 0;
for (i = 1; i
{
if ((lHead >> (i * 8)) == 0)
{
hLen = i;
break;
}
}
for (i = 0; i
{
bCode[lcurp + i] = ((PBYTE)(&lHead))[hLen - i - 1];
}
lcurp += hLen;
//RtlCopyMemory(bCode + lcurp, &lData, dLen);
for (i = 0; i
{
bCode[lcurp + i] = ((PBYTE)(&lData))[i];
}
lcurp += dLen;
return lcurp;
}
哈哈,一下子心情又好了
我把一句汇编代码分为两部分,比如:
7700A65C 8B4C24 10 mov ecx,dword ptr ss:[esp+0x10]
7700A660 68 58750700 push 0x77558
mov ecx,dword ptr ss:[esp+0x10] 我把数据 8B4C24 看做汇编指令头,数据 10 是汇编指令数据
push 0x77558 我把数据 68 看做汇编指令头,数据 0x00077558 是汇编指令数据
调用的时候就写成:
// 最后一个参数=TRUE 初始化 bCode 当前指针为 0
shellcodeAppend(bCode, 0x8B4C24, 0x10, 4, TRUE);
// 最后一个参数=TRUE 初始化 bCode 当前指针为 0
shellcodeAppend(bCode, 0x68, 0x77558 , 4, TRUE);
一般头部最长不过4个字节,所以shellcodeAppend把头部写成 整数型
数据段一般最长也不过4个字节,所以也定义成4字节,
少见的超过4字节的就是
dword ptr ds:[0xXXXXXXX],0xXXXXXXXX
这种就不能直接用 shellcodeAppend 一次完成了,要分两次
不过,既然shellcode是我们自己编写的,干嘛非要用这种,哈哈,脑残
最后 DLLMain() 中调用就可以了 :#include "stdafx.h"
#include
void hookLdrLoadDll(bool bHook);
HMODULE m_Module = NULL;
PVOID pVEH1 = NULL;
PBYTE pLdrLoadDll = NULL;
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
if ((DWORD)lpReserved== 0)//lpReserved 内存注入的时候,我们给个参数传进来的是卸载模块线程地址
{
m_Module = hModule;
hookLdrLoadDll(true);
break;
}
else
{
//这里是内存注入
//VirtualFree(lpReserved, 0, MEM_RELEASE);
//然后启动线程啊之类的
//RtlZeroMemory(hModule, 0x1000);//清空PE头啊
//CreateThread();
break;
}
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
一直没工作做,有公司招人吗.像俺这种没文凭,没各种证的人,会的东西挺多,不敢说精通.
.
.
上传的附件:
main.png
(232.01kb,59次下载)
易语言lsp劫持_[原创]不用导出任何函数的DLL劫持注入,完美!相关推荐
- 易语言反截图_[原创]反截图技术的原理及简单实现
前言 该文章将邀请世界第一的编程语言-易语言来为我们演示. 吹逼 随着好玩的游戏越来越多,盖佬人才越来越突出,好玩的游戏+一款牛逼的WG成为了一个老挂逼的日常生活.鲁迅说过'有乐同享,有难同当',于是 ...
- 易语言lsp劫持_易语言网截插件修复源码
易语言网截插件修复源码.版本 2 .支持库 shell .支持库 eNetIntercept .子程序 _按钮1_被单击 写到文件 (取特定目录 (10) + "/lsp.bat" ...
- 易语言java类_易语言面对对象编程
易语言面对对象编程---类的创建与使用 面对对象编程,可以说是当前最流行的编程方式,当前流行的面对对象的编程语言很多,如:C++.JAVA等等.易语言3.8版推出后,同样紧跟编程语言发展的方向,也开始 ...
- 511遇见易语言资源表的导入和导出
易语言资源表添加声音资源,图片资源,图片组资源,和向资源表中导入可执行文件,将资源表中的资源导出,使用资源表中的资源,通过随机播放音乐,随机播放图片,已经把exe文件写出并执行做了实例演示. 1. 向 ...
- 易语言调用子程序_ c,易语言汇编调用子程序源码
.版本 2 .程序集 窗口程序集1 .子程序 __启动窗口_创建完毕 ' 调子程_Asm() ' 主要用于给某个子程序'自定义事件' 它等效于某官方支持库的'调用子程序()'命令 具体使用方法 可参照 ...
- mysql数据库+易语言的应用_易语言mysql数据应用源码
易语言mysql数据应用源码 易语言mysql数据应用源码 系统结构:注册账号,连接Mysql,用户注册验证码,修改密码验证码,忘记密码验证码,修改密码,忘记密码, ======窗口程序集1 | | ...
- linux 易语言窗口程序_易语言开发Linux程序
令人兴奋的是易语言可以开发Linux程序,易语言是一个跨平台的开发工具,支持Windows及Linux.使用易语言开发Linux程序,您可以在Windows环境下编写基本于Windows的程序,及编写 ...
- 易语言打开摄像头_中维摄像头易语言实例
[实例简介]用易语言实现中维摄像头的操作 [实例截图] [核心代码] .版本 2 .支持库 eAPI .支持库 iext2 .支持库 spec .子程序 __启动窗口_创建完毕 .局部变量 l, 逻辑 ...
- 易语言系列————————窗口_枚举所有子窗口(精易模块)
在易语言开发中,有时想直接从一个窗口中拿取 窗口下所有控件的信息,可以用window知道的api入手,但是精益模块有带有这个功能哦. 窗口_枚举所有子窗口() 三个参数: 一.欲寻找控件的窗口句柄 二 ...
最新文章
- java 字节数组 操作_Java-固定字节数组对象
- Error:Cannot build artifact ‘ssm:war exploded‘ because it is included into a circular dependency
- 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层
- Fit项目分页组件的编写
- 【SQL】去除表中的重复行
- 数值分析期末考试复习(逼近问题)
- ASP.NET 使用application和session对象写的简单聊天室程序
- 线性系统和非线性系统——《应用非线性动力学》读书笔记
- 国产_系统_加油 by tmddebaba
- 虾皮入驻后怎么经营才能:快速出单?
- Arduino LED闪烁
- 黄反词测试,接口监控
- LSVGlobal Mapper应用----影像裁剪
- qt类似电视盒子的通过方向键切换焦点的实现方法
- 自定义UILabel,添加verticalAlignment属性
- 浅谈zookeeper
- password has expired问题
- 力扣 857. 雇佣 K 名工人的最低成本
- 【Spring Security】安全框架学习(十三)
- 考研的 本科“出身”到底重不重要?