纳智捷u6怎么弄视频:v22005314.epe是病毒吗?

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/08 05:23:45

EncryptPE20050314保护Notepad脱壳

这个壳久闻大名,没有碰过。把Win98的Notepad拿来试试。没用SDK,加壳时
只用了缺省选项,省点事。另外,我只用跟了少量代码,所以很多推断可能完全是
错的。不对的地方请告诉我;-)

看看加壳后的Notepad,没什么东西。只是用exe中的数据改写V22005314.EPE,
然后LoadLibrary,获取EncryptPE_Init地址后call。对比一下EPE主程序和加壳后
Notepad释放出的V22005314,是一样的,即这个文件中没有特定保护程序的信息,
LoadLibrary后的初始化动作是固定的。区别在调用EncryptPE_Init的时候:

EPE1:0040D2A4calldwordptr[eax];GetProcAddress取
EPE1:0040D2A4;EncryptPE_Init
EPE1:0040D2A6cmpeax,0
EPE1:0040D2A9jzshortloc_40D2C3
EPE1:0040D2ABmovebx,eax
EPE1:0040D2ADmoveax,ebp
EPE1:0040D2AFaddeax,171h
EPE1:0040D2B4movecx,[eax]
EPE1:0040D2B6movedx,[eax+4]
EPE1:0040D2B9addeax,9
EPE1:0040D2BCaddeax,edx
EPE1:0040D2BEaddeax,ecx
EPE1:0040D2C0pusheax;477ecc
EPE1:0040D2C1callebx

40D2C0处push的参数指向Notepad的加密数据。

V22005314.EPE是个加壳的dll,用ESP定律即可轻松脱掉。开始想用脱壳的dll代
替原始文件,关闭Notepad内重写dll的代码,这样也许可以调试。后来发现dll内自校
验太多,难以清除干净,只好作罢。不过脱壳的V22005314.EPE可以拿来反汇编,帮助
理解。

程序运行的时候,OD进程被杀掉(开始在re-pair修改过的OD下可以跑,后来不知为
什么又不行了。不过得到个有用的信息,dll没有使用SEH,可以放心设置硬件断点)。
我用OD的LoadDll跟了部分初始化代码。调试用DriverStudio3.2/IceExt0.67,在
WinXP下脱壳。

1.InsideV22005314.EPE

当Notepad调用LoadLibrary,这个dll就全面插手了;-)。如果是初次运行,会安装
一个WH_CALLWNDPROC类型的钩子。

EPE0:711AB9E2loc_711AB9E2:;CODEXREF:EPE0:711AB9D5
EPE0:711AB9E2pushoffsetdwCriticalSection
EPE0:711AB9E7callLeaveCriticalSection_0
EPE0:711AB9ECcmpds:bFileMappingObjCreated,0
EPE0:711AB9F3jzloc_711ABA87
EPE0:711AB9F9push0;system-widehook
EPE0:711AB9F9;装了个全局钩子
EPE0:711AB9FBmoveax,ds:hInstance;71120000,v22005314.epe的handle
EPE0:711ABA00pusheax
EPE0:711ABA01moveax,offsetf_hook_proc
EPE0:711ABA06pusheax
EPE0:711ABA07push4;WH_CALLWNDPROC
EPE0:711ABA07;Installsahookprocedurethatmonitors
EPE0:711ABA07;messagesbeforethesystemsendsthemto
EPE0:711ABA07;thedestinationwindowprocedure
EPE0:711ABA09callSetWindowsHookExA
EPE0:711ABA0Emovds:hKernelObject,eax
EPE0:711ABA13cmpds:hKernelObject,0

调用SetWindowsHookEx的dwThreadId参数为0,意味着这是个system-wide钩子,所有
的线程都会被拦截。钩子为WH_CALLWNDPROC类型,即当thread调用SendMessage时,安装的
Hook函数将被调用。对于GUI程序,SendMessage调用无疑是很频繁的。所以,在call
SetWindowsHookEx执行后,Hook函数立即就得到机会执行了。

通过设置钩子,V22005314.EPE被注入到几乎所有的进程。可以运行几个程序试试,
用LoadPE的regiondump可以看到,dll被映射到了71120000地址,即V22005314.EPE的
预设Imagebase(如果是大程序,可能被重定位到其他地址)。

注意,不是所有的进程。如果程序不调用SendMessage,如果是个console程序,就可
以保持清白;-)。进程隐藏也是用Hook实现的(对任务管理器网开一面,允许列出进程)。
写个console程序,直接调用PSAPI中的函数,可以列出隐藏的Notepad进程,OpenProcess,
将其dump出来。

