首页
论坛
课程
招聘
anti trick Ⅲ --erase module
2005-10-24 02:00 7848

anti trick Ⅲ --erase module

2005-10-24 02:00
7848
;anti trick Ⅲ --erase module
;by 来自轻院的狼[immlep]
;www.ptteam.com
;http://immlep.blogone.net

一个偶然的机会,在学习PEB的时候,发现擦除EXE文件的模块的话,ImpREC会找不到正确的输入表,因为它找不到那个DLL文件,API监视器无法正确监视API函数,因为它找不到那个DLL文件,当然这只不过是这些API监视器没有用到比较高深的东西,比如native api,所以它们用的信息都是从PEB来的。所以。。

PEB的更详细结构可以查询ntundoc.chm,或baidu查找。。。
PEB的结构:
kd> !strct PEB
!strct PEB
struct _PEB (sizeof=488)
+000 byte InheritedAddressSpace
+001 byte ReadImageFileExecOptions
+002 byte BeingDebugged
+003 byte SpareBool
+004 void *Mutant
+008 void *ImageBaseAddress
+00c struct _PEB_LDR_DATA *Ldr
+010 struct _RTL_USER_PROCESS_PARAMETERS *ProcessParameters
+014 void *SubSystemData
+018 void *ProcessHeap
+01c void *FastPebLock
+020 void *FastPebLockRoutine
+024 void *FastPebUnlockRoutine
+028 uint32 EnvironmentUpdateCount
+02c void *KernelCallbackTable
+030 uint32 SystemReserved[2]
+038 struct _PEB_FREE_BLOCK *FreeList
+03c uint32 TlsExpansionCounter
+040 void *TlsBitmap
+044 uint32 TlsBitmapBits[2]
+04c void *ReadOnlySharedMemoryBase
+050 void *ReadOnlySharedMemoryHeap
+054 void **ReadOnlyStaticServerData
+058 void *AnsiCodePageData
+05c void *OemCodePageData
+060 void *UnicodeCaseTableData
+064 uint32 NumberOfProcessors
+068 uint32 NtGlobalFlag
+070 union _LARGE_INTEGER CriticalSectionTimeout
+070 uint32 LowPart
+074 int32 HighPart
+070 struct __unnamed3 u
+070 uint32 LowPart
+074 int32 HighPart
+070 int64 QuadPart
+078 uint32 HeapSegmentReserve
+07c uint32 HeapSegmentCommit
+080 uint32 HeapDeCommitTotalFreeThreshold
+084 uint32 HeapDeCommitFreeBlockThreshold
+088 uint32 NumberOfHeaps
+08c uint32 MaximumNumberOfHeaps
+090 void **ProcessHeaps
+094 void *GdiSharedHandleTable
+098 void *ProcessStarterHelper
+09c uint32 GdiDCAttributeList
+0a0 void *LoaderLock
+0a4 uint32 OSMajorVersion
+0a8 uint32 OSMinorVersion
+0ac uint16 OSBuildNumber
+0ae uint16 OSCSDVersion
+0b0 uint32 OSPlatformId
+0b4 uint32 ImageSubsystem
+0b8 uint32 ImageSubsystemMajorVersion
+0bc uint32 ImageSubsystemMinorVersion
+0c0 uint32 ImageProcessAffinityMask
+0c4 uint32 GdiHandleBuffer[34]
+14c function *PostProcessInitRoutine
+150 void *TlsExpansionBitmap
+154 uint32 TlsExpansionBitmapBits[32]
+1d4 uint32 SessionId
+1d8 void *AppCompatInfo
+1dc struct _UNICODE_STRING CSDVersion
+1dc uint16 Length
+1de uint16 MaximumLength
+1e0 uint16 *Buffer

