宝峰科技

 找回密码
 注册

QQ登录

只需一步,快速开始

智能终端设备维修查询系统注册会员邮箱认证须知!
查看: 3154|回复: 3

[VC函数例程] 另类常用C++函数

[复制链接]

该用户从未签到

破解狼人 发表于 2010-10-31 22:15:46 | 显示全部楼层 |阅读模式

欢迎您注册加入!这里有您将更精采!

您需要 登录 才可以下载或查看,没有账号?注册

x
确定Windows和windows系统目录
有两个SDK函数可以完成该功能。GetWindowsDirectory和GetSystemDirectory,下例说明了如何使用这两个函数:

[C++] 纯文本查看 复制代码
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这里我们使用了汇编。

[C++] 纯文本查看 复制代码
#i nclude

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测试通过。



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

[C++] 纯文本查看 复制代码
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;


操作系统信息

[C++] 纯文本查看 复制代码
//结构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的实现文件里添加如下内容:

[C++] 纯文本查看 复制代码
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()
[C++] 纯文本查看 复制代码
{
HWND hWnd=::GetParent(NULL);
GetCursorPos(&mp);
AfxBeginThread(FMouse,hWnd,0);
}


系统的定时关机

[C++] 纯文本查看 复制代码
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()中枚举所有窗口,查找本程序实例

[C++] 纯文本查看 复制代码
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);

该用户从未签到

 楼主| 破解狼人 发表于 2010-10-31 22:16:55 | 显示全部楼层
续:
***********************************************************************************

探测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);
//释放由系统分配的内存空间。
  • TA的每日心情
    开心
    2012-7-29 00:25
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    花心胡萝卜 发表于 2010-11-30 09:58:33 | 显示全部楼层
    好贴,不错!

    该用户从未签到

    a625672175z 发表于 2011-12-19 06:18:12 | 显示全部楼层
          大该的看了下      
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    免责声明

    本站中所有被研究的素材与信息全部来源于互联网,版权争议与本站无关。本站所发布的任何软件编程开发或软件的逆向分析文章、逆向分析视频、补丁、注册机和注册信息,仅限用于学习和研究软件安全的目的。全体用户必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。学习编程开发技术或逆向分析技术是为了更好的完善软件可能存在的不安全因素,提升软件安全意识。所以您如果喜欢某程序,请购买注册正版软件,获得正版优质服务!不得将上述内容私自传播、销售或者用于商业用途!否则,一切后果请用户自负!

    QQ|Archiver|手机版|小黑屋|联系我们|宝峰科技 ( 滇公网安备 53050202000040号 | 滇ICP备09007156号-2 )

    Copyright © 2001-2023 Discuz! Team. GMT+8, 2025-5-8 01:55 , File On Powered by Discuz! X3.49

    快速回复 返回顶部 返回列表