鱼C论坛

 找回密码
 立即注册
查看: 4512|回复: 27

[技术交流] 今天开始与大家一起进入win32编程,让大家从入门到核心,然后到驱动,网络的编写

[复制链接]
发表于 2013-11-5 10:48:37 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

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

x
今天开始与大家一起进入win32编程,让大家从入门到核心,然后到驱动,网络的编写,最后WG的探索,封包的分析,对程序的进行分析漏洞等,我将每天所学全部发出来与大家共享,大家一起讨论.........................
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-11-5 10:49:20 | 显示全部楼层
求加精...........
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 10:51:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 10:55:17 | 显示全部楼层
前排 怎么一起学?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 11:10:52 | 显示全部楼层
支持,前排就坐,搬个小凳子等。。。。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 11:43:32 | 显示全部楼层
尼玛这是坑爹??怎么一起学?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 13:12:40 | 显示全部楼层
今天给大家带来线程同步事件代码

DWORD EventThread()
{       
        HANDLE hThread;
        DWORD i;
        for(i=0;i<3;i++)
        {
                hwriteEvent[i]=CreateEvent(NULL,FALSE,FALSE,NULL);//创建3个写事件
                if(hwriteEvent[i]==NULL)
                {
                        return GetLastError();
                }

                hReadEvent[i]=CreateEvent(NULL,FALSE,FALSE,NULL);//创建3个写事件
                if(hReadEvent==NULL)
                {
                        return GetLastError();
                }
                //创建3个读线程
                hThread=CreateThread(NULL,0,hThreadFun,(LPVOID)i,0,NULL);//线程的参数是自己等待事件的对象
                if(hThread==NULL)
                {
                        return GetLastError();
                }
        }
        writetobuff(i);//主线程运行写事件的函数代码
        return FALSE;
}

//主线程的写入函数
DWORD writetobuff(DWORD i)
{
        DWORD j,s;
        for(j=0;j<5;j++)
        {
                Sleep(700);//模拟时间
                wsprintf(str,"%d",j);
                for(s=0;s<i;s++)
                {        //写入一次后将3个写事件全部设置为标记的,标记后代码会运行到上面的Sleep暂停主线程,由于是将3个些事件设置为呢标记,
                        //剩下的3个事件是被子线程等待的,请看下面子线程函数的等待代码,那么剩下的就是3个读线程和3个读事件,那么子线程开始执行
                        if(!SetEvent(hwriteEvent[s]))
                        {
                                return GetLastError();
                        }
                }
        }
        return FALSE;
}