DLL通过查找Desktop窗口来得到Explorer的PID,与GetCurrentProcessId结果比较,如
果相同还要检测文件名是否为"EXPLORER.EXE",以判断是否运行在Explorer进程内。只有
在Explorer内,才负责对Notepad解码,创建子进程。即加壳Notepad的运行牵涉到3个进程,
Notepad父进程,Explorer(真正的父进程,WaitForDebugEvent循环在这里)和Notepad子进
程。由于调试子进程的代码寄生在Explorer内,用OD来调试不方便。

对于一般的gui进程,dll只是简单地Hook一些敏感api,以达到隐藏进程的目的。进程
隐藏是如何实现的?这个壳并没有进入Ring0。

EPE0:711AE154movesi,edi
EPE0:711AE156pushesi;esi=77F75E55(ntdll.ZwOpenProcess)
EPE0:711AE157callGetCurrentProcess
EPE0:711AE15Cpusheax;hProcess
EPE0:711AE15DcallReadProcessMemory
EPE0:711AE162leaeax,[ebp+NumberOfBytesWritten]
EPE0:711AE165pusheax;lpflOldProtect
EPE0:711AE166push40h;flNewProtect
EPE0:711AE168push5;dwSize
EPE0:711AE16Apushesi;lpAddress
EPE0:711AE16BcallGetCurrentProcess
EPE0:711AE170pusheax;hProcess
EPE0:711AE171callVirtualProtectEx;0006F794FFFFFFFF|hProcess=FFFFFFFF
EPE0:711AE171;0006F79877F75E55|Address=ntdll.ZwOpenProcess
EPE0:711AE171;0006F79C00000005|Size=5
EPE0:711AE171;0006F7A000000040|NewProtect=PAGE_EXECUTE_READWRITE
EPE0:711AE171;0006F7A40006F7D8\pOldProtect=0006F7D8
EPE0:711AE171;
EPE0:711AE176leaeax,[ebp+NumberOfBytesWritten]
EPE0:711AE179pusheax;lpNumberOfBytesWritten
EPE0:711AE17Apush5;nSize
EPE0:711AE17Cleaeax,[ebp+Buffer]
EPE0:711AE17Fpusheax;lpBuffer
EPE0:711AE180pushesi;lpBaseAddress
EPE0:711AE181callGetCurrentProcess
EPE0:711AE186pusheax;hProcess
EPE0:711AE187callWriteProcessMemory;0006F794FFFFFFFF|hProcess=FFFFFFFF
EPE0:711AE187;0006F79877F75E55|Address=77F75E55
EPE0:711AE187;0006F79C0006F7DF|Buffer=0006F7DF
EPE0:711AE187;0006F7A000000005|BytesToWrite=5
EPE0:711AE187;0006F7A40006F7D8\pBytesWritten=0006F7D8
EPE0:711AE187;
EPE0:711AE187;0006F7DF-E96A8323F9jmpF92A7B4E
EPE0:711AE187;
EPE0:711AE18Ctestbl,bl;写入后的代码:
EPE0:711AE18C;
EPE0:711AE18C;77F75E55>-E96A8323F9jmpV2200531.711AE1C4
EPE0:711AE18C;77F75E5ABA0003FE7Fmovedx,7FFE0300
EPE0:711AE18C;77F75E5FFFD2calledx
EPE0:711AE18C;77F75E61C21000retn10
EPE0:711AE18C;
EPE0:711AE18C;把当前进程中的NtOpenProcess替换了
EPE0:711AE18C;以后,OpenProcess不会被拦下
EPE0:711AE18Ejzshortloc_711AE19A
EPE0:711AE190pushoffsetdwCriticalSection
EPE0:711AE195callLeaveCriticalSection_0

这段代码演示了对NtOpenProcess的Hook过程。直接用GetProcAddress取到
api地址,用VirtualProtectEx修改内存属性后写入5bytes,跳到壳代码。当然,
对于console程序是不会执行的。

2.oep寻找,dump与iat修复

应该拦截的api很明显,CreateProcess,WriteProcessMemory,SetThreadContext。
过多地与dll纠缠会使问题复杂化。设置断点时用硬件断点,bpx通不过自校验。

如果想定位感兴趣的代码,可以在SoftIce这样设断:

:bpmbCreateProcessAx
创建childprocess后F12到V22005314.EPE空间。

:proc
得到刚创建的Notepad子进程的KPEB,如81594DA8

:addr81594D18
现在可以对感兴趣的地址(如IAT)下断。

