博客日历
2024年11月 | ||||||
一 | 二 | 三 | 四 | 五 | 六 | 七 |
28 | 29 | 30 | 31 | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 1 |
存档
2024年03月 04月 05月 2021年
01月 02月 11月 12月 2020年
02月 03月 04月 05月 06月 07月
09月 2018年
09月 2017年
01月 02月 07月 2016年
01月 04月 07月 08月 11月 12月
2015年
01月 02月 03月 05月 09月 10月
11月 2014年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2013年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2012年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2011年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2010年
01月 02月 03月 04月 05月 06月
07月 08月 09月 10月 11月 12月
2009年
03月 04月 05月 06月 07月 08月
09月 10月 11月 12月
一个DBF文件读写库的使用及其在Big-Endian机器上的修改
这个库实现了对DBF文件的基本读写操作,支持整数、浮点数、字符串、逻辑型字段,使用也很方便,但是在字节序为Big-Endian的机器上(如HP-UX IA64)不能正确的读写数据,因此,对存在不兼容的地方进行了修改。
1.对于要存储在文件中的16位,32位的整数,使用下面的函数进行转换。
uint32 BigLittleSwap32(uint32 A) { // 或者__ia64 #ifdef __hpux return ((((uint32)(A)& 0xff000000) >> 24) | \ (((uint32)(A)& 0x00ff0000) >> 8) | \ (((uint32)(A)& 0x0000ff00) << 8) | \ (((uint32)(A)& 0x000000ff) << 24) ); #else return A; #endif } uint16 BigLittleSwap16(uint16 A) { #ifdef __hpux return ((((uint16)(A)& 0xff00) >> 8) | \ (((uint16)(A)& 0x00ff) << 8) ); #else return A; #endif }
2.对于整数型的字段,在函数ConvertStringToInt中使用了下面的代码:
#ifdef __hpux for( int i = 0 ; i < nSize ; i++ ) { cRecord[i] = u.n[nSize - i - 1]; } #else for( int i = 0 ; i < nSize ; i++ ) { cRecord[i] = u.n[i]; } #endif
分类:Win32/C++ 查看次数:9477 发布时间:2014/5/8 18:02:46
通过远程线程注入DLL到指定进程
InjectDLL.h
#pragma once class CInjectDLL { public: CInjectDLL(); ~CInjectDLL(); public: int Inject(LPCTSTR lpProcess, LPCTSTR lpDLLPath); void UnInject(); private: HMODULE m_hDLLModule; HANDLE m_hRemoteProcess; HMODULE m_hKernel32; private: DWORD GetProcessID(LPCTSTR lpProcess); void EnableDebugPrivileges(); };
InjectDLL.cpp
#include "stdafx.h" #include "InjectDLL.h" #include <Tlhelp32.h> #include <io.h> CInjectDLL::CInjectDLL() { } CInjectDLL::~CInjectDLL() { } DWORD CInjectDLL::GetProcessID(LPCTSTR lpProcess) { DWORD nProcessId = -1; HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hProcessSnap == INVALID_HANDLE_VALUE) { return -1; } PROCESSENTRY32 pe; pe.dwSize = sizeof(pe); BOOL bRet = Process32First(hProcessSnap, &pe); while (bRet) { if (lstrcmpi(pe.szExeFile, lpProcess) == 0) { nProcessId = pe.th32ProcessID; break; } bRet = Process32Next(hProcessSnap, &pe); } CloseHandle(hProcessSnap); return nProcessId; } void CInjectDLL::EnableDebugPrivileges() { LUID luid; LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid); TOKEN_PRIVILEGES tkp; tkp.PrivilegeCount = 1; tkp.Privileges[0].Luid = luid; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; HANDLE hToken; OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken); AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL); CloseHandle(hToken); } int CInjectDLL::Inject(LPCTSTR lpProcess,LPCTSTR lpDLLPath) { TCHAR szDLLPath[MAX_PATH]; strcpy_s(szDLLPath, lpDLLPath); if (_access(szDLLPath, 0) == -1) { return 1; } long pid = GetProcessID(lpProcess); if (pid == -1) { return 2; } m_hKernel32 = GetModuleHandle("Kernel32"); if (m_hKernel32 == NULL) { return 3; } EnableDebugPrivileges(); m_hRemoteProcess = OpenProcess(PROCESS_ALL_ACCESS, TRUE, pid); if (m_hRemoteProcess == NULL) { CloseHandle(m_hKernel32); return 4; } void *lpProcessBuff = VirtualAllocEx( m_hRemoteProcess, NULL, sizeof(szDLLPath), MEM_COMMIT, PAGE_READWRITE); int ret = WriteProcessMemory( m_hRemoteProcess, lpProcessBuff, (void *)szDLLPath, sizeof(szDLLPath), NULL); if (ret == 0) { VirtualFreeEx( m_hRemoteProcess, lpProcessBuff, sizeof(szDLLPath), MEM_RELEASE); CloseHandle(m_hRemoteProcess); return 5; } HANDLE hRemoteThread = CreateRemoteThread( m_hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE)GetProcAddress(m_hKernel32, "LoadLibraryA"), lpProcessBuff, 0, NULL); WaitForSingleObject(hRemoteThread, INFINITE); // 取得 LoadLibraryA 返回的 HMODULE GetExitCodeThread(hRemoteThread, (LPDWORD)&m_hDLLModule); CloseHandle(hRemoteThread); VirtualFreeEx( m_hRemoteProcess, lpProcessBuff, sizeof(szDLLPath), MEM_RELEASE); return 0; } void CInjectDLL::UnInject() { HANDLE hThread = CreateRemoteThread( m_hRemoteProcess, NULL, 0, (LPTHREAD_START_ROUTINE)::GetProcAddress(m_hKernel32, "FreeLibrary"), (LPVOID)m_hDLLModule, // thread argument 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); CloseHandle(m_hRemoteProcess); }
使用方法:
#include "InjectDLL.h" CInjectDLL obj; int ret = obj.Inject("RTX.exe", "D:\\Test\\Hook.dll"); if (ret != 0) { CString csErrMsg; csErrMsg.Format("error:%d", ret); AfxMessageBox(csErrMsg); } obj.UnInject();
分类:Win32/C++ 查看次数:5114 发布时间:2014/5/7 18:19:38