当前位置: 首页 > news >正文

SHELL32!ILCombine函数分析之连接两个idl

SHELL32!ILCombine函数分析之连接两个idl

第一部分:

STDAPI_(LPITEMIDLIST) ILCombine(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
{
    // Let me pass in NULL pointers
    if (!pidl1)
    {
        if (!pidl2)
        {
            return NULL;
        }
        return ILClone(pidl2);
    }
    else if (!pidl2)
    {
        return ILClone(pidl1);
    }

    UINT cb1 = ILGetSize(pidl1) - sizeof(pidl1->mkid.cb);
    UINT cb2 = ILGetSize(pidl2);

    VALIDATE_PIDL(pidl1);
    VALIDATE_PIDL(pidl2);
    LPITEMIDLIST pidlNew = _ILCreate(cb1 + cb2);
    if (pidlNew)
    {
        CopyMemory(pidlNew, pidl1, cb1);
        CopyMemory((LPTSTR)(((LPBYTE)pidlNew) + cb1), pidl2, cb2);
        ASSERT(ILGetSize(pidlNew) == cb1+cb2);
    }

    return pidlNew;
}


第二部分:

0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
 
0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x118770)
((SHELL32!_ITEMIDLIST *)0x118770)                 : 0x118770 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x118770))
(*((SHELL32!_SHITEMID *)0x118770))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x14 [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]
0: kd> db 0x118770
00118770  14 00 1f 50 e0 4f d0 20-ea 3a 69 10 a2 d8 08 00  ...P.O. .:i.....
00118780  2b 30 30 9d 19 00 2f 43-3a 5c 00 00 00 00 00 00  +00.../C:\......
00118790  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................

第三部分:
0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0

0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x10f8a0)
((SHELL32!_ITEMIDLIST *)0x10f8a0)                 : 0x10f8a0 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x10f8a0))
(*((SHELL32!_SHITEMID *)0x10f8a0))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x5e [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]
0: kd> db 0x10f8a0
0010f8a0  5e 00 32 00 00 00 00 00-54 5a b6 3c 20 00 4e 45  ^.2.....TZ.< .NE
0010f8b0  57 54 45 58 7e 31 2e 54-58 54 00 00 42 00 03 00  WTEX~1.TXT..B...
0010f8c0  04 00 ef be 54 5a a4 3c-54 5a b6 3c 14 00 00 00  ....TZ.<TZ.<....
0010f8d0  4e 00 65 00 77 00 20 00-54 00 65 00 78 00 74 00  N.e.w. .T.e.x.t.
0010f8e0  20 00 44 00 6f 00 63 00-75 00 6d 00 65 00 6e 00   .D.o.c.u.m.e.n.
0010f8f0  74 00 2e 00 74 00 78 00-74 00 00 00 1c 00 00 00  t...t.x.t.......
0010f900  04 00 0d 00 db 01 08 00-4d 00 79 00 20 00 43 00  ........M.y. .C.

第四部分:    UINT cb1 = ILGetSize(pidl1) - sizeof(pidl1->mkid.cb);


0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0

            cb1 = 0x2d                //cb1 = 0x2d= 0x2f-0x2        UINT cb1 = ILGetSize(pidl1) - sizeof(pidl1->mkid.cb);

第五部分:    UINT cb2 = ILGetSize(pidl2);


0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
            cb2 = 0x60
            cb1 = 0x2d


第六部分:
    VALIDATE_PIDL(pidl1);
    VALIDATE_PIDL(pidl2);
    LPITEMIDLIST pidlNew = _ILCreate(cb1 + cb2);

0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
            cb2 = 0x60
            cb1 = 0x2d
        pidlNew = 0x00118770

  0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x118770)
((SHELL32!_ITEMIDLIST *)0x118770)                 : 0x118770 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x118770))
(*((SHELL32!_SHITEMID *)0x118770))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x0 [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]


第七部分:        CopyMemory(pidlNew, pidl1, cb1);


0: kd> dv
          pidl1 = 0x00111198
          pidl2 = 0x0010f8a0
            cb2 = 0x60
            cb1 = 0x2d
        pidlNew = 0x00118770

