黑客软件编写基础知识锦囊1


确定Windows和windows系统目录 
有两个SDK函数可以完成该功能。GetWindowsDirectory和GetSystemDirectory,下例说明了如何使用这两个函数: 
TCHAR szDir [MAX_PATH]; 
//Get the full path of the windows directory. 
:: GetWindowsDirectory (szDir, MAX_PATH); 
TRACE ("Windows directory %s\n", szDir); 
//Get the full path of the windows system directory. 
:: GetSystemDirectory (szDir, MAX_PATH); 
TRACE ("Windows system directory %s\n", szDir); 
**********************************************************************************
让程序从CTRL+ATL+DEL消失 
使用Win32 API函数RegisterServiceProcess这里我们使用了汇编。 
#i nclude <windows.h> 
HINSTANCE hLibrary; 
void *regproc; 
void CADInit(void); 
void HideApp(void); 
void ShowApp(void); 
void CADClean(void); 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 

CADInit(); //加载 DLL 并创建一指向它指针 
HideApp(); //隐藏程序 
//ShowApp(); //显示程序 
//其他处理或调用 
CADClean(); //卸载 DLL 
return 0; //retrun 0 因为没有进入消息循环 

void CADInit(void) 

//加载 kernel32.dll 
hLibrary = LoadLibrary("kernel32.dll"); 
//获取函数RegisterServiceProcess的地址 
regproc = GetProcAddress(hLibrary, "RegisterServiceProcess"); 


void HideApp(void) 

//实现程序的隐藏 
__asm 

push 1 
push 0 
call regproc 

return; 


void ShowApp(void) 

//恢复状态 
__asm 

push 0 
push 0 
call regproc 

return; 


void CADClean(void) 

//卸载 DLL 
FreeLibrary(hLibrary); 
return; 

本程序在W2K和Win9x测试通过。 



*********************************************************************************************

程序自杀(进程自己结束自己) 

HMODULE module = GetModuleHandle(0); 
CHAR buf[MAX_PATH]; 
GetModuleFileName(module, buf, sizeof buf); 
CloseHandle(HANDLE(4)); 

 __asm 

lea eax, buf 
push 0 
push 0 
push eax 
push ExitProcess 
push module 
push DeleteFile 
push UnmapViewOfFile 
ret 

return;
******************************************************************************************

操作系统信息 

//结构OSVERSIONINFO包含操作系统的版本信息 
OSVERSIONINFO osvi; 
CString winver,os; 

osvi.dwOSVersionInfoSize=sizof(OSVERSIONINFO); 
GetVersionEx(&osvi); 

switch(osvi.dwPlatformId) 

case 0: 
os="Win 3.X"; 
break; 
case 1: 
os="Win 9X"; 
break; 
case 2: 
os="Win NT/2000/XP"; 
break; 
default: 
os="Other OS"; 
break; 


**************************************************************************************

隐藏你的鼠标 


(注意:注销或重新启动就可以恢复) 

一、建立一个单文档的应用程序框架 
二、为隐藏主窗口,将OnCreate 删除。 
并在App类里修改m_pMainWnd指向ShowWindow(SW_HIDE) 
三、现在在mainframe的实现文件里添加如下内容: 

POINT mp,cursorNew; 

// CMainFrame construction/destruction 
UINT FMouse(LPVOID param) 

int flag=0; 

WINDOWPLACEMENT wp;///窗口位置 
wp.length=sizeof(WINDOWPLACEMENT); 
HWND hWnd; 
char tmp[20]; 
RECT rt; 
hWnd=GetDesktopWindow();GetForegroundWindow(); 
GetWindowPlacement(hWnd,&wp); 
GetWindowRect(hWnd,&rt); 
GetWindowText(hWnd,tmp,20); 

HDC dc=GetDC((HWND)param); 

int iResult; 
iResult=AfxMessageBox("确实要隐藏吗?",MB_OKCANCEL); 
if(iResult==IDOK) 

while(1) 