//子线程的读取函数
DWORD WINAPI hThreadFun(LPVOID lp)
{        HWND hwnd;
        HDC hdc;
        BYTE readbuff[16];
        DWORD j,m;
        for(j=0;j<5;j++)
        {
                m=WaitForSingleObject(hwriteEvent[(DWORD)lp],INFINITE);//子线程等待自己的事件对方是否被标记
                switch(m)
                {
                case WAIT_OBJECT_0:
                       
                        CopyMemory(readbuff,str,16);//当复制完成将本子线程暂停,那么剩下子线程将会启动
                        Sleep(200);//模拟时间
                        //当暂停时间到后将执行下面的代码
                        break;
                default:
                        return GetLastError();
                        break;
                }
                if(!SetEvent(hReadEvent[(DWORD)lp]))
                {
                        return GetLastError();
                }
                hwnd=FindWindow("window","window");
                hdc=GetDC(hwnd);
                TextOut(hdc,0,y,(LPSTR)readbuff,1);
                y+=14;
        }
        return FALSE;
}
看不懂的QQ我 1094017178
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 13:17:13 | 显示全部楼层
dll注入代码
DWORD createremotethread( LPSTR lp)
{
//HWND hwnd;
//远程线程
/*如果某进程具有特定权限,可以为某进程创建远程线程,需要将线程函数代码和参数写到目标进程的空间去
hProcess [in]
线程所属进程的进程句柄.
该句柄必须具有 PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE,和PROCESS_VM_READ 访问权限.
lpThreadAttributes [in]
一个指向 SECURITY_ATTRIBUTES 结构的指针, 该结指定了线程的安全属性.
dwStackSize [in]
线程初始大小,以字节为单位,如果该值设为0,那么使用系统默认大小.
lpStartAddress [in]
在远程进程的地址空间中,该线程的线程函数的起始地址.
lpParameter [in]
传给线程函数的参数.
dwCreationFlags [in]
线程的创建标志.
*/
DWORD pid;
LPVOID Virtual;
PTHREAD_START_ROUTINE fnRemote;
HANDLE hRemoteThread,hprocess;
//hwnd=FindWindow("window","window");
/*
if(hmodule=LoadLibrary("dllk.dll"))
{
        pidd = GetCurrentProcessId();
        h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidd);
       
        h=GetCurrentProcess();
        ls=(messagebox)(GetProcAddress(hmodule,"messagebox"));
        ls("true","true");
        if(GetLastError())
        {
                return GetLastError();
        }
}
else
{
        return GetLastError();
}
*/
if(EnablePrivilege("SE_DEBUG_NAME")!=0)//提升权限
{
MessageBox(NULL,"令牌权限提升失败","error",MB_OK);
}
GetProcessIdByname("模板.exe",&pid);//获得远程进程ID
hprocess=OpenProcess(PROCESS_ALL_ACCESS,0,pid);//打开远程进程获得远程进程句柄
if(hprocess==NULL)
MessageBox(NULL,"打开进程失败","错误",MB_OK);



Virtual=VirtualAllocEx(hprocess,NULL,lstrlen(lp)+1,MEM_COMMIT,PAGE_READWRITE);//在远程进程创建虚拟内存

if(!WriteProcessMemory(hprocess,Virtual,lp,lstrlen(lp)+1,NULL))//将数据复制到远程进程
{
        return GetLastError();
}
if( !(fnRemote=(PTHREAD_START_ROUTINE)GetProcAddress(LoadLibrary("kernel32.dll"),"LoadLibraryA")) )
{       
       
        return GetLastError();
}
if(!(hRemoteThread=CreateRemoteThread(hprocess,NULL,0,fnRemote,Virtual,0,NULL)))//创建远程线程
{
        return GetLastError();
}

WaitForSingleObject(hRemoteThread,INFINITE);//等待远程进程执行完成
CloseHandle(hRemoteThread);
ExitProcess(0x0);
}

