腾讯QQ珊瑚虫外挂原理分析(5)
中华网科技 http://tech.china.com
2005-06-23 10:38:15
|
|
|
在win9x下,coralqq.exe先创建QQ的进程,同时也就创建了QQ的暂停的主线程,接着往QQ.exe的内存 写数据,改写QQ.exe的oep从而达到改变程序流程的目的,让其先执行加入了的代码,加载Coralqq.dll, 加载完后再跳到原来的QQ.exe的oep继续执行. 其实在win2000/xp下面完全可以用远程线程的方法来实现加载dll文件,我后来自己编程实现了外挂 这一步. 也许有读者读完这编文章后会问:"加载了coralqq.dll又有什么用?它是怎样显IP的?" 其实,要显IP当然要修改QQ的内存中的代码,而修改内存代码这一步是在加载coralqq.dll的时候由 coralqq.dll完成的.也就是说,在执行LoadLibrary的过程中系统会执行corall.dll的 LibMain ,修改 的过程就在LibMain中完成了!而说到显IP的原理,抱歉,不在我们这编文章的讨论范围之内,我们只是讨论 外挂中"挂"这一步.
下面是我写的代码,可以做出一个顶替Coralqq.exe的程序,但原理上和Coralqq.exe有一点点不同
.586 .model flat, stdcall option casemap :none ; case sensitive
include windows.inc include kernel32.inc includelib kernel32.lib
.data qq db ".QQ.exe",0 ikeyname db "qq",0 isecname db "main",0 szBuffer dw 50 dup(0)
dllname db ".CoralQQ.dll",0 szkernel32 db "Kernel32.dll",0 dllin dd 0 szloadlibrary db "LoadLibraryA",0 oaddr dd 0 wriaddr dd 0 ininame db ".CoralQQ.ini",0
.data? align dword con CONTEXT <> align dword con2 CONTEXT <>
stStartUp STARTUPINFO stProcInfo PROCESS_INFORMATION
.code start: main proc local wrisize:dword ;用来存放要写入的代码的大小 local num:dword local oldpro:dword local lastwri:dword local wribase:dword ;用来存放写入代码的基址 invoke GetPrivateProfileString,offset isecname,offset ikeyname, offset szloadlibrary,offset szBuffer, sizeof szBuffer,offset ininame ;从Coralqq.ini中获取QQ程序的路径 invoke GetModuleHandle,offset szkernel32 invoke GetProcAddress,eax,offset szloadlibrary mov dllin,eax
invoke GetStartupInfo,addr stStartUp invoke CreateProcess,NULL,offset szBuffer,NULL,NULL,FALSE, CREATE_SUSPENDED,NULL,NULL,addr stStartUp,addr stProcInfo ;创建QQ进程 cmp eax,0 jz exit invoke GetVersion test eax,080000000h ;判断操作系统类型 jnz win9x invoke VirtualAllocEx,stProcInfo.hProcess,NULL,01000h,MEM_COMMIT, PAGE_EXECUTE_READWRITE ;在QQ内存中分配空间 mov oaddr,eax invoke WriteProcessMemory,stProcInfo.hProcess,oaddr,offset dllname, sizeof dllname,addr num ;写入数据 invoke CreateRemoteThread,stProcInfo.hProcess,NULL,0,dllin,oaddr,0, addr num ;创建远程线程 invoke CloseHandle,eax invoke ResumeThread,stProcInfo.hThread ;让QQ继续运行 invoke ExitProcess,0 ret
win9x: mov wribase,oepwrite mov wrisize,codeend-oepwrite invoke VirtualProtect,wribase,wrisize, PAGE_EXECUTE_READWRITE,addr oldpro ;改变这个程序的要写入代码的地方的属性,其实可以在编译时加上开关
首页 上页 | ...2| 3 | 4 | 5 | 6 | 下页 尾页 共 6 页 |