首页
社区
课程
招聘
动态修改别的进程运行流程[原创]
发表于: 2006-5-25 16:03 12766

动态修改别的进程运行流程[原创]

2006-5-25 16:03
12766
动态修改别的进程运行流程(原创)

【研究作者】 盖重阳
【使用工具】 OllyDbg1.10,VS2003
【研究平台】 Win2k3
【软件名称】 自己写的T.exe
【研究日期】 2006-5-20
【程序+代码下载】 http://bbs.pediy.com/attachment.php?s=&attachmentid=1597
简介

因为工作需要 我要完成这个功能 所以就研究研究了 昨日研究了一天 已经成功
现贴出来大家一起分享
------------------------------------------------------------------------------------
原理

和静态修改程序运行流程类似
动态的就是修改了映射在内存中的代码~

当双击exe程序以后 windows 会把 在磁盘上的文件映射到内存中然后开始运行
只要修改该进程的内存中的运行的代码 就可以实现动态修改

问:修改程序流程有什么用
答:加入自己的代码实现某些功能等

问:动态修改比静态修改有什么好处。
答:不用考虑壳的检测等....
------------------------------------------------------------------------------------

具体实现

以下详细说明 是程序自己修改自己的运行流程   // 注意 是自己进程修改自己的 并不是修改其他进程的

为了简单起见

我用MFC创建了一个对话框
写了一个Test 按钮 该功能是弹出MessageBoxA

就从修改 MessageBoxA 开始
原始的按钮



第一步
要修改内存中的数据 首先要查询要修改的段的权限,然后设置读写权限.

od载入 找到Test 按钮的 地址



00401150 t.> .  6A 00             PUSH    0                                                   ; /Style = MB_OK|MB_APPLMODAL
00401152     .  68 58264000       PUSH    t.00402658                                          ; |Title = "test"
00401157     .  68 58264000       PUSH    t.00402658                                          ; |Text = "test"
0040115C     .  6A 00             PUSH    0                                                   ; |hOwner = NULL
0040115E     .  FF15 E4224000     CALL    DWORD PTR DS:[<&USER32.MessageBoxA>]                ; \MessageBoxA
00401164     .  C3                RETN

好 先修改 Title 和 Text 的 数据 看看效果

由于 该数据存在 00402658  所以就先把该段权限设置为 读写

MEMORY_BASIC_INFORMATION mbi;
//PAGE_EXECUTE_READ
VirtualQuery((LPCVOID)0x00402000,&mbi,sizeof(mbi));                //查询.rdata 段
DWORD dwOLD;
VirtualProtect((LPVOID)0x00402000,0x1000,PAGE_EXECUTE_READWRITE,&dwOLD);        //修改.rdata 段
       

一会这里还有修改运行时的代码 这里也把代码段权限设置了

VirtualQuery((LPCVOID)0x00401000,&mbi,sizeof(mbi));                //查询 .text 段
       
VirtualProtect((LPVOID)0x00401000,0x1000,PAGE_EXECUTE_READWRITE,&dwOLD);        //修改 .text段

-----------------------------------------------------------------------------
第二步

先修改 MessageBoxA内容和标题 练练手

新建一个按钮
代码如下

修改程序中运行的数据,看看效果
        __asm
        {
                mov eax,0x00402658    //MessageBoxA的 字符串地址(Test) 上边找到的
                mov dword ptr [eax], 0x30303030                //动态修改数据 修改为0000
        }
好 到这里 已经动态修改内容和标题了
运行Test按钮 发现变成 0000了 ^_^


好继续

-----------------------------------------------------------------------------
第三步

功能实现:

这次我要让Test按钮 点了以后 出现2个MessageBoxA
多加入一个MessageBoxA

准备工作:

找到Test的按钮地址


00401150 t.> .  6A 00             PUSH    0                                                   ; /Style = MB_OK|MB_APPLMODAL
00401152     .  68 58264000       PUSH    t.00402658                                          ; |Title = "test"
00401157     .  68 58264000       PUSH    t.00402658                                          ; |Text = "test"
0040115C     .  6A 00             PUSH    0                                                   ; |hOwner = NULL
0040115E     .  FF15 E4224000     CALL    DWORD PTR DS:[<&USER32.MessageBoxA>]                ; \MessageBoxA
00401164     .  C3                RETN

