影子经纪人-官网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 151|回复: 11

PE文件笔记八 实战之HOOK程序添加弹窗

[复制链接]

该用户从未签到

2

主题

2

帖子

6

积分

审核员

Rank: 7Rank: 7Rank: 7

积分
6
发表于 2021-7-20 00:14:39 | 显示全部楼层 |阅读模式
继续PE系列笔记的更新
PE其它笔记索引可前往:
PE文件笔记一 PE介绍
前面学习了PE的结构后,尝试结合先前所学,修改PE文件来实现给程序添加弹窗的功能
PS:这篇笔记并没有怎么涉及PE的知识点,重点放在了HOOK、反汇编和硬编码上,对PE不是很了解也可以看看,涉及PE知识点的内容放在了后面的笔记:PE文件笔记九 实战之HOOK程序添加弹窗续,可以放心食用( ̄︶ ̄)↗ 
PE实战之给程序添加弹窗

修改流程

要给程序添加弹窗,首先就是要了解其修改的流程
首先要修改的便是程序原本的入口地址,将其修改为弹窗代码所在的地址
弹窗代码所在的地址,要在PE文件中找到一片区域,该区域需要 满足 可执行、可读、可写的权限,然后在这片区域写入弹窗代码,弹窗代码的最后要跳转回原本的入口地址
该修改流程是一种十分经典的HOOK思想,即程序按照原本的流程执行着,你把它原本执行的代码修改了,修改去干我们想要做的事情,做完我们想要的事情后再把它放回去继续执行原本的代码
图解HOOK修改流程

网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(1)
被HOOK的地方为B
正常流程 A→B→C
HOOK流程 A→被HOOK的B→自己的代码→复原B中被修改的部分→跳转回B原本要接着执行的地方→C
图解给程序添加弹窗

网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(2)
弹窗代码

既然要给程序添加弹窗,自然需要知道如何通过代码显示一个简单的弹窗
下面给出一个简单的弹窗代码
  1. #include <Windows.h>
  2. int main() {
  3.     //调用MessageBoxA函数
  4.     //显示一个 没有所有者窗口的、内容为lyl610abc的、标题为tips的、只包含一个按钮:OK的 窗口
  5.     MessageBoxA(0, "lyl610abc", "tips", 0);
  6.     return 0;
  7. }
复制代码
运行结果

网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(3)
MessageBoxA

下面为介绍MessageBoxA的使用文档,熟悉MessageBoxA的可以跳过,直接跳到后面的查看反汇编即可
函数原型
  1. int MessageBoxA(
  2.   HWND   hWnd,
  3.   LPCSTR lpText,
  4.   LPCSTR lpCaption,
  5.   UINT   uType
  6. );
复制代码
参数

参数参数类型含义
hWndHWND(int)要创建的消息框的所有者窗口的句柄。如果该参数为空,则消息框没有所有者窗口
lpTextLPCSTR(CONST CHAR *)要显示的消息。如果字符串包含多行,可以在每行之间使用回车符和/或换行符来分隔行
lpCaptionLPCSTR(CONST CHAR *)对话框的标题。如果该参数为空,则默认标题为Error
uTypeUINT(unsigned int)对话框的内容和行为
uType

