首页
社区
课程
招聘
[探讨] 把代码加载到一个运行的程序
2004-10-12 11:48 9000

[探讨] 把代码加载到一个运行的程序

2004-10-12 11:48
9000
当我们需要控制一个目标程序时,有时候需要把自制的代码加载到目标程序 (target process VA) , 以达成某些目的,例如 code patching, 增加功能 , 扩充功能, gain access right, api interception, subclassing, 等等

我们可以透过修改目标程序的执行文件,或是动态加载代码。我们的焦点放在后者。现行常用的方法包括 nt 的 VirtualAllocEx 组合 , CreateRemoteThread 和 LoadLibrary 的组合, Hook的方法 , 和 user32.dll 的 registry 修改法。

这些方法都有各自的限制和使用条件,现时没有一种有效的方法可以流通各种环境 ( nt 和 9x, 有 GUI 和 没有 GUI 的程序)

大家如果有一些独特的想法,或者是对于动态加载有高强的技巧,欢迎提出讨论

( 基本的加载方法一般于网上有记载,我希望可以研究出更出色的新方法 )

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 1
打赏
分享
最新回复 (12)
雪    币: 427
活跃值: (412)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
鸡蛋壳 2004-10-12 12:55
2
0
什么独特,几年前还是14岁的YODA,早就写了一个库,目的就是做这个。不是我没告诉你,不去看别人的站,是你的过错。
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-10-12 13:11
3
0
最初由 鸡蛋壳 发布
什么独特,几年前还是14岁的YODA,早就写了一个库,目的就是做这个。不是我没告诉你,不去看别人的站,是你的过错。


为甚么要用他的库

我现在讨论的是想出更好的方法

你说的 yoda 我知道,只是你自以为我没看过那些站

谢谢你的意见 ~
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-10-12 13:16
4
0
顺带一提

如果是像鸡蛋壳兄那些已知或者早已流传的方法,这里不作讨论
希望研究新方法的可行性
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2004-10-12 16:10
5
0
看来不用讨论了。我们想起来的方法,鸡蛋兄肯定都用过了。 :D
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-10-12 16:49
6
0
最初由 nbw 发布
看来不用讨论了。我们想起来的方法,鸡蛋兄肯定都用过了。 :D


我只是试试看,看看会不会发现一些有趣的方法,或是很少人提及的方法

我知道大部份可以想到的方法,也在网上出现过很多遍

-        Nt 直接用 VirtualAllocEx 的
-        用 hook 来带进的
-        用 CreateRemoteThread 去玩 LoadLibrary 的
-        修改 registry 的
-        像鸡蛋壳说的 yoda,用 SetThreadContext 修改执行指令的
-        在 win9x 下使用 CreateFileMapping 的
-        在 exe 里找出空间来填上 opcode 来运行 loadlibrary 的
-        用驱动程序,修改系统 api 某位的

有兴趣研究的话可以发表一下,没有的也不紧要

如果有好的资源或相关网址也可以贴贴
雪    币: 332
活跃值: (479)
能力值: ( LV9,RANK:330 )
在线值:
发帖
回帖
粉丝
laoqian 8 2004-10-12 17:44
7
0
直接修改目标程序,在 exe 里找出空间来填上你的功能代码,这个NBW最NB。
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
lordor 6 2004-10-13 11:46
8
0
不知楼主有没有做出你所说方法的一些程序出来,
这些方法可能会在xpsp2下存在兼容性的问题.

http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2mempr.mspx
雪    币: 236
活跃值: (155)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
nOpnOp 2 2004-10-13 12:18
9
0
大致的流程是这样的:
1.先通过WriteProcessMemory之类的函数将自己的代码写入目标进程中;(这步和大多数内存补丁一样)
2.要运行这段代码的话只需要对目标进程发送WM_TIME消息,该消息可以带入一个回调函数的地址,将自己复制过去的代码地址作为回调函数的地址就可以让目标进程运行复制过去的代码了.

附:消息的定义
LRESULT CALLBACK WindowProc(
  HWND hwnd,       // handle to window
  UINT uMsg,       // WM_TIMER
  WPARAM wParam,   // timer identifier
  LPARAM lParam    // timer callback (TIMERPROC) <--- Look!!
);
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-10-13 17:14
10
0
最初由 lordor 发布
不知楼主有没有做出你所说方法的一些程序出来,
这些方法可能会在xpsp2下存在兼容性的问题.

