dword

win32API多线程编程

烂漫一生 提交于 2019-12-02 19:00:14
win32线程API 在Windows平台下可以通过Windows的线程库来实现多线程编程。 对于多线程程序可以使用Visual Studio调试工具进行调试,也可以使用多核芯片厂家的线程分析调试工具进行调试。 Win32 API(了解Windows,代码小,效率高) Windows操作系统为内核以及应用程序之间提供的接口 将内核提供的功能进行函数封装 应用程序通过调用相关的函数获得相应的系统功能 _beginthread _beginthread(函数名,栈大小,参数指针) Win32 函数库中提供了操作多线程的函数, 包括创建线程、管理线程、终止线程、线程同步等接口。 线程函数(线程开始执行的函数) DWORD WINAPI ThreadFunc (LPVOID lpvThreadParm ); 线程创建 HANDLE CreateThread ( LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId ); 第一个参数lpThreadAtt,是一个指向SECURITY- ATTRIBUTES结构的指针

带有控制台输出的钩子检测

﹥>﹥吖頭↗ 提交于 2019-12-02 16:20:27
#define _WIN32_WINNT 0x0400 #pragma comment( lib, "user32.lib" ) #include <Windows.h> #include <conio.h> #include <stdio.h> #include <iostream> #include <string> using namespace std; HHOOK hKeyboardHook; string something1; __declspec(dllexport) LRESULT CALLBACK KeyboardEvent(int nCode, WPARAM wParam, LPARAM lParam) { DWORD SHIFT_key = 0; DWORD CTRL_key = 0; DWORD ALT_key = 0; if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN))) { KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); DWORD dwMsg = 1; dwMsg += hooked_key.scanCode << 16; dwMsg += hooked_key.flags

用程序在代码节空白处加代码