0: kd> dx -id 0,0,89589d88 -r1 ((SHELL32!_ITEMIDLIST *)0x118770)
((SHELL32!_ITEMIDLIST *)0x118770)                 : 0x118770 [Type: _ITEMIDLIST *]
    [+0x000] mkid             [Type: _SHITEMID]
0: kd> dx -id 0,0,89589d88 -r1 (*((SHELL32!_SHITEMID *)0x118770))
(*((SHELL32!_SHITEMID *)0x118770))                 [Type: _SHITEMID]
    [+0x000] cb               : 0x14 [Type: unsigned short]
    [+0x002] abID             [Type: unsigned char [1]]
0: kd> db 0x118770
00118770  14 00 1f 50 e0 4f d0 20-ea 3a 69 10 a2 d8 08 00  ...P.O. .:i.....
00118780  2b 30 30 9d 19 00 2f 43-3a 5c 00 00 00 00 00 00  +00.../C:\......
00118790  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187a0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187b0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187c0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187d0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................
001187e0  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00  ................


第八部分:                CopyMemory((LPTSTR)(((LPBYTE)pidlNew) + cb1), pidl2, cb2);

0: kd> p
SHELL32!ILCombine+0x162:
001b:77325c3c 50              push    eax
0: kd> db 0x118770
00118770  14 00 1f 50 e0 4f d0 20-ea 3a 69 10 a2 d8 08 00  ...P.O. .:i.....
00118780  2b 30 30 9d 19 00 2f 43-3a 5c 00 00 00 00 00 00  +00.../C:\......
00118790  00 00 00 00 00 00 00 00-00 00 00 00 00 5e 00 32  .............^.2
001187a0  00 00 00 00 00 54 5a b6-3c 20 00 4e 45 57 54 45  .....TZ.< .NEWTE
001187b0  58 7e 31 2e 54 58 54 00-00 42 00 03 00 04 00 ef  X~1.TXT..B......
001187c0  be 54 5a a4 3c 54 5a b6-3c 14 00 00 00 4e 00 65  .TZ.<TZ.<....N.e
001187d0  00 77 00 20 00 54 00 65-00 78 00 74 00 20 00 44  .w. .T.e.x.t. .D
001187e0  00 6f 00 63 00 75 00 6d-00 65 00 6e 00 74 00 2e  .o.c.u.m.e.n.t..
0: kd> db 0x1187f0
001187f0  00 74 00 78 00 74 00 00-00 1c 00 00 00 01 08 00  .t.x.t..........

相关文章:

  • 外国优秀设计网站长沙竞价优化
  • 北京微网站建设设计服务百度客服
  • 广告艺术设计专业介绍站长之家seo工具
  • 医院关于申请网站建设的请示标题seo是什么意思
  • 佛山用户网站建设友链大全
  • 网站需要怎么做厦门人才网最新招聘信息
  • readline模块详解!!【Node.js】
  • 【智能音频新风尚】智能音频眼镜+FPC,打造极致听觉享受!【新立电子】
  • 文件下载技术的终极选择:`<a>` 标签 vs File Saver.js
  • 智能制造:汽车从订单到交付全流程
  • 【北京迅为】iTOP-RK3568OpenHarmony系统南向驱动开发-第4章 UART基础知识
  • 版图自动化连接算法开发 00004 ------ 给定一个点,添加一个中间点实现 Manhattan 方式连接两个给定的坐标点
  • eMMC安全简介
  • IDEA-插件开发踩坑记录-第六坑-UAST依赖问题
  • Unity中协程的使用场景
  • [密码学实战]Java实现SM2数字信封(结合SM4对称加密)生成与解析
  • 船舶广播系统:航行中的信息枢纽和安全保障
  • 【STL】6.<map/multimap>
  • Redis 的 Bitmap(位图)的使用场景
  • 基于机器学习的结构MRI分析:预测轻度认知障碍向阿尔茨海默病的转化
  • vscode集成DeepSeek
  • 前端正则表达式完全指南:从入门到实战
  • 海洋cmsv9报错注入,order by 和limit注入
  • HTML:自闭合标签简单介绍
  • C语言(16)---------->二维数组
  • 什么是 MGX:MetaGPT