by测试题-未完

// GetFilePathByPid.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

int main()

{

BOOL b = FALSE;

HANDLE hnd = NULL;

PROCESSENTRY32 pe = {0};

DWORD dwPid2Inject = 0;

//char szRawFilePath[MAX_PATH] = {0};

WCHAR *szRawFilePath ;

WCHAR *szFile2Inject = L"notepad.exe";

//得到进程快照

hnd=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

pe.dwSize=sizeof(pe);

b=Process32First(hnd, &pe);

// 获取指定文件的进程信息PROCESSENTRY32

while(b)

{

if(wcscmp(szFile2Inject, pe.szExeFile)==0)

{

dwPid2Inject = pe.th32ParentProcessID;

szRawFilePath = pe.szExeFile;

//printf("%s\n", pe.szExeFile);

break;

}

b=Process32Next(hnd,&pe);

}

TCHAR strTmpPID[128] = {0};

TCHAR strImagePath[MAX_PATH] = {0};

wsprintf(strTmpPID, TEXT("%4d"), pe.th32ProcessID);

// 获取进程对应的文件的绝对路径名

HINSTANCE hProc = (HINSTANCE)OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,

FALSE,

pe.th32ProcessID);

GetModuleFileNameEx(hProc, NULL, strImagePath, MAX_PATH - 1);

//printf("%s\n", strImagePath);

CloseHandle(hProc);

HANDLE hFile = INVALID_HANDLE_VALUE;                          // 文件内核对象句柄

HANDLE hMapFile = INVALID_HANDLE_VALUE;;               // 文件映射对象句柄

LPVOID lpMapAddr ;                                                          // 映射基地址

//strImagePath = L"C:\\Program Files\\rl\\Rolan.exe";

//ZeroMemory(strImagePath, MAX_PATH);

//memcpy(strImagePath, L"C:\\Program Files\\rl\\Rolan.exe", sizeof(L"C:\\Program Files\\rl\\Rolan.exe"));

// 打开内存映射文件

hFile =

CreateFile (

strImagePath,

GENERIC_READ,

FILE_SHARE_READ,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL ,

NULL

);

if ( hFile == INVALID_HANDLE_VALUE )

{

DWORD dwRet = GetLastError();

printf("Fail to create the exactly pe file @ %X.\n%s\n", dwRet, strImagePath);

return FALSE;

}

hMapFile = CreateFileMapping ( hFile, NULL, PAGE_READONLY, 0, 0, NULL      ) ;

if ( hMapFile == NULL )

{

CloseHandle ( hFile ) ;

return FALSE;

}

lpMapAddr = (PBYTE)MapViewOfFile ( hMapFile, FILE_MAP_READ, 0, 0, 0 ) ;

if ( lpMapAddr == NULL )

{

DWORD dwErrorCode = GetLastError () ;

CloseHandle ( hMapFile ) ;

CloseHandle ( hFile ) ;

return FALSE;

}

// 读取PE结构中的导入表和导出表

PIMAGE_DOS_HEADER pDosHeader = NULL;

PIMAGE_NT_HEADERS pNtHeader = NULL;

PIMAGE_OPTIONAL_HEADER pOptHeader = NULL;

char *pExptBaseRva ;

char *pImptBaseRva ;

char *pExptBase ;

char *pImptBase ;

DWORD dwExptSize = 0;

DWORD dwImptSize = 0;

/*ZeroMemory(pExptBaseRva, 1024);

ZeroMemory(pImptBaseRva, 1024);

ZeroMemory(pExptBase, 1024);

ZeroMemory(pImptBase, 1024);*/

pDosHeader = (PIMAGE_DOS_HEADER)lpMapAddr;

pNtHeader = (PIMAGE_NT_HEADERS)((DWORD)lpMapAddr + pDosHeader->e_lfanew);

pOptHeader = (PIMAGE_OPTIONAL_HEADER)(&(pNtHeader->OptionalHeader));

pExptBaseRva = (char*)pOptHeader->DataDirectory[0].VirtualAddress;

dwExptSize = pOptHeader->DataDirectory->Size;

pExptBase = (char *)ImageRvaToVa(pNtHeader, lpMapAddr, pOptHeader->DataDirectory[0].VirtualAddress, NULL);

pImptBaseRva = (char*)pOptHeader->DataDirectory[1].VirtualAddress;

dwImptSize = pOptHeader->DataDirectory->Size;

pImptBase = (char *)ImageRvaToVa(pNtHeader, lpMapAddr, pOptHeader->DataDirectory[1].VirtualAddress, NULL);

//复制到正在运行的程序中去

unsigned int nAddr2Fix = 0x40000;

pDosHeader = (PIMAGE_DOS_HEADER) nAddr2Fix;

////printf("%s\n", pDosHeader->e_magic);

MessageBox(NULL, (WCHAR *)pDosHeader->e_magic, (WCHAR *)pDosHeader->e_magic, MB_OK);

//printf("...........................................................\n");

pNtHeader = (PIMAGE_NT_HEADERS)(pDosHeader + pDosHeader->e_lfanew);

//printf("%08X\n", pNtHeader->FileHeader.Machine);

return 0;

}

时间: 2024-11-05 22:47:18

by测试题-未完的相关文章

whatweb.rb 未完待续