我这里要 让程序本身的MessageBoxA运行完以后再运行我加入的代码

所以 我就先找一段空地址  我用od拉到最下边找到0x00401fd0 地址
这里没数据
我写上代码 调用MessageBoxA的代码

push 0
push 00402658
push 00402658
push 0

CALL DWORD PTR DS:[<&USER32.MessageBoxA>]   //这里可以cpy 上边MessageBoxA的机器码 到这里粘贴出来就可以了

好 把这一段代码的机器码cpy出来

然后把
00401164 这里修改为 jmp 0x00401fd0 //跳转到我的地址
复制机器码 留备修改

正式修改运行流程:

BYTE codeJmp[]={0xE9,0x67,0x0e,0x00,0x00};  // jmp 0x00401fd0
BYTE codejz[]={0x6A,0x00,0x68,0x58,0x26,0x40,0x00,0x68,0x58,0x26,0x40,0x00,0x6A,0x00,0xFF,0x15,0xE4,0x22,0x40,0x00,0xc3,0x90}; //自己的MessageBoxA

::WriteProcessMemory(GetCurrentProcess(),(LPVOID)0x00401164,(LPCVOID)codeJmp,5,NULL); //改变 00401164 的ret 为 jmp 0x00401fd0



::WriteProcessMemory(GetCurrentProcess(),(LPVOID)0x00401fd0,(LPCVOID)codejz,22,NULL); //在0x00401fd0 写入自己的代码



我这里用了 ::WriteProcessMemory 写入 也可以 用asm写入 都一样

我的程序中还有一个还原的按钮 自己可以看源代码 比较简单

---------------------------------------------------------------------
第四步
修改别的进程的运行代码

呵呵 注入了修改~

完成

------------------------------------------------------------------
win2k3
vs2003 编译成功 修改运行成功

题外话:大家别看这我写的省事,当自己修改自己的时候,每次编译时只要添加了代码 数据地址就会跟着变得 自己修改的代码的位置也要更新 另外代码段 也会改变的 注意。 我就费了很多事,还真不如修改别的程序省事 呵呵

此方法 比较有局限性 配合Hook Api 一起使用 较好~
可以实现 很多功能!~!

[课程]Linux pwn 探索篇!

上传的附件:
收藏
免费 7
支持
分享
最新回复 (29)
雪    币: 199
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2006-5-25 16:17
0
雪    币: 313
活跃值: (440)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
3
游戏修改器是不是也就是这样的?
2006-5-25 16:26
0
雪    币: 2384
活跃值: (766)
能力值: (RANK:410 )
在线值:
发帖
回帖
粉丝
4
最初由 4nil 发布
游戏修改器是不是也就是这样的?

差不多。
2006-5-25 16:27
0
雪    币: 205
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
最初由 4nil 发布
游戏修改器是不是也就是这样的?


游戏修改器 大多都是修改内存数据的

不修改运行的代码的 呵呵

外挂 是要修改运行的代码的 ^_^
2006-5-25 16:28
0
雪    币: 205
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
哈哈  混来个精 !!

哪位老大 给的呀~~

我在这里谢谢了阿~!!~~
2006-5-25 16:47
0
雪    币: 398
活跃值: (1078)
能力值: ( LV9,RANK:970 )
在线值:
发帖
回帖
粉丝
7


标题说是修改别的进程啊?
2006-5-25 18:47
0
雪    币: 205
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
最初由 simonzh2000 发布


标题说是修改别的进程啊?


看第4步 写了

注入 修改!!~~~ ^_^
2006-5-25 19:39
0
雪    币: 159
活跃值: (339)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
9
呵呵...这不就是传说中的“野猪的力量”吗?
2006-5-25 20:21
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
10
和内存补丁一个概念,我是这样理解的
2006-5-25 20:29
0
雪    币: 172
活跃值: (212)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
学习了!!!
2006-5-25 21:31
0
雪    币: 242
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
学习学习!!
2006-5-25 22:04
0
雪    币: 203
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习呀,特别喜欢这种的
2006-5-26 00:17
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
学习,留个记号,lz还请多发些这些上来让我们这些菜鸟好学习学习
2006-5-26 02:54
0
雪    币: 506
活跃值: (388)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
15
这个好,上回那个“野猪力量”看不懂。

