- 博客(234)
- 资源 (26)
- 收藏
- 关注
原创 win32asm 自定义添加可执行代码
C版本:win32asm 自定义代码段加密解密C版本没做新增节等各种检查1. 把一段可执行代码插入进另一个程序中2.插入的代码需要自定位3.3.1如果被插入的程序有空间可以新增一个节表则加入节表,对新增节表赋值(需对齐大小), 写入需要新增代码修正:FileHeader.NumberOfSections ++, OptionalHeader.SizeOfIm...
2021-09-03 01:16:00 149
原创 win32asm int3 int1 tf WaitForDebugEvent 调试进程
需要用到的函数 :CreateProcess ,WaitForDebugEvent,ContinueDebugEvent ,WriteProcessMemory,GetThreadContext,SetThreadContext.ReadProcessMemory 一般都要用, 这里没用到WriteProcessMemory : 用来增加int 3 断点(0cch), 以及恢复旧数据的GetThreadContext: 用来获取被调试进程的线程所保存的寄存器, 这些寄存器用来恢复...
2021-05-14 04:56:47 724
原创 纯重叠io服务器模型
基础:套接字重叠io客户端: telnet 或者自己随意写一个;纯重叠实现的服务器模型,基本上就是使用OVERLAPPED和APC函数完成.APC函数即需要使用alterable状态的函数 , 例 SleepEx.另外重叠io与非阻塞是2个概念.下面的代码中使用到了非阻塞io, 仅仅作用在了accept上. 让其不阻塞;原因是如果阻塞accpet 就没法调用到Slee...
2019-01-15 17:32:18 478 1
原创 4. 权限,特权,任务说明
CPL:当前CS段的RPL, RPL:请求这个数据段的权限, DPL: 数据段的权限。从大方向说:只要权限比数据段大 ,或者相等就OK。
2023-11-29 20:57:10 158
原创 2.1 总线问题
同一时间只能有一个去控制总线,因此需要一个输出开关去确保总线不出错一旦同时开启输出开关,下面的锁存器还会被上面的数据修改如果上下同时开启可写,且同时开启可输出, 则短路
2023-11-25 23:51:44 93
原创 2.1 总线问题
同一时间只能有一个去控制总线,因此需要一个输出开关去确保总线不出错一旦同时开启输出开关,下面的锁存器还会被上面的数据修改如果上下同时开启可写,且同时开启可输出, 则短路
2023-11-25 23:49:45 74
原创 2. 寄存器
锁存器,用于存储1位的电路只有当 可写位(write enable)开启,才会把输入写到输出,同时保存输出使用锁存器带时钟的锁存器带时钟带可写控制的完整版锁存器下面的时钟使用按钮来代替, 只有按钮为1时,相连的电路才工作时钟的作用在于协同所有电路共同工作,也是一切电路自动化的源头更多关于时钟的解释在 3.1 内部数据总线与时钟 中1个8位的简易版寄存器可由8个锁存器组成
2023-11-25 23:48:41 101
原创 1.5 加减法
加减法这是一个有问题的加减法根据8位加法和8位取反可以组合成一个加减法减法相当于 加一个负数,而负数可以用取反+1的补码来表示现在的问题是如何解决+1的问题, 目前只有一个取反控制器 ?加法器中有个“首个进位控制" , 可以用来+1操作,只需要把 " 首个进位控制" 跟 取反器的“开启取反” 用同一个控制线连接即可根据下面可以看到2个数相加没问题,一旦相减,最后的进位还是存在问题, 原因在于 补码+正数 后的进位解决方式解决方案是如果没开负数,进位保持原样如果开了负数,则忽略进位
2023-11-25 23:46:03 47
原创 1.2 全加器
处理1个进位的加法根据半加器可知,结果和进位只有1种情况:要么有结果要么有进位因此全加器可由2个半加器组合而成通过一个半加器输出的结果和进位再次由另一个半加器输出2个半加器的进位通过或门输出
2023-11-25 23:38:04 96
原创 1.1 半加器
输入1输入2结果进位0000101001101101半加器: 实现1位的加法根据结果可知输入1与输入2相加结果 -> 符合 异或门进位 -> 符合 与门最终要么有结果要么有进位,不存在即有结果也有进位异或门的实现也可以由基本的3个 “与或非” 门实现与:& , 或:| , 非:! 用这3个符号表示假设输入1:x, 输入2:y可以得出真值表达式(仅有1的结果):sum = x&!y +
2023-11-25 23:36:35 116
原创 3. 内存单元
原行1 连接到 位0 , 原列1->位1,原行2->位2,原列2->位3…列1:1000010 (行4连连接到是位6, 列1连接到的是位1)由于上面一共16个地址, 因此2的4次方 => 2^4 就可以表示。行3连接到的是位4:10000, 列1连接到的是位1:10。总之,根据 行,列 对应连接的位来计算此内存单元的值。因此 行3列1 的内存单元 对应的值是:10010。下面替换的地址线,通过一个查找表来实现。列4:10010000。列4:11000000。列2:1001000。列3:1100000。
2023-11-25 23:27:55 153
原创 3.2 CPU的自动化
MOV_TO_ADDR(1010) 流程: step 0 ~ step 2一样。1.step 1,内存地址寄存器传送地址,内存缓存寄存器获取数据。4.step 4, 执行一次step 1, 传递地址获取内存数据。上述的改造还需要手动输入二进制,才能实现自动化,因此继续改造。2.step 2, 内存缓存寄存器把数据传送到指令寄存器。8.step 8, 执行MOV_TO_ADDR。5.step 5, 把数据传送到寄存器A。6.step 6, 回到step 0。7.step 7, 执行ADD。
2023-11-25 23:09:34 1459 1
原创 3.1 CPU内部结构与时钟与指令
CPU内部结构总线一些自定义部件总线图内存指令执行流程:取指令,译码,执行pc做的事内存地址寄存器内存缓存寄存器指令寄存器,译码第一步指令寄存器传递地址到内存地址寄存器指令MOV_A的过程(译码第二步)第一条指令执行完毕第三条指令的执行第四条指令第四条指令不同的执行流程整体流程内部数据总线使用到的有8位寄存器(用于输入),4位寄存器(用于内存地址,只能寻址16个内存单元[2^4]),简化版加法ALU寄存器带了时钟, 由时钟统一控制操作ALU不需要时钟, 输入端的
2023-11-25 23:00:25 1476
原创 程序加载器
仅在16位上有效,给别人写的.作用:模拟如何加载一个APP实际还要检索内存空间,这里省去;读取硬盘端口 [读取硬盘这部分可直接忽略] ;0x1f0 数据端口 ;0x1f1 错误端口 ;0x1f2 设置扇区数量 ;0x1f3 ~ 0x1f6 [ 0x1f6 中只占4 bit] 共28bit ;0x1f6 高4位 1110 , 111 -> LBA, 0 -> 主盘 ;0x1f7 状态控制端口 ; 写入 0x20 -> 准备读取, ; 读取后 and 0x8
2021-11-09 01:48:37 335
原创 虚表指针在哪里
虚表指针群里有人问。就写了从最简单的类开始, 后面有单继承和多继承虚表指针的不同代码在32环境下:先写结论: 虚表指针在构造函数与析构中赋值(下面反汇编证明), 赋值: *this = 虚表指针(即首个成员) 虚表指针指向的是一个数组,存放虚函数,虚函数按一般声明先后排序. 这个数组一般在 .rdata 或 .data 每个父类都会在构造,析构中设置自己的虚表,下面继承中会写 * 为什么要在构造...
2021-09-08 18:27:01 962
原创 计算函数字节长度
#include <Windows.h>#include <stdio.h>#include <iostream>using std::cout;using std::endl;int main(){func_begin: DWORD asm_len = 0; DWORD func_len = 0; _asm { pushad begin_code: mov eax,offset end_code mov esi,offs...
2021-09-06 14:43:54 421
原创 获取kernel32 peb
.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude msvcrt.incincludelib msvcrt.lib.databuffer db 256 dup(0).constszText db 'addr : ...
2021-08-18 12:38:45 133
原创 提取图标 ico 资源
待修改文件中 : 图标头后直接跟图标数据PE: 图标头跟图标数据分开放, 图标头被放在图标组(对应索引14), 图标数据放在图标资源(索引3)过程:通过图标组找到各个图标头, 根据图标头的ID再去匹配图标资源中的ID图标结构://图标头struct ICON_DIR{ WORD reserved; WORD idtype; //资源类别 . ico为1 WORD idcount; //图标数量 ICON_DIR_ENTRY dir_entry[1]; // 数...
2021-08-15 11:10:02 726
原创 查找kernel32.dll 基地址 stack
从[esp]获取kernel32中call 指令push的返回地址, 即应用程序返回后的地址rtlexituserthread , 有些是exitthread.拿到这个地址就拿到了kernel32空间的某个值, 模块地址64k对齐,去掉低2个字节来对齐.然后依次减64k寻找.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user...
2021-08-10 03:10:27 428
原创 函数地址动态加载api
C版本:GetProcAddress 实现asm:.386.model flat, stdcalloption casemap:noneinclude windows.incinclude user32.incincludelib user32.libinclude kernel32.incincludelib kernel32.libinclude msvcrt.incincludelib msvcrt.lib.codeseh_handler proc C p
2021-08-10 00:54:12 275
原创 查找kernel32.dll 基地址 SEH
根据SEH来找,teb.tib.exceptionlist 中最后一个EXCEPTION_REGISTRATION 异常处理函数在kernerl32 中最后一个 EXCEPTION_REGISTRATION.prev = 0ffffffffh根据这个特征找到EXCEPTION_REGISTRATION.handler , 去掉10000h, 模块都在64k边界上.386.model flat, stdcalloption casemap:noneinclude wind.
2021-08-09 11:27:29 236
原创 查找kernel32.dll 基地址 特征函数
从用户层高地址往下找高地址:7ffe0000h (用户层可读的最高地址,之后的地址拒绝访问)一直扫描到最后一块64k起始页面为止, 因此结束地址9999h每个pe模块都会加载在64k边界的地址上, 因此每次减64k(10000h)代码中增加了自己修复的重定位信息, 和异常处理;***** 不要运行在调试环境中 , 否则异常首先被送到debug中流程:1.每次在64k的边界上查看是否是一个pe2.如果是,则找到导出表,如果有导出表,根据名字GetProcAddres..
2021-08-09 06:07:04 450
原创 tls 回调
不修改aop, 用静态 tls回调在线程初始化时做一些事* 线程启动前会先初始化tls结构 , 依次调用tls回调数组1.在全局变量定义一个IMAGE_TLS_DIRECTORY 变量 模拟tls结构2.在回调部分放上自己的函数3.修改数据目录tls的位置, 指向自己的结构模拟tls 的C代码:tls回调函数跟dllentry 参数一样tls结构的第4个参数是一个回调数组, 依次调用前3个参数在这里没用 , 具体参考msdn#include <i...
2021-08-07 05:17:40 272
原创 GetProcAddress 实现
没用的C代码根据导出表查找函数名#define _CRT_SECURE_NO_WARNINGS#include <Windows.h>#include <iostream>using std::cout;using std::endl;void * getExportApi(DWORD base_addr ,const char * api_name) { if (0 == base_addr || 0 == api_name) return 0;
2021-07-29 02:24:14 352
原创 win32asm 自定义代码段加密解密
没有做各种错误处理和异常处理,以及如果失败需要还原属性一个简单的例子1.新增一个节用于解密代码段, 写入解密字节码,用于还原代码段2.找到入口所在的代码段,加密3.修改入口点指向新增节,修改.text属性加上可写执行流程, 新节->解密还原代码段->跳转代码段使用的exe是:win32asm 自定义PE头解密汇编:00405000 > 60 pushad00405001 BE 00104000 mov esi
2021-07-20 19:26:17 245
原创 win32asm 新增节 对齐内存 对齐文件
没用的c代码#define _CRT_SECURE_NO_WARNINGS#include <Windows.h>#include <iostream>using std::cout;using std::endl;//用来对齐内存DWORD calc_mem_section_size(void * mem,DWORD raw_size) { IMAGE_DOS_HEADER * dos = (IMAGE_DOS_HEADER*)mem; IMAGE_N..
2021-07-20 08:00:41 157
原创 win32asm 自定义PE头
3个节, .text, .data , .rdata(导入表)为了方便 ,长度均0x1000 , 对齐都0x1000.text rva 0x1000.data rva 0x2000.rdata rva 0x3000 - 导入表(或者.idata , 随意)BaseOfCode 0x1000BaseOfData 0x2000entrypoint 0x1000imagebase 0x400000sizeofImage 0x4000sizeofheaders 0x100..
2021-07-14 02:43:50 144
Linux高性能服务器编程
2019-07-06
libevent参考手册(中文版)
2019-07-06
libevent深入浅出
2019-07-06
Effective.C++.中文版(第3版_中文版) 完整书签
2018-11-26
Effective C++ 完整目录
2018-11-26
UNIX网络编程卷1 完整目录
2018-11-06
Python网络编程 Python网络数据采集
2018-06-09
TCP/IP网络编程[韩] 尹圣雨
2018-05-25
Wireshark网络分析的艺术
2017-10-21
Windows核心编程
2017-10-21
UNIX网络编程卷1
2017-10-21
UNIX网络编程 卷2 进程间通信
2017-10-21
Unix-Linux编程实践教程
2017-10-21
UNIX环境高级编程
2017-10-21
数学之美 [美] 吴军
2017-10-12
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人