-
-
[原创]对笔记本 Inject code 实验
-
发表于:
2014-3-16 11:07
6274
-
菜鸟第一次发分享帖,平时一直潜水,深受看雪中分享精神的感动,故在实验有些心得时分享,同时求教,求讨论
实验是对 xp 自带笔记本的 inject code
老方法 Inject Dll hook 目标 call
injector 参考看雪中前辈们提供的方法
回顾一下在目标进程中分配空间写入目的dll 路径
并用createremotethread 执行LoadLibrary (由getprocaddress 取得加载地址)
其中show_console, close_console 是测式过程中输出信息看有无成功
原本想用codeblock 开发但编译设定没法弄好一直找不到PTHREAD_START_ROUTINE 的定义还是用至宝VC6
dll 部分分为三个函式inject, asm_head, hook_call
inject
取得asm_head 地址,改写page 权限,改写inject call 头
asm_head
从当前环境取出所需资料,环境保护,执行hook_call,还原环境,执行原始call 被吃掉的部分
由于不会在c++单纯写一段内嵌汇编只好开一个函式内嵌并记下地址直接转跳有什么更好的方法请大牛们不吝拍砖指点哈:)
hook_call
按设计应可以独立于inject 过程,也就是可以完全的用c++写所需要的码,这里只是实验就把笔记本中的内容印出来
直接上 code
Inject_DLL 很多是参考前辈的 code
#include "stdafx.h"
#include <windows.h>
#include <winbase.h>
#include <winnt.h>
#include <stdio.h>
#include <Tlhelp32.h>
BOOL LoadRometeDll(DWORD dwProcessId)
{
const DWORD THREADSIZE=1024*4;
HANDLE pRemoteThread,hRemoteProcess;
PTHREAD_START_ROUTINE pfnAddr;void *pFileRemote;
hRemoteProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwProcessId);
printf("remote process handle: %d", &hRemoteProcess);
pFileRemote=VirtualAllocEx(hRemoteProcess,0,THREADSIZE,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE);
if(!WriteProcessMemory(hRemoteProcess,pFileRemote,"C:\\Documents and Settings\\Administrator\\My Documents\\Dropbox\\ShareVM\\dll_vc\\Debug\\dll_vc.dll",THREADSIZE,NULL)){
return FALSE;}
pfnAddr=(PTHREAD_START_ROUTINE)GetProcAddress(GetModuleHandle(TEXT("Kernel32")),"LoadLibraryA");
pRemoteThread=CreateRemoteThread(hRemoteProcess,NULL,0,pfnAddr,pFileRemote,0,NULL);
if(pRemoteThread==NULL){
return FALSE;}
else{
printf("ok");}
}
BOOL GetProcessIdByName(LPSTR szProcessName,LPDWORD lpPID)
{
STARTUPINFO st;
PROCESS_INFORMATION pi;
PROCESSENTRY32 ps;
HANDLE hSnapshot;
ZeroMemory(&st,sizeof(STARTUPINFO));
ZeroMemory(&pi,sizeof(PROCESS_INFORMATION));
st.cb = sizeof(STARTUPINFO);
ZeroMemory(&ps,sizeof(PROCESSENTRY32));
ps.dwSize = sizeof(PROCESSENTRY32);
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if (hSnapshot == INVALID_HANDLE_VALUE)
{
return FALSE;
}
if (!Process32First(hSnapshot,&ps))
{
return FALSE;
}
do
{
if (lstrcmpi(ps.szExeFile,szProcessName) == 0)
{
*lpPID = ps.th32ProcessID;
printf("found: %d\n", ps.th32ProcessID);
CloseHandle(hSnapshot);
return TRUE;
}
} while (Process32Next(hSnapshot,&ps));
CloseHandle(hSnapshot);
return FALSE;
}
int main()
{
DWORD dwPID;
if (!GetProcessIdByName("notepad.exe",&dwPID))
return -2;
if (!LoadRometeDll(dwPID))
return 0;
return 1;
}
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)