hWnd=GetForegroundWindow();//GetDesktopWindow(); 
GetWindowRect(hWnd,&rt); 
GetWindowText(hWnd,tmp,20); 
GetWindowPlacement(hWnd,&wp); 
GetCursorPos(&cursorNew); 
while(1){ 
::mouse_event(MOUSEEVENTF_MOVE,cursorNew.x,cursorNew.y,0,0); 



return 0; 

在构造函数里启动线程CMainFrame::CMainFrame() 

HWND hWnd=::GetParent(NULL); 
GetCursorPos(&mp); 
AfxBeginThread(FMouse,hWnd,0); 

************************************************************************************

系统的定时关机 

TOKEN_PRIVILEGES tkp; 
HANDLE hToken; 

if (!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 

MessageBox("OpenProcessToken failed!"); 


LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); //获得本地机唯一的标识 
tkp.PrivilegeCount = 1; 
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); //调整获得的权限 

if (GetLastError() != ERROR_SUCCESS) 

MessageBox("AdjustTokenPrivileges enable failed!"); 


fResult =InitiateSystemShutdown( 
NULL, // 要关的计算机用户名,可在局域网网中关掉对方的机器,NULL表示关本机 
"由于系统不稳定,WINDOWS将在上面的时间内关机,请做好保存工作!", // 显示的消息 
10, // 关机所需的时间 
TRUE, 
TRUE); //设为TRUE为重起,设为FALSE为关机 

if(!fResult) 

MessageBox("InitiateSystemShutdown failed."); 


tkp.Privileges[0].Attributes = 0; 
AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES) NULL, 0); 

if (GetLastError() != ERROR_SUCCESS) 

MessageBox("AdjustTokenPrivileges disable failed."); 


ExitWindowsEx(EWX_SHUTDOWN,0); //开始关机 
***********************************************************************************

程序只运行一个实例,并激活前一个实例 

具体实现: 

1、在程序初始化的时候 (InitInstance()) 枚举所有的窗口,查找本程序的实例是否存在 
2、在主窗口初始化的时候在本窗口的属性列表中添加一个标记,以便程序查找. 

部分关键代码 

1、在App的InitInstance()中枚举所有窗口,查找本程序实例 

HWND oldHWnd = NULL; 
EnumWindows(EnumWndProc,(LPARAM)&oldHWnd); //枚举所有运行的窗口 
if(oldHWnd != NULL) 

AfxMessageBox("本程序已经在运行了"); 
::showWindow(oldHWnd,SW_SHOWNORMAL); //激活找到的前一个程序 
::setForegroundWindow(oldHWnd); //把它设为前景窗口 
return false; //退出本次运行 

2、添加EnumWndProc窗口过程函数://添加的标识只运行一次的属性名 
CString g_szPropName = "Your Prop Name"; //自己定义一个属性名 
HANDLE g_hValue = (HANDLE)1; //自己定义一个属性值 

BOOL CALLBACK EnumWndProc(HWND hwnd,LPARAM lParam) 

HANDLE h = GetProp(hwnd,g_szPropName); 
if( h == g_hValue) 

*(HWND*)lParam = hwnd; 
return false; 

return true; 

3、在主窗口的 OnInitDialog()中添加属性 //设置窗口属性 
SetProp(m_hWnd,g_szPropName,g_hValue); 


***********************************************************************************

探测Windows主机的NetBIOS信息 

NetBIOS信息 
在我们和远程Windows2000/XP主机建立了空会话之后,我们就有权枚举系统里的各项NetBIOS信息了。当然在某些选项中需要较高的权利,不过我们只执行那些匿名用户可以获得的绝大多数系统信息。 

时间:探测远程主机的当前日期和时间信息。它会返回一个数据结构,包括年,月,日,星期,时,分,秒等等。不过得到的是GMT标准时间,当然对于我们来说就应该换算为GMT+8:00了。由此可以判断出主机所在的时区信息。 

操作系统指纹:探测远程主机的操作系统指纹信息。一共有三种级别的探测(100,101,102),我们使用的是101级,它会返回一个数据结构,可以获取远程主机的平台标识,服务器名称,操作系统的主次版本(Windows2000为5.0,WindowsXP为5.1,而最新操作系统Longhorn的版本为6.0),服务器类型(每台主机可能同时包含多种类型信息)和注释。 

共享列表:探测远程主机的共享列表。我们可以获得一个数据结构指针,枚举远程主机的所有共享信息(隐藏的共享列表在内)。其中包括共享名称,类型与备注。类型可分为:磁盘驱动器,打印队列,通讯设备,进程间通讯与特殊设备。 

用户列表: 探测远程主机的用户列表,返回一个数据结构指针,枚举所有用户信息。可获取用户名,全名,用户标识符,说明与标识信息。标识信息可以探测用户的访问权限。 

