首页
社区
课程
招聘
[原创]挖掘操作系统内部未导出函数,将注入进行到底
发表于: 2006-6-29 15:43 11927

[原创]挖掘操作系统内部未导出函数,将注入进行到底

2006-6-29 15:43
11927

InjectCode for Win9x..
文章作者:Anskya
原文出处:看雪论坛
转载请保留版权~谢谢

现在注入方式很多,不过无外复三种:
1.使用映射代码然后创建远程线程
2.利用消息钩子插入DLL两种
3.使用调试API.GetThreadContext,SetThreadContext来改变线程的环境启动代码

4.不过基本上Win9x下差不多都是使用消息钩子挂钩模式
当然EliCZ叔叔发布的~EliRT可以让我们在Win9x下也可以使用
CreateRemoteThread注入函数...这里偶简单的说一下另外一种注入方式
利用系统内部函数进行创建远程线程.

这里我就不多说一大堆理论了~相关文献请参见EliCZ叔叔的文章...
当然这里使用的注入方式~他的文章中并没有提及...

1.原理
[1]定位目标
既然是夸进程的创建进程,首先我们怀疑的就是调试API
他们是如何作到调试远程进程的,比如DebugActiveProcess,
他是如何挂起目标进程的...所以对目标进程进行逆向分析..
(关于次问题请到...exetools里面查看相关文章吧...里面有讨论过)

(一下代码是反汇编DebugActiveProcess函数的...这里贴的是关键部分分析)
其实就在DebugActiveProcess下面几行的位置处...自己分析一下就知道了

; IDA output:
;.text:BFF9490D                 push    8                   ; const
;.text:BFF9490F                 push    edi
;.text:BFF94910                 push    offset sub_BFF9494D ; thread
;.text:BFF94915                 push    0FFFFF000h          ; tells kernel to allocate stack
;.text:BFF9491A                 push    edi                 ; pdb
;.text:BFF9491B                 call    CreateRemoteThread9x; arbitrary name
;0xE8 = call; 0x85 = push edi; 0xFFFF = higher part of 0xFFFFF000

特征码:0E857FFFFh(看不懂吗?自己反一下这个函数就知道了...16进制码...请问IDA这里怎么用???为显示不出...)
00400158    68 40000000     push    40
0040015D    68 00300008     push    8003000
00400162    68 D5050000     push    5D5
00400167    57              push    edi
00400168    FF15 42144000   call    [401442]                         ; kernel32.VirtualAlloc
0040016E    68 08000000     push    8
00400173    57              push    edi
00400174    50              push    eax
00400175    57              push    edi
00400176    68 D1040000     push    4D1
0040017B    8D15 0E114000   lea     edx, [40110E]	;这个地址是需要插入的代码内存地址

00400181    52              push    edx
00400182    50              push    eax
00400183    56              push    esi
00400184    FF15 32144000   call    [401432]                         ; kernel32.WriteProcessMemory
0040018A    FF15 3E144000   call    [40143E]                         ; kernel32.GetCurrentProcessId
00400190    64:3305 3000000>xor     eax, fs:[30]
00400197    31C3            xor     ebx, eax
00400199    8B35 3A144000   mov     esi, [40143A]                    ;kernel32.DebugActiveProcess
0040019F    46              inc     esi
004001A0    813E FFFF57E8   cmp     dword ptr [esi], E857FFFF	;比较是否是CreateRemoteThread9x内存特征
004001A6  ^ 75 F7           jnz     short 0040019F		;不等继续跳转
004001A8    AD              lods    dword ptr [esi]		;搜索到以后开始获取地址(扫描两次)
004001A9    AD              lods    dword ptr [esi]
004001AA    01F0            add     eax, esi			
004001AC    68 00F0FFFF     push    -1000
004001B1    53              push    ebx
004001B2    FFD0            call    eax
004001B4    57              push    edi
004001B5    50              push    eax
004001B6    8B35 2A144000   mov     esi, [40142A]                    ; kernel32.OpenProcess
004001BC    46              inc     esi
004001BD    813E 50FF32E8   cmp     dword ptr [esi], E832FF50
004001C3  ^ 75 F7           jnz     short 004001BC
004001C5    AD              lods    dword ptr [esi]
004001C6    AD              lods    dword ptr [esi]
004001C7    01F0            add     eax, esi
004001C9    53              push    ebx
004001CA    FFD0            call    eax				;调用此函数
004001CC    61              popad
004001CD    C3              retn

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (8)
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
OOOO  学习
2006-6-29 16:05
0
雪    币: 146
活跃值: (33)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
能不能把程序例子也付上?我搜啦一下没有找到
2006-6-29 18:04
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4


2006-6-29 23:17
0
雪    币: 47147
活跃值: (20460)
能力值: (RANK:350 )
在线值:
发帖
回帖
粉丝
5
RE:北极星2003
这些日志仅论坛管理人员能看到。
2006-6-30 09:45
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
6
我有一点不明白,为什么注入主程序都要用Shellcode技术获取输入表呢?
比如VirtualAlloc 这个函数 直接用GetProcAddress不好吗?
2006-6-30 15:40
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习
2006-6-30 21:17
0
雪    币: 1272
活跃值: (746)
能力值: ( LV13,RANK:810 )
在线值:
发帖
回帖
粉丝
8
最初由 foxabu 发布
我有一点不明白,为什么注入主程序都要用Shellcode技术获取输入表呢?
比如VirtualAlloc 这个函数 直接用GetProcAddress不好吗?


我感觉这么些很Cool~没别的原因...
其实这个代码就是ShellCode的代码
以前写Win9x下远程注入代码的ShellCode...
为了偷懒这里就直接粘贴过来了...呵呵
修改一下就OK了~不感觉我那种获取函数方式比较方便吗~
就是这个原因...懒人有懒招...

不过WIn9x也快过时了...这里写出来就是为了描述一下思路...
许多游戏外挂就是利用这种"系统"内部的函数做到的
如何去发掘这才是需要学习的。。。
2006-7-1 00:10
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
9
强,路过,看过,学习过
2006-7-1 08:44
0
游客
登录 | 注册 方可回帖
返回
//