http://www.microsoft.com/technet/prodtechnol/winxppro/maintain/sp2mempr.mspx


对,这些方法我在网上看的时候,还没有甚么 sp 2,我也看过微软对 DEP 技术的介绍,可惜并没有详细资料
它说这是由 CPU 和软件一同支持的保护机制,怎样实行却没有说,我在想,DEP 生效后,一个 VirtualProtectEx 更改 process 区段属性后,还可不可以运行写在上面的 code
上次我在看雪发了一个帖问大家有没有找到关于 DEP 的文章,我在网上还没有找到 ~_~
雪    币: 2319
活跃值: (565)
能力值: (RANK:300 )
在线值:
发帖
回帖
粉丝
riijj 7 2004-10-13 17:15
11
0
最初由 nOpnOp 发布
大致的流程是这样的:
1.先通过WriteProcessMemory之类的函数将自己的代码写入目标进程中;(这步和大多数内存补丁一样)
2.要运行这段代码的话只需要对目标进程发送WM_TIME消息,该消息可以带入一个回调函数的地址,将自己复制过去的代码地址作为回调函数的地址就可以让目标进程运行复制过去的代码了.

附:消息的定义
........


nOpnOp 兄,你这个方法我没有见过,很多谢你~~
我没有想到我们乱掉一个 wm_timer 他也会有反应

我记得有一个 windows的 exploit,是关于 user 掉 wm_timer 给一个系统 process,做成 user权限提升。我估计从 98 到 xp 的版本对 wm_timer 的处理应该没有大分别,希望微软不对它作特别的修正。
雪    币: 279
活跃值: (375)
能力值: ( LV9,RANK:250 )
在线值:
发帖
回帖
粉丝
lordor 6 2004-10-13 17:37
12
0
最初由 riijj 发布


对,这些方法我在网上看的时候,还没有甚么 sp 2,我也看过微软对 DEP 技术的介绍,可惜并没有详细资料
它说这是由 CPU 和软件一同支持的保护机制,怎样实行却没有说,我在想,DEP 生效后,一个 VirtualProtectEx 更改 process 区段属性后,还可不可以运行写在上面的 code
上次我在看雪发了一个帖问大家有没有找到关于 DEP 的文章,我在网上还没有找到 ~_~


RCE上有部分这方面的资料,我没细看,你可以到那找找
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
nbw 24 2004-10-13 19:54
13
0
这些东西大部分说白了就是patch,只不过实现的方法不一样。我见过的比较牛的patch有2种:

1、 进入ring 0 ,修改kernell32 ,这个可以参考莫国防源代码;
2、 Self-debuging ,和检测context差不多,但是实现的思路不一样。代码如下:
; 2004.02.17 :: fixed! let's celebrate! ;P
; but.. with this fix softice is able to trace through the code ;/
; so we have to adapt old buggy version ;]

; Omega Red 10/2003
; NASM source
; primitive exception testing

bits        32

%include "omeg.inc"
%include "win32n.inc"

extern wsprintfA
extern MessageBoxA
;extern SetUnhandledExceptionFilter
extern ExitProcess
;extern Sleep
;--------------------------------------------------------------------
section        .code        use32
..start:
        push                eax
        call                trap
trap:
        pop                eax        ; offset of trap in eax
        sub                eax, (trap-..start)        ; starting IP in eax
        mov                [init_eip], eax
        pop                eax
        callc                wsprintfA, txtbuf, exc_f1, eax, ebx, ecx, edx, edi, esi, ebp, [init_eip], cs, ds, es, fs, gs, ss, esp
        callf                MessageBoxA, 0, txtbuf, 0, 0

;        that's FINAL process handler with different parameters, should return -1 to continue
;        callf                SetUnhandledExceptionFilter, ExceptionHandler

        SEH_INSTALL        ThreadExceptionHandler

; initialize single-step tracing
; handler doesn't need the address of continue point because its debug exception and EIP is progressed normally
        mov                [steps], dword 0
        pushf
        pop                eax
        or                        eax, 0x00000100
        push                eax
        popf

        nop
        call                IntegrityCheck

;        save IP to safe place for next non-debug exceptions ;)
        mov                [exc_eip], dword exception_continue1

        callf                MessageBoxA, 0, mid_msg, 0, 0

; GENERATE EXCEPTION
        ud2                ; undefined opcode