_PEB_LDR_DATA *Ldr的结构:
kd> !strct PEB_LDR_DATA
!strct PEB_LDR_DATA
struct _PEB_LDR_DATA (sizeof=36)
+00 uint32 Length
+04 byte Initialized
+08 void *SsHandle
+0c struct _LIST_ENTRY InLoadOrderModuleList      ;存放着模块信息
+0c struct _LIST_ENTRY *Flink                     ;前一个链表成员地址
+10 struct _LIST_ENTRY *Blink                     ;后一个链表成员地址
+14 struct _LIST_ENTRY InMemoryOrderModuleList
+14 struct _LIST_ENTRY *Flink
+18 struct _LIST_ENTRY *Blink
+1c struct _LIST_ENTRY InInitializationOrderModuleList
+1c struct _LIST_ENTRY *Flink
+20 struct _LIST_ENTRY *Blink

typedef struct _LDR_MODULE {

  LIST_ENTRY              InLoadOrderModuleList;
  LIST_ENTRY              InMemoryOrderModuleList;
  LIST_ENTRY              InInitializationOrderModuleList;
  PVOID                   BaseAddress;
  PVOID                   EntryPoint;
  ULONG                   SizeOfImage;
  UNICODE_STRING          FullDllName;
  UNICODE_STRING          BaseDllName;
  ULONG                   Flags;
  SHORT                   LoadCount;
  SHORT                   TlsIndex;
  LIST_ENTRY              HashTableEntry;
  ULONG                   TimeDateStamp;

} LDR_MODULE, *PLDR_MODULE;

代码如下,注意擦除模块有时可能会出现一些问题。。。。。请自己揣摩使用。。

    mov eax, fs:[30h]                  ;Peb
    mov eax, [eax+0Ch]                    ;Ldr
    mov eax, [eax+0Ch]                    ;InLoadOrderModuleList
    mov [ebp+offset pfirstmod], eax
continue:     
    mov ecx, [eax+30h]                ; BaseDllName   模块名                       
    push eax            
    call @F
    db 6Bh,00h,65h,00h,72h,00h,6Eh,00h,65h,00h,6Ch,00h,33h,00h,32h,00h,2Eh,00h,64h,00h,6Ch,00h,6Ch,00h,00h,00h
    ;kernal32.dll
        ;这里是unicode字符串,你也可以写ascii然后用MultiByteToWideChar转为字符串,或者用Four-F的$CTW0
    @@:   
    push ecx                                       
    call [ebp+_lstrcmpiW]                           ;比较是不是我们要擦除的模块,可以添加代码比较擦除多个模块。         
    ;invoke lstrcmpiW, ecx, addr modn                                    
    test eax, eax
    pop eax
    je wipemod                                      ;是就把它擦了。。
    mov eax, [eax]                    
    cmp eax, [ebp+offset pfirstmod]
    jne continue                                    ;继续取下一个模块。
    jmp @F
wipemod:
        push eax                                ;这段代码把链表中一个成员擦除,也就时要擦除的那个模块的信息。
    mov eax, [eax+4]
    mov ebx, [eax]                ; Flink        要擦除
    mov ebx, [ebx]
    mov dword ptr [eax], ebx   
    mov ebx, [eax+4]            ; Blink
    mov ebx, [ebx+4]
    mov dword ptr [eax+4], ebx   
    pop eax
    add eax, 8                                 
    mov eax, [eax+4]
    mov ebx, [eax]                ; Flink
    mov ebx, [ebx]
    mov dword ptr [eax], ebx   
    mov ebx, [eax+4]            ; Blink
    mov ebx, [ebx+4]
    mov dword ptr [eax+4], ebx   
    @@:                           
        ;;;;;;查完所有的模块,跳到这里收工。。。
附加是我把代码加到yoda里面去的了。。

附件:antiod&im.rar

2022 KCTF春季赛【最佳人气奖】火热评选中!快来投票吧~

收藏
点赞0
打赏
分享
最新回复 (12)
雪    币: 205
活跃值: 活跃值 (10)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
南蛮妈妈 活跃值 3 2005-10-24 08:50
2
0
学习PEB

南蛮妈妈觉得输入表总可以取到的
比如把它扣出来,贴到别的程序(只要dll都有), 然后ImportRec取那边的,再修回来...我的南蛮妈妈呀
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
Immlep 活跃值 11 2005-10-24 12:43
3
0
aki搞过。。他就是扣出来,贴到别的程序,然后ImportRec取那边的,再修回来。。。