对话框的内容和行为。该参数可以是下列标志组中的标志的组合
要指示消息框中显示的按钮,请指定以下值之一:
宏定义含义
MB_ABORTRETRYIGNORE0x00000002L消息框包含三个按钮:中止、重试和忽略
MB_CANCELTRYCONTINUE0x00000006L消息框包含三个按钮:取消、重试、继续。使用此消息框类型而不是MB_ABORTRETRYIGNORE
MB_HELP0x00004000L将“帮助”按钮添加到消息框。当用户单击帮助按钮或按下F1时,系统将向所有者发送一条WM_HELP消息
MB_OK0x00000000L消息框包含一个按钮:OK。这是默认值
MB_OKCANCEL0x00000001L消息框包含两个按钮:OK和Cancel
MB_RETRYCANCEL0x00000005L消息框包含两个按钮:重试和取消
MB_YESNO0x00000004L消息框包含两个按钮:Yes和No
MB_YESNOCANCEL0x00000003LT消息框包含三个按钮:Yes、No和Cancel
要在消息框中显示图标,请指定以下值之一:
宏定义含义
MB_ICONEXCLAMATION0x00000030L消息框中会出现一个感叹号图标
MB_ICONWARNING0x00000030L消息框中会出现一个感叹号图标
MB_ICONINFORMATION0x00000040L消息框中会出现一个由小写字母i组成的圆圈图标
MB_ICONASTERISK0x00000040L消息框中会出现一个由小写字母i组成的圆圈图标
MB_ICONQUESTION0x00000020L一个问号图标出现在消息框中。不再推荐使用问号消息图标,因为它不能清楚地表示特定类型的消息,而且将消息表述为问题可以应用于任何类型的消息。此外,用户可能会将消息符号问号与帮助信息混淆。因此,不要在您的消息框中使用这个问号消息符号。系统继续支持它,只是为了向旧版本兼容
MB_ICONSTOP0x00000010L消息框中出现停止标志图标
MB_ICONERROR0x00000010L消息框中出现停止标志图标
MB_ICONHAND0x00000010L消息框中出现停止标志图标
要指定默认按钮,请指定以下值之一:
宏定义含义
MB_DEFBUTTON10x00000000L第一个按钮是默认按钮。 除非指定了MB_DEFBUTTON2、MB_DEFBUTTON3或MB_DEFBUTTON4,否则MB_DEFBUTTON1是默认值
MB_DEFBUTTON20x00000100L第二个按钮是默认按钮
MB_DEFBUTTON30x00000200L第三个按钮是默认按钮.
MB_DEFBUTTON40x00000300L第四个按钮是默认按钮
若要指示对话框的模式,请指定以下值之一:
宏定义含义
MB_APPLMODAL0x00000000L用户必须响应消息框,然后才能在hWnd参数标识的窗口中继续工作。然而,用户可以移动到其他线程的窗口并在这些窗口中工作。 根据应用程序中窗口的层次结构,用户可以移动到线程中的其他窗口。消息框父窗口的所有子窗口都会被自动禁用,但弹出窗口不会。  如果没有指定MB_SYSTEMMODAL或MB_TASKMODAL,则MB_APPLMODAL是默认值
MB_SYSTEMMODAL0x00001000L与MB_APPLMODAL相同,只是消息框具有WS_EX_TOPMOST样式。使用系统模式消息框来通知用户需要立即注意的严重的、潜在的破坏性错误(例如,内存耗尽)。这个标志对用户与windows交互的能力没有影响,除了那些与hWnd相关的
MB_TASKMODAL0x00002000L与MB_APPLMODAL相同,只是当hWnd参数为NULL时,属于当前线程的所有顶级窗口都被禁用。当调用应用程序或库没有可用的窗口句柄,但仍然需要防止输入到调用线程中的其他窗口而不挂起其他线程时,使用此标志
要指定其他选项,请使用下列一个或多个值:
宏定义含义
MB_DEFAULT_DESKTOP_ONLY0x00020000L与交互式窗口站的桌面相同。有关更多信息,请参见Window Stations. 如果当前输入的桌面不是默认桌面,MessageBox直到用户切换到默认桌面才会返回。
MB_RIGHT0x00080000L文本是右对齐的
MB_RTLREADING0x00100000L在希伯来语和阿拉伯语系统上使用从右到左的阅读顺序显示消息和标题文本
MB_SETFOREGROUND0x00010000L消息框成为前台窗口。在内部,系统为消息框调用SetForegroundWindow函数
MB_TOPMOST0x00040000L消息框使用WS_EX_TOPMOST窗口样式创建
MB_SERVICE_NOTIFICATION0x00200000L调用者是一个通知用户事件的服务。即使没有用户登录到计算机,该功能也会在当前活动桌面上显示一个消息框。 终端服务:如果调用线程有一个模拟令牌,该函数将消息框定向到模拟令牌中指定的会话。  如果设置此标志,则hWnd参数必须为空。这样可以在hWnd对应的其他桌面上显示该消息框。  有关使用此标志的安全注意事项的信息,请参见Interactive Services。特别要注意的是,这个标志可以在锁定的桌面上生成交互式内容,因此应该只用于非常有限的场景,比如资源耗尽。
返回值