exception_continue1:
        mov                [exc_eip], dword exception_continue2
        mov                eax, cr0                ; privileged instruction used

exception_continue2:

        pushf
        pop                eax
        and                eax, ~0x00000100        ; disable single-stepping
        push                eax
        popf

        callf                MessageBoxA, 0, end_msg, 0, 0

        callc                wsprintfA, txtbuf, steps_f, [steps]
        callf                MessageBoxA, 0, txtbuf, 0, 0

        SEH_REMOVE
        xor                eax, eax
        ret
;--------------------------------------------------------------------
; C calling convention!
ThreadExceptionHandler:
cproc                pExceptionRecord, pErr, pContext, pDispatch
        push                esi
        mov                esi, pContext ; CPU state when exception occured
        mov                edx, pExceptionRecord ; exception info
        mov                eax, [edx+EXCEPTION_RECORD.ExceptionCode]        ; code
        cmp                eax, 0x80000004        ; debug exception (trap) ?
        je                        exc_debug
        callc                wsprintfA, txtbuf, exc_f, eax, [edx+EXCEPTION_RECORD.ExceptionFlags], [edx+EXCEPTION_RECORD.ExceptionAddress], [esi+CONTEXT.regEax], [esi+CONTEXT.regEbx], [esi+CONTEXT.regEcx], [esi+CONTEXT.regEdx], [esi+CONTEXT.regEdi], [esi+CONTEXT.regEsi], [esi+CONTEXT.regEbp], [esi+CONTEXT.regEip], [esi+CONTEXT.regCs], [esi+CONTEXT.regDs], [esi+CONTEXT.regEs], [esi+CONTEXT.regFs], [esi+CONTEXT.regGs], [esi+CONTEXT.regSs], [esi+CONTEXT.regEsp]
        callf                MessageBoxA, 0, txtbuf, 0, 0

        ; recover cpu state
        push                dword [exc_eip]
        pop                dword [esi+CONTEXT.regEip]
        ; stack is not altered after handler's return
        jmp                exc_end

exc_debug:
        ; restore trap flag
        inc                dword [steps]
        mov                eax, [esi+CONTEXT.regFlag]
        or                        eax, 0x00000100
        mov                [esi+CONTEXT.regFlag], eax
exc_end:
        pop                esi
;        mov                eax, EXCEPTION_CONTINUE_EXECUTION        ; that's for FINAL handler
        xor                eax, eax
endcproc
end_check:
;--------------------------------------------------------------------
; simple checksum (badziew ;)
IntegrityCheck:
        mov                ebx, ..start
        xor                eax, eax
check_loop:
        add                eax, [ebx]
        add                ebx, 4
        cmp                ebx, end_check
        jb                        check_loop
        cmp                eax, 0x1e341ab7
        jz                        check_ok
        callc                wsprintfA, txtbuf, check_f, eax
        callf                MessageBoxA, 0, txtbuf, 0, 0
        callf                MessageBoxA, 0, check_bad, 0, MB_ICONSTOP
;        callf                ExitProcess
check_ok:
        ret
;--------------------------------------------------------------------
section        .data        use32
        exc_f                        db                "Exception catched: code=%08x, flags=%08x, address=%08x",13,10
                                        db                "eax=%08x, ebx=%08x, ecx=%08x, edx=%08x, edi=%08x, esi=%08x, ebp=%08x",13,10
                                        db                "eip=%08x, cs=%08x, ds=%08x, es=%08x, fs=%08x, gs=%08x, ss=%08x, esp=%08x",0
        exc_f1                db                "Initial CPU state:",13,10
                                        db                "eax=%08x, ebx=%08x, ecx=%08x, edx=%08x, edi=%08x, esi=%08x, ebp=%08x",13,10
                                        db                "eip=%08x, cs=%08x, ds=%08x, es=%08x, fs=%08x, gs=%08x, ss=%08x, esp=%08x",0
        check_f                db                "Checksum = %08x",0
        check_bad        db                "Code modified - terminating (not really ;P).",0
        end_msg                db                "Terminating.",0
        mid_msg                db                "Causing exception...",0
        debug_msg        db                "Debug",0
        steps_f                db                "Instructions traced: %d",0
;--------------------------------------------------------------------
section        .bss        use32
        txtbuf                resb                1024
        exc_eip                resd                1
        init_eip                resd                1
        steps                        resd                1
;--------------------------------------------------------------------
游客
登录 | 注册 方可回帖
返回