#!/usr/bin/env ruby #表示ruby的执行环境 =begin # ruby中用=begin来表示注释的开始 .$$$ $. .$$$ $. $$$$ $$. .$$$ $$$ .$$$$$$. .$$$$$$$$$$. $$$$ $$. .$$$$$$$. .$$$$$$. $ $$ $$$ $ $$ $$$ $ $$$$$$. $$$$$ $$$$$$ $ $$ $$$ $ $$ $$ $ $$$$$$. $ `$ $$$ $ `$ $$$ $ `$ $$$ $$' $ `$

把握linux内核设计思想系列(未完待续......)

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet,文章仅供学习交流,请勿用于商业用途] 把握linux内核设计思想(一):系统调用 把握linux内核设计思想(二):硬中断及中断处理 把握linux内核设计思想(三):下半部机制之软中断 把握linux内核设计思想(四):下半部机制之tasklet 把握linux内核设计思想(五):下半部机制之工作队列及几种机制的选择 把握linux内核设计思想(六):内核时钟中断 把握linux内核设计思想(七):内核定时器和

细菌觅食优化算法:理论基础,分析,以及应用(未完)

原作者:Swagatam Das,Arijit Biswas,Sambarta Dasgupta,和Ajith Abraham  [摘 要]细菌觅食优化算法(Bacterial foraging optimization algorithm[BFOA])已经被分布式优化和控制的同行们当作一种全局性的优化算法接受.BFOA是由大肠杆菌的群体觅食行为所启发而总结出来 的.BFOA已经吸引了足够多的研究者的注意,由于它出现在解决真实世界中一些应用领域上优化问题的高效性.E.coli 的群体策略的生物基

Linux设备驱动开发学习(2):Linux设备驱动简介(未完)

(未完待续......)

[译]App Framework 2.1 (1)之 Quickstart (未完待续)

最近有移动App项目,选择了 Hybrid 的框架Cordova  和  App Framework 框架开发. 本来应该从配置循序渐进开始写的,但由于上班时间太忙,这段时间抽不出空来,只能根据心情和兴趣,想到哪写到哪,前面的部分以后慢慢补上. App Framework 前生是是叫 jqMobi 注意大家不要和 jQuery Mobile 混淆了,它们是两个不同的框架,一开始我还真混淆了0.01秒. 这里我先翻译一下Quickstart 部分,一是自己工作上用的上,二是也想顺便练练英文,最关键

数据结构与算法之--高级排序:shell排序和快速排序【未完待续】

高级排序比简单排序要快的多,简单排序的时间复杂度是O(N^2),希尔(shell)排序的是O(N*(logN)^2),而快速排序是O(N*logN). 说明:下面以int数组的从小到大排序为例. 希尔(shell)排序 希尔排序是基于插入排序的,首先回顾一下插入排序,假设插入是从左向右执行的,待插入元素的左边是有序的,且假如待插入元素比左边的都小,就需要挪动左边的所有元素,如下图所示: ==> 图1和图2:插入右边的temp柱需要outer标记位左边的五个柱子都向右挪动 如图3所示,相比插入排序

gulp 入门使用指南(未完)

其实网上有一大把入门指南了,官网上也讲得很清楚.怎么安装,有哪些方法,我在网上已经看到很多很多很多了. 可是我还是很懵逼.不能理解为什么要使用这些工具,不知道学习了这些方法该怎么用,在哪里用.光看文档是学不会的,得有实战!实战啊!我感受不到这些新技术的好处.所以最初学习的时候,我迫切地渴望能有一个人,一篇文章,能通过一个具体的项目来指引一下我.然鹅并没有.(在小公司的坏处,没有指导,突破不了,还懒) 现在我对gulp也还是懵懵哒.只能慢慢写咯. 几乎每一个前端工具都对应了它自己的配置文件,nod

高可用集群之heartbeat v2--基于CRM实现mysql高可用集群(未完)

实验说明: 本实验基于heartbeat的crm,实现对mysql服务的高可用,并没有高可用mysql的数据. 未完部分:使用hb_gui配置挂载nfs时,指定挂载选项,失败. mysql数据和配置文件放在nfs共享存储上 mysql配置文件使用--default-extra-file指定 mysql用户对nfs共享的有读写权限,nfs服务器和mysql所在服务器的mysql的id号要保持一致 在nfs服务器上 1 修改hostname # vim /etc/sysconfig/network

《Linux内核分析》MOOC课程之从迷你Linux内核角度理解进程时间轮片调度(未完)

代码分析 mypcb.h mymain.c 上面这段代码主要完成了对0号进程的初始化,即pid置为0,状态state置为0(即runnable状态),进程入口及当前进程的线程的ip指向my_process,线程的sp指向当前进程的进程堆栈,由于目前只有0号进程,所以next指针指向自己形成一个单PCB链表. 上面这段代码主要是扩充循环链表,使用memcpy()复制0号进程的状态给创建的从1号到MAX_TASK_NUM-1号进程,并与0号进程一起构成一个循环PCB链表. 上面这段代码功能是从循环P

git个人使用总结 —— idea命令行、撤销commit (未完待续)

近期在使用git,最开始在idea界面操作,后来要求用命令行.刚开始还不是很习惯,感觉很麻烦,用了几天后感觉爽极了! 其实git的命令也不是很多,熟悉一段时间就差不多能顺利使用了.使用过程中遇到了各种各样的问题,有些小问题就在这里集中总结一下. 1.idea命令行.git安装后就自带终端git bash,使用起来很方便.但是用idea开发,开发后还要在相应文件夹下打开git bash很麻烦.其实idea也带有终端terminal,在最下方可以找到,在这里就可以执行命令.但是如果是默认方式安装的g