DWORD  GetProcessIdByname(LPSTR lp,LPDWORD PID)//获得想要的进程ID
{
char str[30];
BOOL bl=FALSE;
HANDLE Snapshot;
PROCESSENTRY32 me;
//如果参数2为0函数找到参数一直到的所有进程信息,如果指定呢参数二不为0那么找到参数二PID所有进程信息
Snapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//注意此函数在tlhelp32.h中注意包含文件
if(!Process32First(Snapshot,&me))//此函数和查找文件的FindFirstFile()函数相同用法,但参数不同,用来查找进程
{
MessageBox(NULL,"Process32First()函数调用失败" ,"错误",MB_OK);
return FALSE;
}
        do
        {
        if(lstrcmpi(me.szExeFile,(LPSTR)lp)==0)//比较进程名字
                {
                        *PID=me.th32ProcessID;
                        CloseHandle(Snapshot);
                        bl=TRUE;
                }
        }
        while(Process32Next(Snapshot,&me));
        if(!bl)
        {
        sprintf(str,"没有找到%s",(LPSTR)lp);
        MessageBox(NULL,"str" ,"错误",MB_OK);
        CloseHandle(Snapshot);//关闭句柄
        }
        return FALSE;
}
BOOL EnablePrivilege(LPSTR lp)//提升进程权限
{
HANDLE hken;
TOKEN_PRIVILEGES ken;
LookupPrivilegeValue(NULL,lp,&ken.Privileges[0].Luid);//获得系统令牌信息
ken.PrivilegeCount=1;//特权的数组个数
ken.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//启用特权令牌
OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hken);//得到当前进程的令牌
AdjustTokenPrivileges(hken,FALSE,&ken,sizeof(ken),0,0);//设置令牌
//CloseHandle(hken);
return (GetLastError()==ERROR_SUCCESS) ;//返回错误信息
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 13:20:04 | 显示全部楼层
还有很多,以后将每天发表............
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 13:20:37 | 显示全部楼层
请大家多多关注下............
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 13:24:23 | 显示全部楼层
下面是对进程的一些了解
#include<stdio.h>
#include<windows.h>
#include<Error.h>
#include<Psapi.h>//包含进程状态的api头文件
#include<Tlhelp32.h>//包含运行的程序的程序信息函数文件
#define ID_BUTTON1 1
#define buff MAX_PATH
#define TYPE_LEVEL 0x1
#define TYPE_VETRICAL 0x2
DWORD buffs[1024];
DWORD size;
int d=0;
struct jiegou
{
        int x;
        int y;
}JG;
DWORD writeprocessmemory(HANDLE hp,DWORD zhi);
BOOL Readprocessmemory(LPSTR lp,DWORD ints,DWORD zhi);
BOOL Compareapage(HANDLE hremoteprocess,DWORD base,DWORD ints);
BOOL processheap(DWORD pid);
BOOL EnablePrivilege(LPSTR lp);
void modulefirst(LPVOID lp);
void getEnumprocessid();
void Firstprocessid(LPVOID lp);
void PrintfString(HWND hwnd,HDC hdc,LPSTR lp,int h,DWORD type);
LRESULT CALLBACK WinProc(HWND ,UINT ,WPARAM ,LPARAM);
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{       
        HDC hdc;
        MSG msg;
        HWND hwnd;
        WNDCLASSEX wc;
        wc.style=CS_HREDRAW|CS_VREDRAW;
        wc.cbSize=sizeof(wc);
        wc.lpfnWndProc=WinProc;
        wc.hInstance=hInstance;
        wc.cbClsExtra=0;
        wc.cbWndExtra=0;
        wc.hIcon=NULL;
        wc.hIconSm=NULL;
        wc.hCursor=LoadCursor(NULL,IDC_ARROW);
        wc.hbrBackground=(HBRUSH)GetStockObject(2);
        wc.lpszClassName="window";
        wc.lpszMenuName=NULL;
        if(!RegisterClassEx(&wc))
        {
                MessageBox(NULL,"注册窗口失败","ERROR",MB_OK);
        }
        hdc=CreateDC("DISPLAY",NULL,NULL,NULL);
        JG.x=GetDeviceCaps(hdc,8);
        JG.y=GetDeviceCaps(hdc,10);
        hwnd=CreateWindow("window","window",WS_OVERLAPPEDWINDOW,JG.x/2-200,JG.y/2-200,400,400,NULL,NULL,hInstance,NULL) ;
        ShowWindow(hwnd,nCmdShow);
        UpdateWindow(hwnd);
        while(GetMessage(&msg,NULL,0,0))
        {
                TranslateMessage(&msg);
                DispatchMessage(&msg);
        }
        return msg.wParam;
}
LRESULT CALLBACK WinProc(HWND hwnd,UINT message ,WPARAM wparam,LPARAM lparam)
{

        HDC hdc;
        PAINTSTRUCT ps;
        RECT rect;
        int x,y;
        HWND hbutton1;
        switch(message)
        {
        case WM_CREATE:
                GetClientRect(hwnd,&rect);
                x=rect.right;
                y=rect.bottom;
                hbutton1=CreateWindow("button","按钮1",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON,x/2-20,y-20,40,20,hwnd,(HMENU)ID_BUTTON1,((LPCREATESTRUCT)lparam)->hInstance,NULL);break;
        case WM_PAINT:
                hdc=BeginPaint(hwnd,&ps);
                /*                                                                                                                        code位置                                                                                */
                /*                                                                                                                                ↓                                                                                        */
                //processheap(3048);
                //getEnumprocessid();                                                                                                       
                //Firstprocessid("360tray.exe");
                //modulefirst("Psapi.dll");
                /*                                                                                                                                ↑                                                                                        */
                /*                                                                                                                        code数位置                                                                                */
                EndPaint(hwnd,&ps);
                break;
        case WM_COMMAND:
                switch(LOWORD(wparam))
                {
                case ID_BUTTON1:
                        /*                                                                                                                        code位置                                                                                */
                        /*                                                                                                                                ↓                                                                                        */
                        Readprocessmemory("模板.exe",(DWORD)'M',(DWORD)'S');

                        /*                                                                                                                                ↑                                                                                        */
                        /*                                                                                                                        code数位置                                                                                */
                        InvalidateRect(hwnd,NULL,TRUE);
                        break;
                };
                break;
        case 0x2:
                PostQuitMessage(0); break;
        }
        return DefWindowProc(hwnd,message,wparam,lparam);
}
//PS API是获取进程状态信息的一系列API的合称,这些API在Psapi.h头文件中定义 Psapi.dll
//Tool help api提供呢用于获取执行中的应用程序信息,一般情况下可以与PS API配合使用,Tool help API 由Tlhelp.h头文件定义,Kerenl32,DLL