本地组列表: 探测远程主机的本地组列表信息。枚举所有本地组信息,包含本地组名称和注释信息。 

组列表: 探测远程主机的组列表信息。枚举所有的组信息,包括组名称,注释,组标识符与属性。在此基础上,我们可以枚举组内的所有用户信息。 

组用户列表: 探测特定组内的用户信息。我们可以获得组内所有用户的名称。当我门获得了所有的用户列表,下一步就应该很清楚了,那就是挂一个字典进行破解了。 

传输协议列表: 探测远程主机的传输协议信息,枚举所有的传输列表。可以获得每个传输协议的名称,地址,网络地址和当前与本传输协议连接的用户数目。 

会话列表: 探测远程主机的当前会话列表。枚举每个会话的相关信息,包括客户端主机的名称,当前用户的名称,活动时间和空闲时间。这可以帮助我们了解远程主机用户的喜好等等。 

主要函数与相关数据结构分析 

1. 建立空会话 
WNetAddConnection2(&nr,username,password,0); 
//nr为NETRESOURCE数据结构的对象; 
//username为建立空会话的用户名,在此将用户名设置为NULL; 
//password为登陆密码,在此将密码设置为NULL; 
2. 撤消空会话 
WNetCancelConnection2(ipc,0,TRUE); 
//ipc为TCHAR的指针,我们可以这样获得: 
//swprintf(ipc,_T("\\\\%s\\ipc$"),argv[1]),argv[1]为主机名或地址; 

3. 探测主机时间 
nStatus=NetRemoteTOD(server,(PBYTE*)&pBuf); 
//参数server为主机的名称或地址; 
//pBuf为TIME_OF_DAY_INFO数据结构的指针; 
//nStatus为NET_API_STATUS成员; 

4. 探测操作系统指纹 
NetServerGetInfo(server,dwLevel,(PBYTE *)&pBuf); 
//dwLevel为等级数,我们选择的是101级; 
//pBuf是SERVER_INFO_101数据结构的指针; 

5. 探测共享列表 
NetShareEnum(server,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume); 
//dwLevel的等级数为1级; 
//pBuf是SHARE_INFO_1数据结构的指针; 
//MAX_PREFERRED_LENGTH指定返回数据的长度; 
//er指明返回的实际可以枚举的成员数目; 
//tr返回所有的成员数目; 
//resume用于继续进行共享搜索; 

6. 探测用户列表 
NetQueryDisplayInformation(server,dwLevel,i,100,0xFFFFFFFF,&dwRec,(PVOID *)&pBuf); 
//dwLevel的等级数为1级; 
//i为枚举的索引; 
//dwRec返回获取的信息数目; 
//pBuf为NET_DISPLAY_USER数据结构的指针; 

7. 探测本地组列表 
NetLocalGroupEnum(server,dwLevel,(PBYTE *)&pBuf,-1,&er,&tr,&resume); 
//dwLevel的等级是1; 
//pBuf返回LOCALGROUP_INFO_1数据结构的指针; 

8. 探测组列表 
NetQueryDisplayInformation(server,dwLevel,i,100,0xFFFFFFFF,&dwRec,(PVOID*)&pGBuf); 
//dwLevel的等级为3; 
//pGBuf返回NET_DISPLAY_GROUP的数据结构指针; 

9. 探测组内的用户 
NetGroupGetUsers(server,pGBuffer->grpi3_name,0,(PBYTE *)&pUBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume); 
//pGBuffer->grpi3_name为组的名称; 
//pUBuf返回GROUP_USERS_INFO_0数据结构的指针; 

10.探测传输协议列表 
NetServerTransportEnum(server,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume); 
//dwLevel的等级为0级; 
//pBuf返回SERVER_TRANSPORT_INFO_0数据结构的指针; 

11.探测会话列表 
NetSessionEnum(server,pszClient,pszUser,dwLevel,(PBYTE *)&pBuf,MAX_PREFERRED_LENGTH,&er,&tr,&resume); 
//pszClient指定客户的地址; 
//pszUser指定用户名; 
//dwLevel的等级是10级; 
//pBuf返回SESSION_INFO_10数据结构的指针; 

12.释放内存 
NetApiBufferFree(pBuf); 
//释放由系统分配的内存空间。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值