返回值类型:int
    如果消息框有一个取消按钮,如果ESC键被按下或取消按钮被选中,该函数将返回IDCANCEL值。如果消息框没有取消按钮,按ESC将没有效果-除非MB_OK按钮存在。如果出现MB_OK按钮,按“ESC”键,返回值为“IDOK”。
    如果函数失败,返回值为0。要获取扩展的错误信息,请调用 GetLastError
    如果函数成功,返回值是下面的菜单项值之一:
    返回码描述
    IDABORT3Abort按钮被选中
    IDCANCEL2Cancel按钮被选中
    IDCONTINUE11Continue按钮被选中
    IDIGNORE5Ignore按钮被选中
    IDNO7No按钮被选中
    IDOK1OK按钮被选中
    IDRETRY4Retry按钮被选中
    IDTRYAGAIN10Try Again按钮被选中
    IDYES6Yes按钮被选中

通过将uType参数设置为对应的标志值,可以在消息框中使用以下系统图标
图标Flag 值
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(4) MB_ICONHAND, MB_ICONSTOP, 或 MB_ICONERROR
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(5) MB_ICONQUESTION
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(6) MB_ICONEXCLAMATIONMB_ICONWARNING
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(7) MB_ICONASTERISKMB_ICONINFORMATION
查看反汇编
  1. 9:        MessageBoxA(0,"lyl610abc","tips",0);
  2. 00401028 8B F4                mov         esi,esp
  3. 0040102A 6A 00                push        0
  4. 0040102C 68 28 20 42 00       push        offset string "tips" (00422028)
  5. 00401031 68 1C 20 42 00       push        offset string "lyl610abc" (0042201c)
  6. 00401036 6A 00                push        0
  7. 00401038 FF 15 AC A2 42 00    call        dword ptr [__imp__MessageBoxA@16 (0042a2ac)]
  8. 0040103E 3B F4                cmp         esi,esp
  9. 00401040 E8 2B 00 00 00       call        __chkesp (00401070)
复制代码
这里截取出关键的代码
  1. 0040102A 6A 00                push        0
  2. 0040102C 68 28 20 42 00       push        offset string "tips" (00422028)
  3. 00401031 68 1C 20 42 00       push        offset string "lyl610abc" (0042201c)
  4. 00401036 6A 00                push        0
  5. 00401038 FF 15 AC A2 42 00    call        dword ptr [__imp__MessageBoxA@16 (0042a2ac)]
复制代码
其余代码说明
  1. 00401028 8B F4                mov         esi,esp                //保存执行前的esp(栈顶)到esi
  2. 0040103E 3B F4                cmp         esi,esp                //比较esi和执行完call后的esp(栈顶)
  3. 00401040 E8 2B 00 00 00       call        __chkesp (00401070)        //调用检测esp的函数
复制代码
用来检测,调用完函数后堆栈是否保持平衡,是C语言自动生成的,这里无需关注
解析反汇编
  1. 0040102A 6A 00                push        0
  2. 0040102C 68 28 20 42 00       push        offset string "tips" (00422028)
  3. 00401031 68 1C 20 42 00       push        offset string "lyl610abc" (0042201c)
  4. 00401036 6A 00                push        0
复制代码
前四行代码是依次压入四个参数(从右到左压入),这和调用协定相关,在逆向基础笔记九 C语言内联汇编和调用协定已说过,这里不再赘述
  1. 00401038 FF 15 AC A2 42 00    call        dword ptr [__imp__MessageBoxA@16 (0042a2ac)]
复制代码
调用call这里,可以看到这是一个间接调用,形式为call [地址],所以这里要查看一下其实际地址里存储的内容是什么,也就是其实际call的地址
通过内存窗口可以得到,其实际call的地址为77D507EA
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(8)
所以此时的代码相当于
  1. 00401038        call        77D507EA
