.

最近在写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劫持注入,完美!相关推荐

  1. 易语言反截图_[原创]反截图技术的原理及简单实现

    前言 该文章将邀请世界第一的编程语言-易语言来为我们演示. 吹逼 随着好玩的游戏越来越多,盖佬人才越来越突出,好玩的游戏+一款牛逼的WG成为了一个老挂逼的日常生活.鲁迅说过'有乐同享,有难同当',于是 ...

  2. 易语言lsp劫持_易语言网截插件修复源码

    易语言网截插件修复源码.版本 2 .支持库 shell .支持库 eNetIntercept .子程序 _按钮1_被单击 写到文件 (取特定目录 (10) + "/lsp.bat" ...

  3. 易语言java类_易语言面对对象编程

    易语言面对对象编程---类的创建与使用 面对对象编程,可以说是当前最流行的编程方式,当前流行的面对对象的编程语言很多,如:C++.JAVA等等.易语言3.8版推出后,同样紧跟编程语言发展的方向,也开始 ...

  4. 511遇见易语言资源表的导入和导出

    易语言资源表添加声音资源,图片资源,图片组资源,和向资源表中导入可执行文件,将资源表中的资源导出,使用资源表中的资源,通过随机播放音乐,随机播放图片,已经把exe文件写出并执行做了实例演示. 1. 向 ...

  5. 易语言调用子程序_ c,易语言汇编调用子程序源码

    .版本 2 .程序集 窗口程序集1 .子程序 __启动窗口_创建完毕 ' 调子程_Asm() ' 主要用于给某个子程序'自定义事件' 它等效于某官方支持库的'调用子程序()'命令 具体使用方法 可参照 ...

  6. mysql数据库+易语言的应用_易语言mysql数据应用源码

    易语言mysql数据应用源码 易语言mysql数据应用源码 系统结构:注册账号,连接Mysql,用户注册验证码,修改密码验证码,忘记密码验证码,修改密码,忘记密码, ======窗口程序集1 | | ...

  7. linux 易语言窗口程序_易语言开发Linux程序

    令人兴奋的是易语言可以开发Linux程序,易语言是一个跨平台的开发工具,支持Windows及Linux.使用易语言开发Linux程序,您可以在Windows环境下编写基本于Windows的程序,及编写 ...

  8. 易语言打开摄像头_中维摄像头易语言实例

    [实例简介]用易语言实现中维摄像头的操作 [实例截图] [核心代码] .版本 2 .支持库 eAPI .支持库 iext2 .支持库 spec .子程序 __启动窗口_创建完毕 .局部变量 l, 逻辑 ...

  9. 易语言系列————————窗口_枚举所有子窗口(精易模块)

    在易语言开发中,有时想直接从一个窗口中拿取 窗口下所有控件的信息,可以用window知道的api入手,但是精益模块有带有这个功能哦. 窗口_枚举所有子窗口() 三个参数: 一.欲寻找控件的窗口句柄 二 ...

最新文章

  1. java 字节数组 操作_Java-固定字节数组对象
  2. Error:Cannot build artifact ‘ssm:war exploded‘ because it is included into a circular dependency
  3. 花书+吴恩达深度学习(十一)卷积神经网络 CNN 之池化层
  4. Fit项目分页组件的编写
  5. 【SQL】去除表中的重复行
  6. 数值分析期末考试复习(逼近问题)
  7. ASP.NET 使用application和session对象写的简单聊天室程序
  8. 线性系统和非线性系统——《应用非线性动力学》读书笔记
  9. 国产_系统_加油 by tmddebaba
  10. 虾皮入驻后怎么经营才能:快速出单?
  11. Arduino LED闪烁
  12. 黄反词测试,接口监控
  13. LSVGlobal Mapper应用----影像裁剪
  14. qt类似电视盒子的通过方向键切换焦点的实现方法
  15. 自定义UILabel,添加verticalAlignment属性
  16. 浅谈zookeeper
  17. password has expired问题
  18. 力扣 857. 雇佣 K 名工人的最低成本
  19. 【Spring Security】安全框架学习(十三)
  20. 考研的 本科“出身”到底重不重要?

热门文章

  1. 伦敦同业拆借利率(LIBOR)
  2. 用 顶部tab栏 做排班表
  3. 网络营销实训一:什么是网络营销?
  4. 在Windows10中对于文件做MD5校验
  5. 三维视觉论文阅读:RAFT2020双目光流
  6. vue 项目开发 lenovo商城
  7. Vanilla相关术语
  8. Core Animation (1)
  9. 硬币面值组合(上台阶)
  10. Semantic UI 之 对话框 modal