有。
根据百度百科资料显示,有博主在做王艳平Windows程序设计最后一章的防火墙实例,现在程序能正常运行,通过ping命令测试,能对数据包进行100%的丢弃。
王艳平各人防火墙在实现过程中应用了这些效率和性能改进的策略,并取得了良好效果。
不知道你什么水平,你说的那几本没看过。就从0基础的人来说:
首先C++程序语言本身《C++Primer》是最好的没有之一。
之后开始学VC++,MFC的话,推荐这个顺序梯度:
孙鑫 《VC++深入详解》 这个是比较简单地,而且讲的也比较通透。
看完上面一本,进阶看 侯俊杰的《MFC深入详解》,这本看完MFC这块就差不多了。
然后学习WINDOWS编程,当然Windows这本你可以在《MFC深入详解》之前或者之间去看。
首先是《WINDOWS程序设计》,这个时候应该就能看懂了。
上面这本看完之后,就可以去看:《Windows核心编程》。
除了第一本,其他基本是千页以上,难度由低到高。
另外说一句,《WINDOWS程序设计》的作者是CharlesPetzold,不知道你说的王艳萍是做什么的。《Windows核心编程》的作者是Jeffrey Richter。
推荐使用CreateRemoteThread直接注入DLL,具体方法王艳平那本《WINDOWS程序设计》里有。如果在Win7+系统里想要注入不属于同一个Session的进程,需要直接使用NtCreateThreadEx来注。有一些注入类的工具可以在你测试时手动注入DLL。
如果目标进程是你启动的话,可以在启动时设定CREATE_SUSPENDED,然后用QueueUserAPC(强烈推荐)来加载DLL,之后再用ResumeThread恢复运行。
静态的方法也是有的,如傀儡DLL大法等,不过需要你自己分析依赖项。
注入DLL之后,其余的就太容易了。你可以HOOK掉WriteConsole之类的函数拦截向控制台的写入,也可以用GetStdHandle拿到控制名句柄写东西。
推荐你去买本书
或者找个会的人。。
《C++语言程序设计(第二版)吕凤翥》
仅仅是C++语言的话就用这本教材。若还想学习windows程序的话还可学习下面两本教材:
《windows程序设计(王艳平)》
《windows环境下32位汇编语言程序设计(罗云彬)》
首先要学好数学。。。。
不要盲目的买过多的书。。
上面这些书都是经典的。。
我用的。。。
基本上都是以数学为基础的。。。
祝你早点学成~~~
一、结论:
只可以间接修改
二、原因:
32位字长的Windows 环境是一个“多任务单用户” *** 作系统,运行在X86或者兼容CPU的保护模式上,此模式使每个正在运行的程序(准确的叫法是“进程”,即Windows所调度的“任务”)都有自己独立的4GB逻辑内存空间,所谓保护就是每个进程的4GB内存地址逻辑上彼此独立,CPU和Windows保护每个独立进程的4GB逻辑内存空间不被其他用户进程直接修改。
而且4GB中只有2GB属于本进程专有地址,另外2GB属于Windows系统保护的系统内存空间,受windows系统严格保护,不允许用户进程直接读写只能通过“内核对象”间接访问。
所以您通过某个软件看到了内存地址0x0467A618的内容并试图用自编的VC程序修改时,实际上只能修改自编VC程序运行实例(即“进程”)的同编号进程地址的内容,而不能修改原来的那个进程的内存地址内容。
三、解决方案:
1)思路:
a启动您希望修改其内容的进程,记下您希望修改的地址的内容;
b编写一个VC程序,先按照进程名字获取进程ID,然后搜索这个ID的进程中,非系统内存区域中匹配这个内容的内存地址(注意:从Windows 2000/XP开始的版本,系统保留区域为64K~2GB,2GB以上的才是用户进程内存区域)
c找到内容匹配的内存地址后,将其修改为你希望的值。
2)具体编程方法:
a建立一个名字为MemRepair的VC工程(选择32位控制台工程,使用预编译头)
b陆续加入以下三个文件:
MemRepairh MemRepaircpp MainProgcpp,分别键入以下源代码:
/(完整VC工程源代码,已经在WinXP+VC2008Express环境调试通过)/
/ 新文件 /
/ /
//StdAfxh
#if !defined(AFX_STDAFX_H__7438D592_DA27_443E_824E_D280AF259D3F__INCLUDED_)
#define AFX_STDAFX_H__7438D592_DA27_443E_824E_D280AF259D3F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// TODO: reference additional headers your program requires here
#include "MemRepairh"
//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line
#endif // !defined(AFX_STDAFX_H__7438D592_DA27_443E_824E_D280AF259D3F__INCLUDED_)
/ 新文件 /
/ /
//MemRepairh
#ifndef __MEMFINDER_H__
#define __MEMFINDER_H__
#include <windowsh>
class CMemFinder
{
public:
CMemFinder(DWORD dwProcessId);
virtual ~CMemFinder();
// 属性
public:
BOOL IsFirst() const { return m_bFirst; }
BOOL IsValid() const { return m_hProcess != NULL; }
int GetListCount() const { return m_nListCnt; }
DWORD operator [](int nIndex) { return m_arList[nIndex]; }
// *** 作
virtual BOOL FindFirst(DWORD dwValue);
virtual BOOL FindNext(DWORD dwValue);
virtual BOOL WriteMemory(DWORD dwAddr, DWORD dwValue);
// 实现
protected:
virtual BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue);
DWORD m_arList[1024]; // 地址列表
int m_nListCnt; // 有效地址的个数
HANDLE m_hProcess; // 目标进程句柄
BOOL m_bFirst; // 是不是第一次搜索
};
#endif // __MEMFINDER_H__
/ 新文件 /
/ /
//MemRepaircpp
#include "MemRepairh"
#include "StdAfxh"
CMemFinder::CMemFinder(DWORD dwProcessId)
{
m_nListCnt = 0;
m_bFirst = TRUE;
m_hProcess = ::OpenProcess(PROCESS_VM_READ|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, dwProcessId);
}
CMemFinder::~CMemFinder()
{
if(m_hProcess != NULL)
::CloseHandle(m_hProcess);
}
BOOL CMemFinder::FindFirst(DWORD dwValue)
{
const DWORD dwOneGB = 102410241024; // 1GB
const DWORD dwOnePage = 41024; // 4KB
if(m_hProcess == NULL)
return FALSE;
// 查看 *** 作系统类型,以决定开始地址
DWORD dwBase;
OSVERSIONINFO vi = { sizeof(vi) };
::GetVersionEx(&vi);
if (vidwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
dwBase = 410241024; // Windows 98系列,4MB
else
dwBase = 6401024; // Windows NT系列,64KB
// 在开始地址到2GB的地址空间进行查找
for(; dwBase < 2dwOneGB; dwBase += dwOnePage)
{
// 比较1页大小的内存
CompareAPage(dwBase, dwValue);
}
m_bFirst = FALSE;
return TRUE;
}
BOOL CMemFinder::CompareAPage(DWORD dwBaseAddr, DWORD dwValue)
{
// 读取1页内存
BYTE arBytes[4096];
if(!::ReadProcessMemory(m_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL))
return FALSE; // 此页不可读
// 在这1页内存中查找
DWORD pdw;
for(int i=0; i<(int)41024-3; i++)
{
pdw = (DWORD)&arBytes[i];
if(pdw[0] == dwValue) // 等于要查找的值?
{
if(m_nListCnt >= 1024)
return FALSE;
// 添加到全局变量中
m_arList[m_nListCnt++] = dwBaseAddr + i;
}
}
return TRUE;
}
BOOL CMemFinder::FindNext(DWORD dwValue)
{
// 保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int nOrgCnt = m_nListCnt;
m_nListCnt = 0;
// 在m_arList数组记录的地址处查找
BOOL bRet = FALSE; // 假设失败
DWORD dwReadValue;
for(int i=0; i<nOrgCnt; i++)
{
if(::ReadProcessMemory(m_hProcess, (LPVOID)m_arList[i], &dwReadValue, sizeof(DWORD), NULL))
{
if(dwReadValue == dwValue)
{
m_arList[m_nListCnt++] = m_arList[i];
bRet = TRUE;
}
}
}
return bRet;
}
BOOL CMemFinder::WriteMemory(DWORD dwAddr, DWORD dwValue)
{
return ::WriteProcessMemory(m_hProcess, (LPVOID)dwAddr, &dwValue, sizeof(DWORD), NULL);
}
/ 新文件 /
/ /
//主程序mainprogcpp
#include "stdafxh"
#include "windowsh"
#include "stdioh"
#include <iostream>
using namespace std;
BOOL FindFirst(DWORD dwValue); // 在目标进程空间进行第一次查找
BOOL FindNext(DWORD dwValue); // 在目标进程地址空间进行第2、3、4……次查找
DWORD g_arList[1024]; // 地址列表
int g_nListCnt; // 有效地址的个数
HANDLE g_hProcess; // 目标进程句柄
//////////////////////
BOOL WriteMemory(DWORD dwAddr, DWORD dwValue);
void ShowList();
int main(int argc, char argv[])
{
// 启动02testor进程
char szFileName[] = "\\02testor\\debug\\02testorexe";
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
::CreateProcess(NULL, szFileName, NULL, NULL, FALSE,
CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
// 关闭线程句柄,既然我们不使用它
::CloseHandle(pihThread);
g_hProcess = pihProcess;
// 输入要修改的值
int iVal;
printf(" Input val = ");
scanf("%d", &iVal);
// 进行第一次查找
FindFirst(iVal);
// 打印出搜索的结果
ShowList();
while(g_nListCnt > 1)
{
printf(" Input val = ");
scanf("%d", &iVal);
// 进行下次搜索
FindNext(iVal);
// 显示搜索结果
ShowList();
}
// 取得新值
printf(" New value = ");
scanf("%d", &iVal);
// 写入新值
if(WriteMemory(g_arList[0], iVal))
printf(" Write data success \n");
::CloseHandle(g_hProcess);
return 0;
}
BOOL CompareAPage(DWORD dwBaseAddr, DWORD dwValue)
{
// 读取1页内存
BYTE arBytes[4096];
if(!::ReadProcessMemory(g_hProcess, (LPVOID)dwBaseAddr, arBytes, 4096, NULL))
return FALSE; // 此页不可读
// 在这1页内存中查找
DWORD pdw;
for(int i=0; i<(int)41024-3; i++)
{
pdw = (DWORD)&arBytes[i];
if(pdw[0] == dwValue) // 等于要查找的值?
{
if(g_nListCnt >= 1024)
return FALSE;
// 添加到全局变量中
g_arList[g_nListCnt++] = dwBaseAddr + i;
}
}
return TRUE;
}
BOOL FindFirst(DWORD dwValue)
{
const DWORD dwOneGB = 102410241024; // 1GB
const DWORD dwOnePage = 41024; // 4KB
if(g_hProcess == NULL)
return FALSE;
// 查看 *** 作系统类型,以决定开始地址
DWORD dwBase;
OSVERSIONINFO vi = { sizeof(vi) };
::GetVersionEx(&vi);
if (vidwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
dwBase = 410241024; // Windows 98系列,4MB
else
dwBase = 6401024; // Windows NT系列,64KB
// 在开始地址到2GB的地址空间进行查找
for(; dwBase < 2dwOneGB; dwBase += dwOnePage)
{
// 比较1页大小的内存
CompareAPage(dwBase, dwValue);
}
return TRUE;
}
BOOL FindNext(DWORD dwValue)
{
// 保存m_arList数组中有效地址的个数,初始化新的m_nListCnt值
int nOrgCnt = g_nListCnt;
g_nListCnt = 0;
// 在m_arList数组记录的地址处查找
BOOL bRet = FALSE; // 假设失败
DWORD dwReadValue;
for(int i=0; i<nOrgCnt; i++)
{
if(::ReadProcessMemory(g_hProcess, (LPVOID)g_arList[i], &dwReadValue, sizeof(DWORD), NULL))
{
if(dwReadValue == dwValue)
{
g_arList[g_nListCnt++] = g_arList[i];
bRet = TRUE;
}
}
}
return bRet;
}
// 打印出搜索到的地址
void ShowList()
{
for(int i=0; i< g_nListCnt; i++)
{
printf("%08lX \n", g_arList[i]);
}
}
BOOL WriteMemory(DWORD dwAddr, DWORD dwValue)
{
return ::WriteProcessMemory(g_hProcess, (LPVOID)dwAddr, &dwValue, sizeof(DWORD), NULL);
}
以上就是关于真的有人成功运行了王艳平的个人防火墙系统吗全部的内容,包括:真的有人成功运行了王艳平的个人防火墙系统吗、VC++ 学过的给个学习路线啥的 就是看看什么书比较好、在windows中怎样实现对 cmd控制台的 程序注入等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)