宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 4909|回复: 2

[VC界面库] VC++隐藏dll代码

  [复制链接]
  • TA的每日心情
    开心
    2024-12-9 18:45
  • 签到天数: 124 天

    [LV.7]常住居民III

    admin 发表于 2010-11-8 22:38:01 | 显示全部楼层 |阅读模式

    欢迎您注册加入!这里有您将更精采!

    您需要 登录 才可以下载或查看,没有账号?注册

    x
    1. /*----------------------------------------------------
    2. * 函数名称: HideDllFromPEB
    3. * 函数功能: 将dll从LDT_DATA_TABLE_ENTRY中隐藏
    4. * 参数: szDllName : dll名字
    5. *                 dwLength : szDllName字符串长度,不包含终止符
    6. * 返回值: TRUE(成功), FALSE(失败)
    7. -----------------------------------------------------*/
    8. BOOL HideDllFromPEB(CONST PCHAR szDllName,
    9.                                         DWORD dwLength)
    10. {
    11.         PPEB pPeb;
    12.         PLIST_ENTRY entry;
    13.         PLIST_ENTRY pTempEntry;
    14.         DWORD dwTranLen;
    15.         PLDR_DATA_TABLE_ENTRY pLdrEntry;
    16.         BOOL bRet;
    17.         char DllName[MAX_PATH];

    18.         if(dwLength > MAX_PATH - 1)
    19.         {
    20.                 return FALSE;
    21.         }

    22.         __asm
    23.         {
    24.                 mov eax, fs:[0x30]
    25.                 mov [pPeb], eax
    26.         }
    27.        
    28.         // fix code: EnterCriticalSection(pPeb->LoadLock)
    29.         bRet = FALSE;
    30.         for(entry = pPeb->Ldr->InLoadOrderModuleList.Flink;
    31.                 entry != &pPeb->Ldr->InLoadOrderModuleList;
    32.                 entry = entry->Flink)
    33.         {
    34.                 pLdrEntry = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
    35.                 if(TryRread(pLdrEntry->BaseDllName.Buffer, pLdrEntry->BaseDllName.Length))
    36.                 {
    37.                         dwTranLen = WideCharToMultiByte(CP_ACP,
    38.                                                                                         0,
    39.                                                                                         pLdrEntry->BaseDllName.Buffer,
    40.                                                                                         pLdrEntry->BaseDllName.Length / 2,
    41.                                                                                         DllName,
    42.                                                                                         MAX_PATH - 1,
    43.                                                                                         NULL,
    44.                                                                                         NULL);
    45.                         if(dwTranLen * 2 == pLdrEntry->BaseDllName.Length)
    46.                         {
    47.                                 // 没有转换终止符
    48.                                 DllName[dwTranLen]        = '\0';
    49.                                 dwTranLen++;
    50.                         }
    51.                         if((dwTranLen - 1) * 2 == pLdrEntry->BaseDllName.Length)
    52.                         {
    53.                                 if(strcmp(szDllName, DllName) == 0)
    54.                                 {
    55.                                         // 找到模块,将其隐藏
    56.                                         entry->Flink->Blink        = entry->Blink;
    57.                                         entry->Blink->Flink        = entry->Flink;

    58.                                         // 其他三个链表
    59.                                         pTempEntry = &pLdrEntry->InMemoryOrderModuleList;
    60.                                         pTempEntry->Flink->Blink = pTempEntry->Blink;
    61.                                         pTempEntry->Blink->Flink = pTempEntry->Flink;

    62.                                         pTempEntry = &pLdrEntry->InInitializationOrderModuleList;
    63.                                         pTempEntry->Flink->Blink = pTempEntry->Blink;
    64.                                         pTempEntry->Blink->Flink = pTempEntry->Flink;

    65.                                         pTempEntry = &pLdrEntry->HashLinks;
    66.                                         if(!IsListEmpty(pTempEntry))                        // LdrpHashTable有个,所以有可能某个是空的链表
    67.                                         {
    68.                                                 pTempEntry->Flink->Blink = pTempEntry->Blink;
    69.                                                 pTempEntry->Blink->Flink = pTempEntry->Flink;
    70.                                         }
    71.                                         bRet = TRUE;
    72.                                 }
    73.                         }
    74.                 }
    75.         }

    76.        
    77.         // 保险起见,把剩余的两个链表也扫了.
    78.         for(entry = pPeb->Ldr->InMemoryOrderModuleList.Flink;
    79.                 entry != &pPeb->Ldr->InMemoryOrderModuleList;
    80.                 entry = entry->Flink)
    81.         {
    82.                 pLdrEntry = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InMemoryOrderModuleList);
    83.                 if(TryRread(pLdrEntry->BaseDllName.Buffer, pLdrEntry->BaseDllName.Length))
    84.                 {
    85.                         dwTranLen = WideCharToMultiByte(CP_ACP,
    86.                                                                                         0,
    87.                                                                                         pLdrEntry->BaseDllName.Buffer,
    88.                                                                                         pLdrEntry->BaseDllName.Length / 2,
    89.                                                                                         DllName,
    90.                                                                                         MAX_PATH - 1,
    91.                                                                                         NULL,
    92.                                                                                         NULL);
    93.                         if(dwTranLen * 2 == pLdrEntry->BaseDllName.Length)
    94.                         {
    95.                                 // 没有转换终止符
    96.                                 DllName[dwTranLen]        = '\0';
    97.                                 dwTranLen++;
    98.                         }
    99.                         if((dwTranLen - 1) * 2 == pLdrEntry->BaseDllName.Length)
    100.                         {
    101.                                 if(strcmp(szDllName, DllName) == 0)
    102.                                 {
    103.                                         // 找到模块,将其隐藏
    104.                                         entry->Flink->Blink        = entry->Blink;
    105.                                         entry->Blink->Flink        = entry->Flink;

    106.                                         // 其他三个链表
    107.                                         pTempEntry = &pLdrEntry->InLoadOrderLinks;
    108.                                         pTempEntry->Flink->Blink = pTempEntry->Blink;
    109.                                         pTempEntry->Blink->Flink = pTempEntry->Flink;

    110.                                         pTempEntry = &pLdrEntry->InInitializationOrderModuleList;
    111.                                         pTempEntry->Flink->Blink = pTempEntry->Blink;
    112.                                         pTempEntry->Blink->Flink = pTempEntry->Flink;

    113.                                         pTempEntry = &pLdrEntry->HashLinks;
    114.                                         if(!IsListEmpty(pTempEntry))
    115.                                         {
    116.                                                 pTempEntry->Flink->Blink = pTempEntry->Blink;
    117.                                                 pTempEntry->Blink->Flink = pTempEntry->Flink;
    118.                                         }
    119.                                         bRet = TRUE;
    120.                                 }
    121.                         }
    122.                 }
    123.         }

    124.        
    125.         for(entry = pPeb->Ldr->InInitializationOrderModuleList.Flink;
    126.                 entry != &pPeb->Ldr->InInitializationOrderModuleList;
    127.                 entry = entry->Flink)
    128.         {
    129.                 pLdrEntry = CONTAINING_RECORD(entry, LDR_DATA_TABLE_ENTRY, InInitializationOrderModuleList);
    130.                 if(TryRread(pLdrEntry->BaseDllName.Buffer, pLdrEntry->BaseDllName.Length))
    131.                 {
    132.                         dwTranLen = WideCharToMultiByte(CP_ACP,
    133.                                                                                         0,
    134.                                                                                         pLdrEntry->BaseDllName.Buffer,
    135.                                                                                         pLdrEntry->BaseDllName.Length / 2,
    136.                                                                                         DllName,
    137.                                                                                         MAX_PATH - 1,
    138.                                                                                         NULL,
    139.                                                                                         NULL);
    140.                         if(dwTranLen * 2 == pLdrEntry->BaseDllName.Length)
    141.                         {
    142.                                 // 没有转换终止符
    143.                                 DllName[dwTranLen]        = '\0';
    144.                                 dwTranLen++;
    145.                         }
    146.                         if((dwTranLen - 1) * 2 == pLdrEntry->BaseDllName.Length)
    147.                         {
    148.                                 if(strcmp(szDllName, DllName) == 0)
    149.                                 {
    150.                                         // 找到模块,将其隐藏
    151.                                         entry->Flink->Blink        = entry->Blink;
    152.                                         entry->Blink->Flink        = entry->Flink;

    153.                                         // 其他三个链表
    154.                                         pTempEntry = &pLdrEntry->InLoadOrderLinks;
    155.                                         pTempEntry->Flink->Blink = pTempEntry->Blink;
    156.                                         pTempEntry->Blink->Flink = pTempEntry->Flink;

    157.                                         pTempEntry = &pLdrEntry->InMemoryOrderModuleList;
    158.                                         pTempEntry->Flink->Blink = pTempEntry->Blink;
    159.                                         pTempEntry->Blink->Flink = pTempEntry->Flink;

    160.                                         pTempEntry = &pLdrEntry->HashLinks;
    161.                                         if(!IsListEmpty(pTempEntry))
    162.                                         {
    163.                                                 pTempEntry->Flink->Blink = pTempEntry->Blink;
    164.                                                 pTempEntry->Blink->Flink = pTempEntry->Flink;
    165.                                         }
    166.                                         bRet = TRUE;
    167.                                 }
    168.                         }
    169.                 }
    170.         }

    171.         // fix code: LeaveCriticalSection(pPeb->LoadLock)


    172.         // LdrpHashTable 好蛋疼...
    173.         if(!HideFromLdrpHashTable(szDllName, dwLength) &&                        // LdrpHashTable如果断链失败,就说明已经被上边的操作给断了,表示成功
    174.                 0 == GetModuleHandle(szDllName) && bRet)
    175.         {
    176.                 printf("HideDllFromPEB()->HideFromLdrpHashTable失败, 这标志着dll成功被隐藏\n");
    177.         }
    178.         return bRet;
    179. }
    复制代码

    该用户从未签到

    fs110 发表于 2010-11-13 09:56:59 | 显示全部楼层
    不错,学习了
  • TA的每日心情
    开心
    2012-7-29 00:25
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    花心胡萝卜 发表于 2010-11-30 09:57:27 | 显示全部楼层
    - -,晕了,没看懂 - -
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    免责声明

    本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

    QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

    Copyright © 2001-2023 Discuz! Team. GMT+8, 2025-5-8 02:02 , File On Powered by Discuz! X3.49

    快速回复 返回顶部 返回列表