要dumpNotepad,设置以下断点:

:bpmbWriteProcessMemoryxif*(esp+10)==5do"ebesp+100;x"
拦截WriteProcessMemory,当写5bytes时为Hookapi,改为0bytes

:bpmb1B:711E37C5xdo"redx*(ebp-4);x"
在edx中保留正确api地址,避开IAT加密

:bpmbSetThreadContextxif*(*(esp+8)+B8)<500000
拦截SetThreadContext,当context中eip<0x500000时断下,
因为Notepad的oep为4010CC,开卷考试;-)

当SetThreadContext断下后,F12到V22005314.EPE空间:

EPE0:711B07B1pusheax
EPE0:711B07B2callSetThreadContext;这里
EPE0:711B07B7
EPE0:711B07B7loc_711B07B7:;CODEXREF:EPE0:711AFD30
EPE0:711B07B7;EPE0:711AFD65
EPE0:711B07B7;EPE0:711AFDAD
EPE0:711B07B7moveax,[ebp-0E0h]
EPE0:711B07BDxoredx,edx
EPE0:711B07BFpushedx
EPE0:711B07C0pusheax
EPE0:711B07C1leaeax,[ebp-204h]
EPE0:711B07C7callunknown_libname_49;BorlandVisualComponentLibrary&Packages
EPE0:711B07CCleaeax,[ebp-204h]
EPE0:711B07D2pusheax
EPE0:711B07D3leaecx,[ebp-208h]
EPE0:711B07D9movedx,1
EPE0:711B07DEmoveax,26h
EPE0:711B07E3callsub_711AC764
EPE0:711B07E8movedx,[ebp-208h]
EPE0:711B07EEpopeax
EPE0:711B07EFcallSystem::__linkproc__LStrCat(void)
EPE0:711B07F4movedx,[ebp-204h]
EPE0:711B07FAxorecx,ecx
EPE0:711B07FCmoveax,ebx
EPE0:711B07FEcallClasses::TStrings::SetValue(System::AnsiString,System::AnsiString)
EPE0:711B0803jmpshortloc_711B0877;default

F10走到711B0803处jmp。

EPE0:711B0877pushesi;default
EPE0:711B0878moveax,[ebp-0E0h]
EPE0:711B087Epusheax
EPE0:711B087Fmoveax,[ebp-0E4h]
EPE0:711B0885pusheax
EPE0:711B0886callContinueDebugEvent
EPE0:711B088B
EPE0:711B088Bl_wait_for_next_event:;CODEXREF:EPE0:711AFBBF
EPE0:711B088Bpush0FFFFFFFFh;INFINITE
EPE0:711B088Dleaeax,[ebp-0E8h]
EPE0:711B0893pusheax
EPE0:711B0894callWaitForDebugEvent
EPE0:711B0899testeax,eax
EPE0:711B089Bjnzl_debug_event_handler

在711B0887处改eip为711B088B,跳过对ContinueDebugEvent的调用。
然后F5退出SoftIce。现在Explorer在无限等待childprocess,child
process被挂在oep处了。

用LoadPEdump(已经避开了apihook:-),ImportRec修复iat。没有
stolencode,前面SetThreadContext断下时context中的eip就是4010CC。
(也许实战会有;-)

3.修复replacedcode

反汇编dumped_.exe,可以看到replacedcode有3类:

type1对call[iat]的变形

.text:004010D3FF15E4634000callds:GetCommandLineA
被变形为:

EPE0:004010D390nop
EPE0:004010D4E82F915B00callnearptr9BA208h

009BA208FF25E4634000jmp[4063E4]

type2.对mov指令变形

.text:004017AD8935BC574000movstru_4057B0.hDevNames,esi
变为:

EPE0:004017AD90nop
EPE0:004017AEE9E9935D00jmpnearptr9DAB9Ch
009DAB9C8935BC574000mov[4057BC],esi

type3.对jmp[iat]变形

00404FAAFF251C654000jmpds:__imp_CommDlgExtendedError
变为:

EPE0:00404FAAE925F95A00jmpnearptr9B48D4h
009B48D4FF251C654000jmp[40651C]

这种代码变形有2种,原来的6字节FF25xxxxxx可能变为:

E9xxxxxxxx00或
90E9xxxxxxxx

对于Notepad就是这些。我不想费事再去跟代码了,直接写个程序从挂起的子
进程读出代码,修复后写回,再次dump,fixiat。收工。

本文只是抛砖引玉,捏Notepad这个软柿子,实战肯定要麻烦得多了。

是木马