复制代码
这里为什么是一个间接call,77D507EA代表什么?
这里采用间接call的原因是引用了导入表,关于导入表和导出表的内容之后的笔记会再做说明
这里的77D507EA代表的是MessageBoxA函数的地址
每个电脑的MessageBoxA函数的地址不一定相同,它取决于系统的user32.dll中导出表中给出的地址(这里调用的MessageBoxA是由user32.dll提供的)
可以用IDA来验证这一点:
找到系统中的user32.dll(在32位的xp中在C:\WINDOWS\system32下,在64位系统中则有2个,一个在C:\Windows\SysWOW64下(32位的dll),一个也在C:\WINDOWS\system32下(64位的dll),具体使用哪个取决于程序是32位还是64位
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(9)
将其用IDA打开,找到导出表,然后在导出表中搜索得到MessageBoxA
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(10)
可以看到它的地址和前面得到的一致,为77D507EA,验证来源完毕
注意此时的系统是XP32位,在其它高版本的系统中这里的Address并不一定能和前面的一致,这里主要是为了说明函数的来源与导入表和导出表有关,也说明了为何不同系统的MessageBoxA的地址不一定相同,为后面的学习作个铺垫
准确得到函数地址的方法为
如果想要得到MessageBoxA函数的(其它函数同理)地址,首先要找到一个有调用这个函数所属的模块的程序(MessageBoxA所属的模块为user32.dll),使用OD附加来查找:
一般来说只要是图形化的程序都会调用user32.dll这个模块,于是这里就随便拿一个exe程序就行,这里以dbgview.exe为例
使用OD打开dbgview.exe,然后单击图中所指的e,或者使用快捷键Alt+E
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(11)
在弹出来的窗口中找到user32.dll,双击
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(12)
在弹出来的反汇编界面按快捷键 Ctrl+N
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(13)
然后在新窗口找到MessageBoxA对应的地址即可
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(14)
此时得到的地址就是准确的MessageBoxA地址了
自写反汇编测试

测试代码

既然得到了MessageBoxA的函数地址,就无需间接调用了,可以直接调用它,于是自写代码如下:
  1. #include<stdio.h>
  2. #include <windows.h>
  3. int MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uType) {
  4.         int ret;
  5.     //这里的地址填前面通过OD得到的MessageBoxA地址,每个系统不一定相同
  6.     //先前是在xp系统中测试的,那时的MessageBoxA为77D507EA
  7.     //此时换到WIN10 X64 测试,修改MessageBoxA的值
  8.         int addr = 0x76a3ee90;
  9.         __asm {
  10.                 push hWnd               
  11.                 push lpCaption
  12.         push lpText
  13.                 push uType
  14.                 call addr
  15.                 mov ret, eax
  16.         }
  17.         return ret;
  18. }
  19. int main(int argc, char* argv[])
  20. {
  21.         MyMessageBoxA(0, "lyl610abc", "tips", 0);
  22.         return 0;
  23. }
复制代码
测试结果

网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(15)

依然能够正常弹窗,测试成功
反汇编转为硬编码(字节码)