问个傻子问题:硬盘上的程序运行后被调入内存中的区块,那这个区块是否是连续的?加壳的话,是不是把这个区块打散?加花指令就是往这个区块里加入垃圾代码让人读了费力是吧,偷代码是不是把几个代码这里放一块那里放一块割割开了放是不是?
2006-5-26 08:43
0
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
16
最初由 Tee8088 发布
这个好,上回那个“野猪力量”看不懂。

问个傻子问题:硬盘上的程序运行后被调入内存中的区块,那这个区块是否是连续的?加壳的话,是不是把这个区块打散?加花指令就是往这个区块里加入垃圾代码让人读了费力是吧,偷代码是不是把几个代码这里放一块那里放一块割割开了放是不是?


1. 是连续的, 但由于对齐的原因会有一些00被填入;
2. 壳会重新组织PE结构,但在内存中会还原;
3. 花指令是在程序中加一些没有意义的代码来欺骗反汇编工具;
4. 偷代码通常是壳把一部分程序的代码“搬”到壳自身或者其他的地方来干扰修复...
2006-5-26 08:59
0
雪    币: 506
活跃值: (388)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
17
那如果加密壳偷了代码,那SMC是不是就不能用了,过不了它加密的那一关?

SMC是不是在壳自已要用到程序时,它会把程序在内存里分散的几块肉用根线先穿穿好组织起来,然后让它运行,我们就在这个它组织好后FUCK它是吧??那壳的一段提示注册的过程是不是在这个组织好串起来之后?如果是的话,那这个SMC是不是就是改跳转跳过壳里的注册过程,让那块完整的肉没有阻碍的运行?
2006-5-26 09:20
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
Good!
学习,我试试看。
感谢楼主!
2006-5-29 09:18
0
雪    币: 117
活跃值: (20)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
业主的力量――住入!

2006-5-29 13:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
顶哦这个好哦.学习中
2006-5-30 21:37
0
雪    币: 488
活跃值: (3149)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
21
修改器并不都是修改数据内存,有不少修改器也会注入,修改程序流程,尤其是要实现一些比较BT的功能的时候,比如防秒杀,穿墙,突破参数上限限制等
2006-5-31 16:29
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
22
对了,上次有篇讲tlsback的文章,那个tlsback表在程序载入内存后能不能动态改啊
2006-5-31 21:26
0
雪    币: 95
活跃值: (419)
能力值: ( LV9,RANK:310 )
在线值:
发帖
回帖
粉丝
23
可以先用LORDPE更改区段的属性........
2006-5-31 22:07
0
雪    币: 207
活跃值: (41)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
24
楼主能否详细介绍一下是如何实现这个的

由于 该数据存在 00402658  所以就先把该段权限设置为 读写

MEMORY_BASIC_INFORMATION mbi;
//PAGE_EXECUTE_READ
VirtualQuery((LPCVOID)0x00402000,&mbi,sizeof(mbi));    //查询.rdata 段
DWORD dwOLD;
VirtualProtect((LPVOID)0x00402000,0x1000,PAGE_EXECUTE_READWRITE,&dwOLD);  //修改.rdata 段
  

一会这里还有修改运行时的代码 这里也把代码段权限设置了

VirtualQuery((LPCVOID)0x00401000,&mbi,sizeof(mbi));    //查询 .text 段
  
VirtualProtect((LPVOID)0x00401000,0x1000,PAGE_EXECUTE_READWRITE,&dwOLD);  //修改 .text段
2006-6-1 03:37
0
雪    币: 205
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
25
最初由 njzzzzzz 发布
楼主能否详细介绍一下是如何实现这个的

由于 该数据存在 00402658 所以就先把该段权限设置为 读写

MEMORY_BASIC_INFORMATION mbi;
........


od 载入 找到 Test的位置 察看代码

就能找到 00402658  的"test"字符串

然后 设置该段 属性即可
2006-6-2 00:07
0
游客
登录 | 注册 方可回帖
返回
//