//获得所有进程的所有进程名和进程的所有模块路径
void getEnumprocessid()
{
        int x,y=0, m,k;
        HWND hwnd;
        HDC hdc;
        DWORD pid[MAX_PATH],ints,me;
        HANDLE hProcess;
        HMODULE module[MAX_PATH];
        //参数1为保持进程ID的数组
        //2为数组大小
        //写入的数据大小
        hwnd=FindWindow("window","window");//查找指定的窗口,得到窗口句柄,此处是查找自己的
        hdc=GetDC(hwnd);//获得窗口句柄的DC设备
        if(EnablePrivilege("SE_DEBUG_NAME"))//提升权限
                MessageBox(NULL,"特权令牌失败","error",MB_OK);
        EnumProcesses(pid,MAX_PATH,&ints);//获得系统中所有进程PID,注意参数3为写入的数据大小
        x=ints/sizeof(DWORD);//得到写入呢多少进程ID
loop: for(;y<x;y++)
          {
                  char basename[MAX_PATH];
                  hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pid[y]);//通过ID得到进程句柄
                  EnumProcessModules(hProcess,module,sizeof(module),&me);//获取进程的所有模块
                  GetModuleBaseName(hProcess,NULL,basename,MAX_PATH);//获得进程Name

                  if(basename[1]==-52)//如果得到权限那么basename的参数一不可能为空,一旦为空,那么执行loop处开始
                  {
                          y++;
                          goto loop;
                  }
                  TextOut(hdc,0,d,basename,lstrlen(basename));//打印出来
                  d+=15;//分行
                  m=me/sizeof(HMODULE);//得到写入呢多少进程模块
                  for(k=0;k<m;k++)
                  {
                          char Name[MAX_PATH];
                          GetModuleFileNameEx(hProcess,module[k],Name,MAX_PATH);//得到所有模块的完整路径
                          TextOut(hdc,0,d,Name,lstrlen(Name));//打印出来
                          d+=15;
                  }
          }
}
//查找指定程序名查找跟指定程序进程有关的信息
void Firstprocessid(LPVOID lp)
{
        //一下函数可能要包含Tlhelp.h头文件
        HWND hwnd;
        HDC hdc;
        char ch[32],str[MAX_PATH];
        HANDLE Snap;
        PROCESSENTRY32 info;
        info.dwSize=sizeof(PROCESSENTRY32);
        Snap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//获得系统中进程快照
        Process32First(Snap,&info);//获得快照中的第一个进程info
        sprintf(ch,"找到%s",(LPSTR)lp);
        if(lstrcmpi((LPSTR)lp,info.szExeFile)==0)//判断是否找到想要的进程
                MessageBox(NULL,ch,"TRUE",MB_OK);
        do
        {
                if(lstrcmpi((LPSTR)lp,info.szExeFile)==0)
                {
                        hwnd=FindWindow("window","window");
                        hdc=GetDC(hwnd);
                        MessageBox(NULL,ch,"TRUE",MB_OK);
                        //对进程信息,打印
                        sprintf(str,"进程ID:%d 进程默认堆ID: %d 进程模块ID: %d 进程拥有线程记数:%d 父进程PID:%d 线程优先权:%d 进程名称:%s",info.th32ProcessID,info.th32DefaultHeapID,info.th32ModuleID,info.cntThreads,info.th32ParentProcessID,info.pcPriClassBase,info.szExeFile);
                        PrintfString(hwnd,hdc,str,2,0x2|0x1);
                }
        }
        while(Process32Next(Snap,&info));//查找快照中剩下的所有进程
}
//查找模块被什么进程调用
void modulefirst(LPVOID lp)
{
        HWND hwnd;
        HDC hdc;
        HANDLE hsnapmodule,hsnap;//模块快照句柄,进程快照句柄
        char str[MAX_PATH];
        MODULEENTRY32 minfo;
        PROCESSENTRY32 pinfo;
        minfo.dwSize=sizeof(MODULEENTRY32);//设置大小
        pinfo.dwSize=sizeof(PROCESSENTRY32);
        sprintf(str,"找到调用%s模块文件的程序",(LPSTR)lp);
        hwnd=FindWindow("window","window");
        hdc=GetDC(hwnd);
        hsnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);//创建进程快照

        Process32First(hsnap,&pinfo);//获得快照中的第一个进程
        do
        {
                hsnapmodule=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,pinfo.th32ProcessID);//创建模块 快照
                Module32First(hsnapmodule,&minfo);//得到模块快照的第一个模块
                /////////////////////////////////////////////////////////////////////////////////////
                if(lstrcmpi(minfo.szModule,(LPSTR)lp)==0)//对比是否和要查找的相同
                        MessageBox(NULL,str,"TRUE",MB_OK);//提示
                do
                {
                        if(lstrcmpi(minfo.szModule,(LPSTR)lp)==0)
                        {
                                sprintf(str,"进程名称:%s 进程ID: %d 全局模块的使用计数:%d 进程范围内模块的使用计数: %d 基址模块: %d 模块大小:%d 模块句柄:%x 包含模块名:%s 模块路径:%s",pinfo.szExeFile,minfo.th32ProcessID,minfo.GlblcntUsage,minfo.ProccntUsage,minfo.modBaseAddr,minfo.modBaseSize,minfo.hModule,minfo.szModule,minfo.szExePath);
                                PrintfString(hwnd,hdc,str,1,1|2);
                        }
                }
                while(Module32Next(hsnapmodule,&minfo));
                ////////////////////////////////////////////////////////////////////////////////////
        }
        while(Process32Next(hsnap,&pinfo));
}
//获取指定进程内存使用情况
void zdprocessmemory(DWORD pid)
{
        HWND hwnd;
        HDC hdc;
        LPVOID Virtualmemory;
        HANDLE remoteproc;
        PROCESS_MEMORY_COUNTERS pmeminfo;//保存线程的内存结构
        remoteproc=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,pid);//打开远程线程
        if(remoteproc)
                MessageBox(NULL,"远程进程失败","error",MB_OK);
        if(GetProcessMemoryInfo(remoteproc,&pmeminfo,sizeof(pmeminfo)))//获得指定进程的内存使用情况
        {
                Virtualmemory=VirtualAlloc(NULL,1024,MEM_COMMIT,PAGE_READWRITE);
                sprintf((LPSTR)Virtualmemory,"缺页中断次数%d 使用内存高峰%d 当前使用的内存%d 使用页面缓存池高峰%d  使用页面缓存池%d 使用非页面缓存池高峰%d 使用非分页缓存池%d 使用分页文件%d 使用分页文件高峰%d",pmeminfo.PageFaultCount,pmeminfo.PeakWorkingSetSize,pmeminfo.WorkingSetSize,pmeminfo.QuotaPeakPagedPoolUsage,pmeminfo.QuotaPagedPoolUsage,pmeminfo.QuotaPeakNonPagedPoolUsage,pmeminfo.QuotaNonPagedPoolUsage,pmeminfo.PagefileUsage,pmeminfo.PeakPagefileUsage);
                hwnd=FindWindow("window","window");
                hdc=GetDC(hwnd);
                PrintfString(hwnd,hdc,(LPSTR)Virtualmemory,2,1|2);
                VirtualFree(Virtualmemory,0,MEM_RELEASE);
        }
}
//列举进程中的堆
BOOL processheap(DWORD pid)
{
        int error;
        char Name[32];
        char str[MAX_PATH];
        HWND hwnd;
        HDC hdc;
        HANDLE heap,process;
        HEAPLIST32 heapinfo={0};
        HEAPENTRY32 heapinf={0};//记得把堆情零
        PROCESSENTRY32 pinfo={0};
       
        hwnd=FindWindow("window","window");
        hdc=GetDC(hwnd);
        heap=CreateToolhelp32Snapshot(TH32CS_SNAPHEAPLIST,pid);
        process=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        Process32First(process,&pinfo);
        do
        {
                if(pinfo.th32ProcessID==pid)
                {
                                CopyMemory(Name,&(pinfo.szExeFile),lstrlen(pinfo.szExeFile)+1);
                }
        }
        while(Process32Next(process,&pinfo));

        heapinfo.dwSize=sizeof(HEAPLIST32);
        Heap32ListFirst(heap,&heapinfo);
        do
        {               
                heapinf.dwSize=sizeof(HEAPENTRY32);
                if(!Heap32First(&heapinf,heapinfo.th32ProcessID,heapinfo.th32HeapID))
                {
                        MessageBox(NULL,"Heap32First()","error",MB_OK);
                        return FALSE;
                }
                else
                {
                do{       
                        error=GetLastError();
                        if(heapinf.th32ProcessID==pid)
                        {
                        sprintf(str,"进程ID:%d 堆ID:%d 堆句柄:%x  程序名称:%s",heapinf.th32ProcessID,heapinf.th32HeapID,heapinf.hHandle,Name);
                        PrintfString(hwnd,hdc,str,2,3);
                        return TRUE;
                        }
                        heapinf.dwSize=sizeof(HEAPENTRY32);
                }
                while(Heap32Next(&heapinf));
                }
                heapinfo.dwSize=sizeof(HEAPLIST32);
        }while(Heap32ListNext(heap,&heapinfo));
        return FALSE;
}
       