两盒软妹~` 提交于 2019-12-02 02:48:19
1.工具头文件 #ifndef PETOOL_H #define PETOOL_H #include "stdafx.h" #include <stdlib.h> #include <windows.h> //函数声明 //************************************************************************** //ReadPEFile:将文件读取到缓冲区 //参数说明: //lpszFile 文件路径 //pFileBuffer 缓冲区指针 //返回值说明: //读取失败返回0 否则返回实际读取的大小 //************************************************************************** DWORD ReadPEFile(IN LPSTR lpszFile,OUT LPVOID* pFileBuffer); //************************************************************************** //CopyFileBufferToImageBuffer:将文件从FileBuffer复制到ImageBuffer //参数说明: //pFileBuffer FileBuffer指针 /

WriteUp-i春秋-溯源

不打扰是莪最后的温柔 提交于 2019-12-01 22:45:01
一个简单的逆向qwq 叫你输入key,给出提示信息 -- 无壳 C++编写 老规矩:拖IDA 搜索fail找到了main函数 这个main流程有点复杂qwq 我们看看它的伪代码: 全代码: 1 _DWORD *__fastcall sub_401D90(_DWORD *a1, _DWORD *a2) 2 { 3 _DWORD *v2; // esi 4 _DWORD *v3; // ebx 5 int v4; // eax 6 signed int v5; // edi 7 int v6; // ecx 8 int v7; // eax 9 void (__thiscall ***v8)(_DWORD, signed int); // eax 10 bool v9; // cf 11 _BYTE *v10; // eax 12 int v11; // ecx 13 int v12; // eax 14 unsigned int v13; // edi 15 int i; // eax 16 char v15; // dl 17 unsigned int v16; // edi 18 _DWORD *v17; // eax 19 _DWORD *v18; // eax 20 int v19; // eax 21 bool v20; // zf 22 int v21; // eax

16_TLB与流水线

て烟熏妆下的殇ゞ 提交于 2019-12-01 22:38:04
1 前面做的实验起始有缺陷 访问内存之后,后面执行两句代码后;并不能保证刚才访问的代码还在TLB中;有可能被刷新出去了; 实验验证缺陷: 代码 不连续 TLB 被淘汰: 2万次中有1次被淘汰;由于访问代码不连续 代码: // 7_TLB_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"#include<stdio.h>#include<stdlib.h>#include<Windows.h>​#define PTE(x) ( (DWORD*)(0xc0000000 + ((x >> 12) << 3)))#define PDE(X) ( (DWORD*)(0xc0600000 + ((x >> 21) << 3))) DWORD g_out;DWORD g_OldPte[2];#pragma section("data seg", read, write)_declspec(allocate("data seg"))DWORD pagel[1024]; //41d000_declspec(allocate("data seg"))DWORD page2[1024]; //41c000//0x401000void _declspec(naked) IdtEntry(){// 保存旧的pte ,以用来恢复pte

17_页面异常接管

谁说胖子不能爱 提交于 2019-12-01 22:38:00
页面异常捕获过滤: 原理: 在 IDT 表中的e 号 处理 是 页面异常处理; 如果 我们 hook 掉 这个回调函数;那么就能获得全部的页面异常;再通过 cr3 对比 捕获指定的 cr3 (进程)的信息;最后再共享的区域将数据输出;然后测试程序获取该自己的页面异常信息; 实验中 容易出现的错误: 在 c 的时候注意将使用的寄存器(这里是eax)先保存起来;注意 通过栈保存 eax的话注意 相关进入中断后和栈相关的数据,就会和esp 的相对偏移产生变化。 测试程序代码.c: 此程序 主要是 中断进入 内核;然后读取数据;看时候有新的和自己有关的异常页面信息;这样 // 9_页面异常.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"#include <stdio.h>#include<stdlib.h>#include<Windows.h>// 定义一些内核地址宏;用来保存当前程序相关数据(cr3)#define K_BOOL_READY 0x8003f3f0 // * 当前是否已经提交 cr3,变为准备接收异常状态#define K_ESP 0x8003f3f4 // esp * 异常代码 #defineK_ESP_NEG4 0x8003f3f8 // esp - 4 * 异常地址 eip(产生异常的代码地址)

18_ShadowWalker

给你一囗甜甜゛ 提交于 2019-12-01 22:37:49
白皮书中 page-fault error code: shadowWalker 原理: 接管 指定程序 的 执行页面异常、读写页面异常;然后 调用一下正常的 使其出现在快表;然后恢复到假的pte ------ 根据白皮书中 的error code 过滤出 执行、读写异常类型 相关: 将 402000 这个页面通过修改pte 设置为不存在(直接 给 p位置为 0);这样产生异常 我们接管 然后通过 0x10 判断 是否是执行异常;是的话,就将页面给挂上去。 全程接管 读写、执行异常 读写异常 -- 不能交给系统默认处理;因为系统有虚拟地址的管理,他可能以为还没有映射该页面或者可能被置换到磁盘文件等,再次映射;但是还是不是我们想要的正确的。 所以我们接管。 只接管 402000 页面(具体根据项目//后来我的项目是 412000) 因为其他页面也会产生异常;如果想把该程序的都接收,那么得区分出来分别处理,这里我们只处理一个页面就行;原理类似。 利用 TLB 使得瞬间正常,然后又恢复异常状态;不然只接管了一次。 #define K REAL PTEO 0x8003f3e4#define K REAL PTE1 0x8003f3e0#define K FAKE PTEO 0x8003f3dc#define K FAKE PTE1 0x8003f3d8DWORD g esp;DWORD 9

15_TLB中的G属性

强颜欢笑 提交于 2019-12-01 22:37:09
》 TLB 是为了增加访问内存的效率 即 如果 是 29 9 12 分页 请求数据 可能需要访问 4次内存;为了解决这个问题;出现了 TLB (虚拟地址到物理地址的转换关系),如果目标地址在TLB缓存中,那么直接从TLB 取出 物理地址; 》 这个实验做起来很麻烦,因为: TLB 是CPU 内部的,没法通过汇编指令访问TLB; 调试器,也没有办法知道 TLB 中有哪些项 只有通过实验现象 结果,来证明其存在。 内存访问的步骤: 》 注意 TLB 产生异常 3; 不会回到 2;而是产生 0x0E 异常。 1 简单实验查看 快表 带来的影响: 图解: 代码: // 7_TLB_test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"#include<stdio.h>#include<stdlib.h>#include<Windows.h>​#define PTE(x) ( (DWORD*)(0xc0000000 + ((x >> 12) << 3)))#define PDE(X) ( (DWORD*)(0xc0600000 + ((x >> 21) << 3))) DWORD g_out;#pragma section("data seg", read, write)_declspec(allocate("data seg

11_零地址读写

丶灬走出姿态 提交于 2019-12-01 22:35:41
原理: 修改 进程空间 虚拟 零地址 的 pte 为 一个当前程序的全局变量;这样 零地址 指向的就是 同一个物理页且属性相同;修改 一个虚拟地址数据;另外的虚拟地址数据同样会改变。 注意: 中间加阴影的部分 是为了刷新 TLB 快表,后面章节有详解。 测试结果: 这里不知道为什么printf时候 我的 exception handler 4 检测异常;导致输出不了;但是的确0页 映射到了 和全局变量同一个物理页。 代码: // 5_进程空间虚拟零地址读写.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//​#include "pch.h"#include<stdio.h>#include<stdlib.h>#include<Windows.h>​#define PTE(x) ((DWORD *)(0xc0000000 + ((x>> 12)<< 3)))#define PDE(x) ((DWORD *)(0xc0600000 + ((x >> 21) << 3)))//0x4197b0DWORD g_var = 0x12345678;DWORD g_out;//0x401040void _declspec(naked) IdtEntry(){​ PTE(0)[0] = PTE(0x4197b0)[0] ; PTE(0)[1] = PTE(0x4197b0

Framework for hook Computational

对着背影说爱祢 提交于 2019-12-01 22:13:16
Code : #define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <stdio.h> #include "tlhelp32.h" int hexstringtobyte(char *in, unsigned char *out); int bytetohexstring(unsigned char *in, int len, char *out); //存进程句柄 HANDLE hProcess; //存自己分配的地址 LPVOID lp_address; DWORD GetProcessIDByName(const char* pName) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return NULL; } PROCESSENTRY32 pe = { sizeof(pe) }; for (BOOL ret = Process32First(hSnapshot, &pe); ret; ret = Process32Next(hSnapshot, &pe)) { if (strcmp(pe.szExeFile, pName) ==