dword

通用寄存器和内存

强颜欢笑 提交于 2019-11-28 10:18:47
计算机在运行时,需要提供数据的容器; 容器由内存和cpu提供,内存提供的容器比较多;cpu提供的容器较少但其中的数据计算速度快; cpu提供的容器就是寄存器,寄存器有特定的数据宽度,决定了该寄存器存储数据的范围; 1.常用的32位寄存器 32位通用寄存器还可以拆分来使用;将低16位当做16位寄存器; 一些16位寄存器也可以继续拆分;高8位和低8位分别当做8位寄存器来使用; 2.mov指令 mov 目标操作数,源操作数 作用:拷贝源操作数到目标操作数 注意: 源操作数可以是立即数、通用寄存器、段寄存器、内存单元; 目标操作数可以是通用寄存器、段寄存器、内存单元; 操作数的宽度必须一样; 源操作数和目标操作数不能同时为内存单元; mov的语法: 3.从内存中读写数据 内存由一段连续的内存单元组成,每个内存单元有8位; 32位机正常的寻址范围为0~FFFFFFFF,也就是4GB; 但这不是确定的,有些内存区域可能被固定无法访问,并且操作系统也可能扩展内存; 数据有3中类型: 字节 ->byte,宽度为8位 字 ->word,宽度为两个字节16位 双字 ->dword,宽度为两个字32位 用指令从内存中读写数据时,需要指明数据的类型 例如: mov dword ptr ds:[0x0012FF34],0x12345678 4.内存寻址的几种方式 1)[立即数] 从内存中读

汇编push,pop

删除回忆录丶 提交于 2019-11-28 08:58:11
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-24,00:40:12 作者By-----溺心与沉浮----博客园 1、BASE,TOP是2个32位的通用寄存器,里面存储的是内存单元编号(内存地址). 2、BASE里面存储了一个地址,记录的起始地址. 3、TOP里面也存储了一个地址,记录的是结束的地址. 4、存入数据的时候,TOP的值减4(为方便演示,每次存取都是4个字节) 5、释放数据的时候,TOP的值加4(为方便演示,每次存取都是4个字节) 6、如果要读取中间的某个数据的时候可以通过TOP 或者 BASE 加上偏移的方式去读取 7、这种内存的读写方式有个学名:堆栈 堆栈的优点:临时存储大量的数据,便于查找. 在OD中红框位置,随机选取一个内存地址作为我们的栈底与栈顶,我已0x18FFD0为例,用EDX,EBX仿ESP,EBP   MOV EDX,0x18FFD0  TOP   MOV EBX,0x18FFD0  BASE 1、压入数据    压入数据的方法很多 方式一、   MOV DWORD PTR DS:[EDX-4],0xAAAAAAAA   SUB EDX,4 版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明。2019-08-24,00:40:12 作者By-----溺心与沉浮----博客园 代码执行后: 后面的就不上图了

逆向破解之160个CrackMe —— 016

无人久伴 提交于 2019-11-28 06:30:38
CrackMe —— 016 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 cracker,想挑战一下其它 cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。 CrackMe简称CM。 程序下载地址: 点击我 来源 <-点击查看 编号 作者 保护方式 016 bjanes Serial(VB5) 工具 x32dbg VB Decompiler Pro 开始破解之旅 ON.1 爆破方式 使用x32dbg打开016号程序 右键 搜索->当前模块->字符串 我们看见了错误提示字符串地址 00403A69 和正确提示字符串地址 00403AE9 我们进入错误提示字符串地址00403A69处向上查看 004039FE | 83C4 18 | add esp,18 | 00403A01 | 66:85FF | test di,di | 00403A04 | 75 1C | jne bjcm20a.403A22 |跳转处 跳转到00403A22 00403A06 | 8B7D 08 | mov edi,dword ptr ss:[ebp+8] | 00403A09

逆向破解之160个CrackMe —— 015