//修改指定进程内存值
BOOL Readprocessmemory(LPSTR lp,DWORD ints,DWORD zhi)
{        char err[5];
        char strerr[64];
        int error;
        HANDLE hprocess,hremoteprocess;
        DWORD pid;
        PROCESSENTRY32 pinfo={0};
        THREADENTRY32 tinfo={0};
        ////////////////////
        DWORD GB=1024*1024*1024;
        DWORD page;
        DWORD base;
        SYSTEM_INFO sinfo;
        MEMORY_BASIC_INFORMATION mInfo;
        SIZE_T T;

        hprocess=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
        pinfo.dwSize=sizeof(PROCESSENTRY32);
        if(!Process32First(hprocess,&pinfo))
        {
                itoa(GetLastError(),err,10);
                MessageBox(NULL,err,"错误",MB_OK);
                return FALSE;
        }
        do{
                if(lstrcmpi(lp,pinfo.szExeFile)==0)
                {
                        pid=pinfo.th32ProcessID;
                }
        }while(Process32Next(hprocess,&pinfo));

//        hthread=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,pid);
/*        tinfo.dwSize=sizeof(THREADENTRY32);

        if(!Thread32First(hthread,&tinfo))
        {
                itoa(GetLastError(),err,10);
                MessageBox(NULL,err,"错误",MB_OK);
                return FALSE;
        }
        do{
                if(tinfo.th32OwnerProcessID==pid)
                {
                        tid=tinfo.th32ThreadID;
                }

        }while(Thread32Next(hthread,&tinfo));
       
*/
        if(EnablePrivilege("CE_DEBUG_NAME"))//提升权限
        {
                MessageBox(NULL,"权限提升失败","错误",MB_OK);
        }


        if(!(hremoteprocess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,pid)))
        {
                itoa(GetLastError(),err,10);
                MessageBox(NULL,err,"错误",MB_OK);
                return FALSE;
        }