其实更简单的方法就是,不要执行这段代码就可以了。。
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
q3 watcher 活跃值 2005-10-24 15:40
4
0
"可能会出现一些问题"是那些问题,能不能具体点.XIAORU不会是林心茹吧.
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
Immlep 活跃值 11 2005-10-24 15:46
5
0
最初由 q3 watcher 发布
"可能会出现一些问题"是那些问题,能不能具体点.XIAORU不会是林心茹吧.


如果这程序中要调用到一些API函数,如果这些API函数需要获取模块的话,可能就会出现问题。

我不看《还珠格格》的
雪    币: 118
活跃值: 活跃值 (180)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
Lenus 活跃值 3 2005-10-25 16:09
6
0
好帖啊...期待续集
雪    币: 19
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
pendan2001 活跃值 4 2005-10-25 16:46
7
0
いい见札でした
雪    币: 143
活跃值: 活跃值 (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
采臣·宁 活跃值 1 2005-10-25 20:47
8
0
居然有如此猛贴没留上我的名字,失职了
雪    币: 5536
活跃值: 活跃值 (56)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
forgot 活跃值 26 2005-10-25 22:02
9
0
BTW: ASM ART 教学

Unicode:
dw 'k','e','r'...
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
Immlep 活跃值 11 2005-10-25 22:08
10
0
最初由 forgot 发布
BTW: ASM ART 教学

Unicode:
dw 'k','e','r'...


谢谢,学习
雪    币: 210
活跃值: 活跃值 (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
linestyle 活跃值 2005-10-26 09:15
11
0
这个现象我在脱最新版的Armadillo(最新的Visual Assist)时候遇到过,XP下ImpREC会找不到想要修复资源的DLL名字.后来我也没有具体验证到底是,Armadillo是修改了楼上兄弟说的PEB,还是过滤了LIST的显示名字,呵呵

不过我感觉的我这个问题有点奇怪,在XP他会隐藏那个要修复的DLL.2000下,就可以正常显示,所以我怀疑Armadillo就是修改了PEB.

所以,楼上哥们你的方法在2000测试的还是XP??我怀疑你的方法可能不同平台不通用. 猜测,别见怪:)
雪    币: 200
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:450 )
在线值:
发帖
回帖
粉丝
Immlep 活跃值 11 2005-10-26 13:42
12
0
最初由 linestyle 发布
这个现象我在脱最新版的Armadillo(最新的Visual Assist)时候遇到过,XP下ImpREC会找不到想要修复资源的DLL名字.后来我也没有具体验证到底是,Armadillo是修改了楼上兄弟说的PEB,还是过滤了LIST的显示名字,呵呵

不过我感觉的我这个问题有点奇怪,在XP他会隐藏那个要修复的DLL.2000下,就可以正常显示,所以我怀疑Armadillo就是修改了PEB.

所以,楼上哥们你的方法在2000测试的还是XP??我怀疑你的方法可能不同平台不通用. 猜测,别见怪:)


谢谢楼上,有问题大家讨论 没有看过最新版的Armadillo,不知道是不是也用这个。。。不过这个方法在2k和XP下test过,没什么问题。。
雪    币: 236
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
wangli_com 活跃值 5 2005-10-26 15:09
13
0
加点东西:
typedef struct _LDR_MODULE
{
    LIST_ENTRY        InLoadOrderModuleList;            // +0x00
    LIST_ENTRY        InMemoryOrderModuleList;          // +0x08
    LIST_ENTRY        InInitializationOrderModuleList;  // +0x10
    PVOID             BaseAddress;                      // +0x18
    PVOID             EntryPoint;                       // +0x1c
    ULONG             SizeOfImage;                      // +0x20
    UNICODE_STRING    FullDllName;                      // +0x24
    UNICODE_STRING    BaseDllName;                      // +0x2c
    ULONG             Flags;                            // +0x34
    SHORT             LoadCount;                        // +0x38
    SHORT             TlsIndex;                         // +0x3a
    LIST_ENTRY        HashTableEntry;                   // +0x3c
    ULONG             TimeDateStamp;                    // +0x44
                                                        // +0x48
} LDR_MODULE, *PLDR_MODULE;
游客
登录 | 注册 方可回帖
返回