通过先前的学习可以知道在计算机中,无论是执行的代码还是数据都是以二进制来存储的,为了方便查看,进制查看工具将内容以十六进制的方式展示
所以为了给程序添加弹窗,显然就不是直接将反汇编写入PE文件中,而是要将反汇编对应的硬编码(字节码)写入到PE文件中
如何将反汇编转化为硬编码?这个是反汇编引擎所做的事,在OD或VC中的反汇编引擎已经将反汇编对应的硬编码(字节码)给出了
有关反汇编引擎的内容也属于硬编码相关的知识,看以后要不要开这个坑
将前面写的反汇编再稍作修改,将参数写死,并且去掉返回值的接收
修改反汇编代码
  1. #include<stdio.h>
  2. #include <windows.h>
  3. void MyMessageBoxA() {
  4.     //获取MessageBoxA的地址
  5.         int addr = (int)&MessageBoxA;
  6.         printf("addr:%X\n", addr);
  7.     //"lyl610abc"对应的ASCII编码 6c 79 6c 36 31 30 61 62 63
  8.         unsigned char bytes[] = { 0x6c,0x79,0x6c,0x36,0x31,0x30,0x61,0x62,0x63,0x00 };
  9.     //"tips"对应的ASCII编码
  10.         unsigned char bytes2[] = { 0x74,0x69,0x70,0x73 };
  11.         //申请内存,该内存的属性为可执行 可读可写
  12.         LPVOID _lpText = VirtualAlloc(NULL, sizeof(byte), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  13.         //申请内存,该内存的属性为可执行 可读可写
  14.         LPVOID _lpCaption = VirtualAlloc(NULL, sizeof(byte), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  15.         //将硬编码写入申请的有权限的内存中
  16.         WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)_lpText, (BYTE*)bytes, sizeof(bytes), 0);
  17.         //将硬编码写入申请的有权限的内存中
  18.         WriteProcessMemory(INVALID_HANDLE_VALUE, (LPVOID)_lpCaption, (BYTE*)bytes2, sizeof(bytes2), 0);
  19.         __asm {
  20.                 push 0
  21.                 push _lpCaption
  22.                 push _lpText
  23.                 push 0
  24.                 call addr
  25.         }
  26. }
  27. int main(int argc, char* argv[])
  28. {
  29.         MyMessageBoxA();
  30.         return 0;
  31. }
复制代码
OD模拟代码操作

先总结一下上面修改后的反汇编代码做了什么
    获得MessageBoxA的函数地址将字符串对应的ASCII码写入到可读可写的一片内存中压入参数调用MessageBoxA函数调用完后跳转回原本要执行的代码