/*
        //tid=GetThreadId(hremoteprocess);此函数无法得到进程句柄
        if(!(hremotethread=OpenThread(THREAD_ALL_ACCESS,FALSE,tid)))
        {
                itoa(GetLastError(),err,10);
                MessageBox(NULL,err,"错误",MB_OK);
                return FALSE;
        }
        CloseHandle(hremotethread);
*/       
        GetSystemInfo(&sinfo);//获得系统的信息
        base=sinfo.dwAllocationGranularity;//得到分配粒度进程内存分配的开始
        page=sinfo.dwPageSize;//分页大小
       
        memset(&mInfo, 0, sizeof(MEMORY_BASIC_INFORMATION));

//        ReadProcessMemory(hremoteprocess, (LPCVOID)0x98138,buffs,1,&T);
       
        for(;base<GB*2;base+=page)//32位系统程序和系统各用2GB
        {
                VirtualQueryEx(hremoteprocess, (LPCVOID)base, &mInfo, sizeof(MEMORY_BASIC_INFORMATION));
                if(mInfo.Protect==PAGE_READWRITE)
                {
                Compareapage(hremoteprocess,base,ints);//对每个分页内存进行比较
                }

        }

                        if(error=writeprocessmemory(hremoteprocess,zhi))
                        {       
                                itoa(error,err,10);
                                sprintf(strerr,"写入失败,错误代码:%s",err);
                                MessageBox(NULL,strerr,"错误",MB_OK);
                        //        TerminateProcess(hremoteprocess,0x0);//关闭远程进程
                                return FALSE;
                        }

       
        return TRUE;
}
BOOL Compareapage(HANDLE hremoteprocess,DWORD base,DWORD ints)
{       
        BYTE bByte[4096];
        int i;
        DWORD *dw;
        if(!ReadProcessMemory(hremoteprocess,(LPVOID)base,bByte,4096,NULL))
        {       
        //        MessageBox(NULL,"不可读","错误",MB_OK);
                return FALSE;
        }

       
        for(i=0;i<4096-3;i++)
        {
                dw=(DWORD*)&bByte[i];
                if(*dw == ints)
                {
                        if(size>=1024)
                        {
                                return FALSE;
                        }
                        buffs[size++]=base+i;//将找到对应想要的值的分页地址偏移量放入数组
                }

        }
        return TRUE;

}
//修改内存值
DWORD writeprocessmemory(HANDLE hp,DWORD zhi)
{
        SIZE_T h=0;
        DWORD s;

        for(s=0;s<=size;s++)
        {       
                if(!WriteProcessMemory(hp,(LPVOID)buffs[s],(LPVOID)&zhi,sizeof(DWORD),&h))
                {       
               
                        return GetLastError();
                }

        }
        return FALSE;
}
//文字打印函数
void PrintfString(HWND hwnd,HDC hdc,LPSTR lp,int h,DWORD type)
{       
        int x=0,y=0,size,m,p,height,width,row,ints;
        RECT rect;
        HFONT font;
        TEXTMETRIC text;
        SetTextColor(hdc,RGB(150,0,0));
        SetBkMode(hdc,1);
        font = CreateFont(0, 0, 0, 0, FW_DONTCARE, FALSE, FALSE, FALSE,
                DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
                ANTIALIASED_QUALITY, DEFAULT_PITCH, "新宋体");
        SelectObject(hdc, font);
        GetTextMetrics(hdc,&text);
        GetClientRect(hwnd,&rect);//获得有效矩形
        height=text.tmHeight;//获得字体高度
        width=text.tmAveCharWidth;//字体宽度
        size=lstrlen(lp);//字个数
        ints=rect.right/width;//计算每行可以显示的字
        row=size/ints;//显示的行数]
        if(size%ints>1)//判断最后是否应为不够一行而不被显示的字
                row++;//是,添加一行
        switch(h)
        {
        case 1:TextOut(hdc,0,d,lp,lstrlen(lp));d+=20;break;
        case 2:
                switch(type)
                {
                case TYPE_VETRICAL:
                        if(row==1)//判断是否只有一行
                        {                //对自有一行的对X值进行设置

                                y=rect.bottom/2-(height/2);//有效区域的宽度/2-字符高度/2
                                TextOut(hdc,0,y,lp,lstrlen(lp));
                        }
                        else
                        {
                                for(m=0,p=0;m<row&&(row-m)>1;m++,p--)
                                {       
                                        //对一行整的进行y值调整
                                        y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度

                                        TextOut(hdc,0,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数

                                }

                        }
                        if(row-m==1&&row>1)
                        {       
                                //判断是否已经是最后一行
                                //将最后一行进行垂直居中对齐输出
                                y=(rect.bottom/2-(row*height/2))-(p*height);
                                TextOut(hdc,0,y,&lp[m*ints],lstrlen(&lp[m*ints])+1);
                        }
                        break;
                case TYPE_LEVEL:
                        if(row==1)//判断是否只有一行
                        {               

                                x=rect.right/2-(lstrlen(lp)*(width/2));//有效区域的宽度/2-字符数*字符的一般宽度,得到居中x值
                                TextOut(hdc,x,0,lp,lstrlen(lp));
                        }
                        else
                        {
                                for(m=0,p=0;m<row&&(row-m)>1;m++,p--)
                                {       
                                        //对一行整的进行y值调整
                                        //        y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度

                                        TextOut(hdc,x,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数
                                        y+=height;

                                }
                                if(row-m==1&&row>1)
                                {       
                                        //判断是否已经是最后一行
                                        //将最后一行进行垂直居中对齐输出
                                        x=rect.right/2-(lstrlen(&lp[m*ints])*(width/2));
                                        TextOut(hdc,x,y,&lp[m*ints],lstrlen(&lp[m*ints])+1);
                                }
                        }

                        break;
                case TYPE_LEVEL|TYPE_VETRICAL:


                        if(row==1)//判断是否只有一行
                        {        //对自有一行的对X值进行设置
                                x=rect.right/2-(lstrlen(lp)*(width/2));//有效区域的宽度/2-字符数*字符的一般宽度,得到居中x值
                                y=rect.bottom/2-(height/2);//有效区域的宽度/2-字符高度/2
                                TextOut(hdc,x,y,lp,lstrlen(lp));
                        }
                        p=row;
                        for(m=0,p=0;m<row&&(row-m)>1;m++,p--)
                        {       
                                //对一行整的进行y值调整
                                y=(rect.bottom/2-(row*height/2))-(p*height);//有效区域的宽度/2-行数*字符高度的一般(这样就是第一行输出的位置)-行数*字体高度

                                TextOut(hdc,x,y,&lp[m*ints],ints);//将得到居中x,y之后的字符进行输出,输出长度为一行可以容纳的字数


                        }
                        if(row-m==1&&row>1)
                        {       
                                //判断是否已经是最后一行
                                //将最后一行进行垂直,水平居中对齐输出
                                x=rect.right/2-(lstrlen(&lp[m*ints])*(width/2));
                                y=(rect.bottom/2-(row*height/2))-(p*height);
                                TextOut(hdc,x,y,&lp[m*ints],lstrlen(&lp[m*ints])+1);
                        }
                        DeleteObject(font);
                        break;
                }
                break;
        }
}
//进程权限提升函数
BOOL EnablePrivilege(LPSTR lp)//提升进程权限
{
        HANDLE hken;
        TOKEN_PRIVILEGES ken;//令牌
        LookupPrivilegeValue(NULL,lp,&ken.Privileges[0].Luid);//获得系统令牌信息
        ken.PrivilegeCount=1;//特权的数组个数
        ken.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//启用特权令牌
        OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hken);//得到当前进程的令牌
        AdjustTokenPrivileges(hken,FALSE,&ken,sizeof(ken),0,0);//设置令牌
        //CloseHandle(hken);
        return (GetLastError()==ERROR_SUCCESS) ;//返回错误信息
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 13:39:01 | 显示全部楼层
这怎么看也不像从零基础入门的啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 13:47:44 | 显示全部楼层
请你把精通windows函数,接口,编程实例,看到第7章
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 13:49:23 | 显示全部楼层
这是我现在的进度
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 14:05:31 | 显示全部楼层
不错 都是些基础的东西 感谢分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 14:18:46 | 显示全部楼层
零零基础的过来瞅瞅~LL加油
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 14:58:16 | 显示全部楼层
大哥  你这样贴代码还不如搞个视频,再把代码共享下就行了的哦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-11-5 15:04:22 | 显示全部楼层
初海丶介 发表于 2013-11-5 13:17
dll注入代码
DWORD createremotethread( LPSTR lp)
{

dll注入时需不需要把要注入的dll文件放在目标文件的工程目录下啊,也就是说远程线程函数中让它
library xx.dll, 这个dll文件要放到哪里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 16:57:31 | 显示全部楼层
这个是系统的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-11-5 16:58:12 | 显示全部楼层
不用放哪,只用得到地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-22 21:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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