℡╲_俬逩灬. 提交于 2019-11-28 04:15:52
CrackMe —— 015 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 cracker,想挑战一下其它 cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破。 CrackMe简称CM。 程序下载地址: 点击我 来源 <-点击查看 编号 作者 保护方式 015 blaster99 Nag,Serial(VB5) 工具 x32dbg 开始破解之旅 ON.1 首先我们打开程序,发现 NAG 窗口 我们要想办法先去掉这个窗口 使用 x32dbg 打开015号程序,右键搜索字符串 我们看到了 00402C85 这个地址是 NAG 的提示字符串地址,点击进入该地址 我们向上翻看来到段首处 00402C12 | 5B | pop ebx | 00402C13 | C9 | leave | 00402C14 | C2 0400 | ret 4 | 00402C17 | 55 | push ebp | NAG 段首处 00402C18 | 8BEC | mov ebp,esp | 00402C1A | 83EC 0C | sub esp,C | 00402C1D |

C++写壳之高级篇

梦想与她 提交于 2019-11-28 03:49:23
来源: https://bbs.pediy.com/thread-251267.htm 看雪论坛 作者:九阳道人 之前在写了写壳基础篇,现在就来完成写壳高级篇。没有基础篇的知识,那理解高级篇就比较困难。有了写壳基础后,才能在其基础上逐步实现高级功能,加壳的目的主要是防止别人破解,而想要别人很难破解,我认为要在花指令、混淆和指令虚拟化上大量的时间及脑力才能做到,这个比较费脑力费时间。我在此就说说一些能快速入门的反调试技术,下面说的难度将逐渐提升。 主要工具: VS2017、x64dbg、OD 实验平台:win10 64位 实现功能:反调试、IAT加密、Hash加密、动态解密。 一、反调试 顾名思义,就是阻止别人调试程序,在PEB结构中有一个BegingDebugged标志位专门用于检测是否处于调试状态,为1则处于调试状态,用VS2017测试下列程序: 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 #include "pch.h" #include <iostream> #include <windows.h> / / 反调试 1 bool PEB_BegingDebugged() { bool BegingDebugged = false; __asm { mov eax, fs:[

海康威视多路播放开发步骤及参考代码

断了今生、忘了曾经 提交于 2019-11-28 02:12:06
在我们使用摄像头进行二次开发的过程中,我们通常会遇到需要使用双目甚至多目摄像头的问题,这时候我们就需要二次开发的软件有多路播放的功能,这里,我们还是首先上预览图, 需要程序示例Demo的请点击此处下载 : 为了实现视频的多路播放,我们需要首先了解视视频的实时流回调函数: NET_DVR_SetRealDataCallBack 注册回调函数,捕获实时码流数据。 BOOL NET_DVR_SetRealDataCallBack( LONG lRealHandle, fRealDataCallBack cbRealDataCallBack, DWORD dwUser ); 参数: lRealHandle [in] NET_DVR_RealPlay或NET_DVR_RealPlay_V30的返回值 cbRealDataCallBack [in] 码流数据回调函数 dwUser [in] 用户数据 这里我们可以看到,我们需要实现多路播放,其实质就是要多次调用这个实时流函数,这里我们需要定义多个 lRealHandle 参数加以区分,这里我们以双路播放为例演示如何实现多路播放 Step1: 首先要创建用于显示相机播放的静态文本框(其实就是静态文本框,但是为了在编程过程中界面显示的方便,我们需要将文本框拉大成合适的大小并将文本框的边框属性设置为True): 拖拽两个用于存放实时预览的静态控件

写壳1

本小妞迷上赌 提交于 2019-11-27 20:35:59
写壳的步骤 编写加壳器,加载被加壳程序和壳dll程序 将 dll 程序中 .text 拷贝到被加壳程序 将被加壳程序的 eip 指向stub 代码 需要让 stub 提供一个入口点 1. 加载 PE 文件5. 加载 Stub 文件 8. 加载共享数据,写入了原始OE篇2. 添加了一个区段4. 实现了一个 stub 提供了 start 7. 提供了一个共享数据结构 9. 重新跳转到 oep3. 将区段的内容进行了拷贝6. 重新设置了 oep10. 因为没有进行壳代码重定位,所以跳转失败 11. 对壳代码进行了重定位12. 加密代码段,保存了 key rva size13. 壳代码根据提供的内容进行解密 14. 解密时分页没有访问属性 15. 提供了获取函数的功能,添加了一个 VirtualProtect 函数 16. 设置属性,修复了加密的后的代码,最终跳转oep 首先,加载要加壳的PE文件 // 加载一个 PE 文件void CMyPack::LoadFile(LPCSTR FileName){ // 打开一个文件,理论上应该对文件进行判断,是否是一个 PE 文件,位数是多少 HANDLE FileHandle = CreateFileA(FileName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN

《Windows程序设计》之计时器2

我怕爱的太早我们不能终老 提交于 2019-11-27 18:42:04
这是使用SetTimer的第二种方法-----回调函数 下面是几行关键的代码 VOID CALLBACK TimerProc(HWND,UINT,UINT,DWORD);//定义回调函数 SetTimer(hwnd,ID_TIMER,1000,TimerProc);//设置计时器,并调用回调函数 //回调函数实现 void CALLBACK TimerProc(HWND hwnd,UINT message,UINT iTimerID,DWORD dwTime) { static BOOL fFlipFlop=FALSE; HBRUSH hBrush; HDC hdc; RECT rc; MessageBeep(-1); fFlipFlop=!fFlipFlop; GetClientRect(hwnd,&rc); hdc=GetDC(hwnd); hBrush=CreateSolidBrush(fFlipFlop?RGB(255,0,0):RGB(0,0,255)); FillRect(hdc,&rc,hBrush); ReleaseDC(hwnd,hdc); DeleteObject(hBrush); } 来源: CSDN 作者: l0g1n 链接: https://blog.csdn.net/l0g1n/article/details/7495577

外挂

你。 提交于 2019-11-27 17:04:10
外挂 前言 记得小学的时候玩页游把家里电脑弄坏了(怎么回事,页游还能弄坏电脑?),然后我爸拿去重新装了系统,回来之后电脑里有了两个新的单机游戏,植物大战僵尸和大鱼吃小鱼。 那个年代周围的小学生都是赛尔号/奥比岛/洛克王国/天书奇谭/龙之刃/梦幻西游,玩摩尔庄园的小学生说出来都不是九年义务教育的。植物大战僵尸虽然现在看来比较久远,但他的游戏元素却是推生出许多游戏音乐文化,比如Billie Eilish的《bad guy》,节奏简直就是植物大战僵尸的 灯 灯 灯 灯 灯灯~ 了。 当时因为生存模式被虐,在网上找了修改器,可以修改阳光点数,那时候虽然没学计算机专业,但对修改器的运行机制还是有所猜测的,当时小学因为不知道内存这回事,所以是觉得修改的文件中的数据。 这个猜测如今看起来很搞笑,但也不失道理(要开始狡辩了),有些游戏的数据可能是先放在文件中的,在游戏启动之后把文件中的数据读取到游戏的内存区域,所以我们需要先修改数据所在的文件内容,然后启动游戏,但是很多游戏的数据文件是加密的(出大问题,骑马与砍杀就没有加密),我们没办法从文件进行修改,所以需要让游戏进程先把它读到内存,然后从内存修改,然后再退出游戏的时候游戏进程自动把它保存下来,之后也就是这个数据了。 所以综上可以发现有这几类修改对象: 游戏数据在本地未加密文件,直接修改它来修改游戏数据 这一类的代表就是骑马与砍杀

串口写入和读取数据

坚强是说给别人听的谎言 提交于 2019-11-27 16:18:16
SerialPort类 WriteComm 写串口函数 DWORD CSerialPort::WriteComm(char *buf, DWORD dwLength) { if(!IsOpen()) { return 0; } assert(buf != NULL); COMSTAT comStat; DWORD dwErrorFlags; if (!ClearCommError(m_hCom, &dwErrorFlags, &comStat) && dwErrorFlags > 0) { PurgeComm(m_hCom, PURGE_TXABORT | PURGE_TXCLEAR); } OVERLAPPED osWrite; memset(&osWrite, 0, sizeof(OVERLAPPED)); osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); BOOL bWriteStat = WriteFile(m_hCom, buf, dwLength, &dwLength, &osWrite); if(!bWriteStat) { if(GetLastError() == ERROR_IO_PENDING) { WaitForSingleObject(osWrite.hEvent, 2000); } else {