然后在OD中复现操作
用OD随便载入一个包含user32.dll模块的程序,我这里直接拿前面的代码编译后的程序来作演示
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(16)
按照前面总结的步骤来
1.MessageBoxA在OD中的地址是已知的无需获取
2.将字符串对应的ASCII码写入到可读可写的一片内存中
首先是选取一块可读可写的内存,很显然,接下来要执行的代码一定是可读可写可执行的,于是这里就无须申请内存了,直接将下面的代码覆盖即可
解决了选取内存的问题,接下来就是将字符串对应的ASCII码写入内存即可,但这要放在压入参数之后,原因后面会说明,现在先看压入参数
3.压入参数
第一个参数为0,直接将其对应的反汇编修改为push 0即可
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(17)
第二个参数为_lpCaption,要写入的字符串为"tips",但此时字符串还没写入内存,也就是并不确定字符串的内存地址,但可以确定一个大致的范围,要存放字符串的地方就在下方不远处,于是这里可以暂时先填写离这里不远的随便一个内存地址用来占位,等之后确定了字符串的内存地址后再回来修改
这里就随便选取下面的地址00401156
于是将反汇编修改为push 0x00401156
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(18)
第三个参数为_lpText,要写入的字符串为"lyl610abc",和前面的_lpCaption一样,先填入push xxxx占位,之后再回来修改
于是依旧将其反汇编修改为push 0x00401156
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(19)
第四个参数为0,直接将其对应的反汇编修改为push 0即可
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(20)
4.调用MessageBoxA函数
直接修改反汇编为call MessageBoxA即可
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(21)
5.调用完后跳转回原本要执行的代码
这里是为了模拟之后执行完弹窗代码后再跳回程序入口
这里随便模拟一个长跳转即可,修改反汇编代码为jmp 000412D0
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(22)
6.填充字符串到内存中
下面的代码因为前面的绝对跳转是不会执行的,因此可以用来充当数据区,这也是要将字符串的填充放在后面的原因
先填充_lpText,也就是"lyl610abc"
选中跳转下的那一行,右键→二进制→编辑
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(23)
选中ASCII,并将要写入内存的字符串 "lyl610abc"填入
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(24)
填入后再选中Hex那一行,在后面添加00(字符串以'\0’结尾)
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(25)
添加完00后得到
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(26)
然后确定即可
修改完得到
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(27)
这是第三个参数_lpText就可以修正了,将前面的压入第三个参数的反汇编修改为 push 0x00401148
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(28)
同样的方法填充第二个参数_lpCaption,也就是"tips"
这里先记录一下其地址为0x00401152,然后开始修改
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(29)
修改完后得到:
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(30)
最后再修正先前push的用来占位的地址即可
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(31)
修改完成,这里记录一下修改的十六进制代码为
  1. 6A 00 68 52 11 40 00 68 48 11 40 00 6A 00 E8 A7 F6 94 77 E9 88 01 C4 FF 6C 79 6C 36 31 30 61 62
  2. 63 00 74 69 70 73 00
复制代码
修改完成后不断按F8单步步过,直call user32.MessageBoxA这
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(32)
可以看到,对应的参数是没有问题的
最后再按F8单步步过即可看到结果:
网络新闻动向交流-继续PE系列笔记的更新PE其它笔记索引可前往:PE文件笔记一 PE介绍前面学习了PE的结构后,尝试结合先前所(33)
能够按照代码弹框,完成( •̀ ω •́ )✧
说明

限于篇幅原因,这次的笔记主要讲解了弹窗代码的编写流程,之后的笔记则是将上面的硬编码稍作修改然后写入PE文件中再修改PE入口点来实现最终目的
终于来到实战环节了,前面关于知识点介绍的笔记看的人数一言难尽,希望通过实战能够勾起大家的兴趣,一起学习共同进步O(∩_∩)O
最后再附上 上面OD修改的程序,有兴趣的可以跟着做一做

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 00:14:58 | 显示全部楼层
//申请内存,该内存的属性为可执行 可读可写
        LPVOID _lpText = VirtualAlloc(NULL, sizeof(byte), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
        //申请内存,该内存的属性为可执行 可读可写
        LPVOID _lpCaption = VirtualAlloc(NULL, sizeof(byte), MEM_COMMIT, PAGE_EXECUTE_READWRITE);

大佬,上面申请内存的代码的第二个参数是不是应该改为sizeof(bytes)和sizeof(bytes2)?
回复

使用道具 举报

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 00:15:50 | 显示全部楼层
不是营销,是慢慢积累,量多了才有质变,我听我老师说,他们那十万粉丝的号,每个月收入可以养几个人。吾爱要浏览你的全部文章,必须是注册会员,普通人是看不到你的个人信息的。只能通过搜索得到。我就是因为这个原因才立马开了会员。:Q
回复

使用道具 举报

该用户从未签到

2

主题

561

帖子

463

积分

中级会员

Rank: 3Rank: 3

积分
463
发表于 2021-7-20 00:16:40 | 显示全部楼层
谢谢大佬 学习了
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 00:17:28 | 显示全部楼层
谢谢啦,学习
回复

使用道具 举报

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 00:18:19 | 显示全部楼层
首当其冲,大佬百度一下这个成语到底什么意思,
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 00:19:17 | 显示全部楼层
感谢分享,现在肯分享技术的不多,建议大佬自己搞个公众号,发布文章。以后就是简历了
回复

使用道具 举报

该用户从未签到

0

主题

610

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 00:20:06 | 显示全部楼层
感谢分享
回复

使用道具 举报

该用户从未签到

0

主题

615

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2021-7-20 00:20:21 | 显示全部楼层
感谢大佬分享,学习了
回复

使用道具 举报

该用户从未签到

2

主题

561

帖子

463

积分

中级会员

Rank: 3Rank: 3

积分
463
发表于 2021-7-20 00:20:45 | 显示全部楼层
虽然看不懂。。。。。但是感谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭Powered by ©科大讯飞语音云

QQ|Archiver|手机版|小黑屋|TBC ( 鄂ICP备19004742号(鄂ICP备19004742号-2) )|网站地图|鄂ICP备19004742号(鄂ICP备19004742号-2) 联系站长

GMT+8, 2021-7-29 14:23 , Processed in 1.062500 second(s), 100 queries .

Powered by TBC! X3.4

© 2001-2020 TBC.. 技术支持 by 中国c.n.m安全小组

快速回复 返回顶部 返回列表