首页
社区
课程
招聘
[旧帖] 如何动态修改程序的参数 0.00雪花
发表于: 2010-10-5 15:28 5965

[旧帖] 如何动态修改程序的参数 0.00雪花

2010-10-5 15:28
5965
已知某程序A,它所用到的参数其种一个如下
mov     edx, dword ptr [esp+1C]   由于这个[esp+1C]的值不符合我们的实际需要
现在我想将上面的
mov     edx, dword ptr [esp+1C]
修改成push 00140000
用OD是可以直接修改,但问题是,源代码修改了,地址00140000处的值为0
虽然我们可以在OD里面直接给00140000赋值,但我现在需要的是想自己编写一个程序(限定用win32汇编)来实现上面的修改
我自己用过CreateProcess与WriteProcessMemory配合,同时还用了VirtualAllocEx来在目标进程申请内存,但都不能修改
声明:在很多QQ群发过此问题,无人知道,最后把希望放在看雪上,看看有没有高手给思路
有源代码最好,没有,给出处理思路也行
谢谢

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 468
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
这个确实很简单。
2010-10-5 15:40
0
雪    币: 2109
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
VirtualProtect

http://bbs.pediy.com/showthread.php?t=33014

http://sluttery.spaces.live.com/blog/cns!3569FEA80C717FD4!3501.entry

http://baike.baidu.com/view/1786426.htm

http://topic.csdn.net/u/20081012/19/4a63ba7f-460f-4b22-ab81-fe46f6dea267.html
"首先应该 OpenProcess  

然后在VirtualProtectEx
再 ReadProcessMemory/WriteProcessMemory
再 VirtualProtectEx"
2010-10-5 16:56
0
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我不太明白楼主为什么说要用到VirtualProtectEx这个函数
这是个修改指定内存为可读写的函数
我现在要做的是
mov     edx, dword ptr [esp+1C]
push edx
这两句改成我想要压入的数据比如push 00140000,但00140000处的数据为零,我需要的数据是一个IP地址
如192.168.1.200
2010-10-5 19:42
0
雪    币: 998
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
你不用virtualprotect写不了啊。你要先用此函数把该段代码所在内存页的只读属性去掉。。。
2010-10-6 03:30
0
雪    币: 38
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
if (ul_reason_for_call == DLL_PROCESS_ATTACH) {
                MessageBox(NULL,L"XX",L"XXX",MB_OK);
                __asm{
                                mov eax,ChangeMemory
                                add eax,3
                                sub eax,0x4133d9
                                mov ebx,0x4133d3
                                mov word ptr [ebx], 0xe990
                                mov        dword ptr [ebx+2],eax
                                mov byte ptr[ebx+6],0x90
                }
                return TRUE;
        }
VOID ChangeMemory()
{

        __asm{
                        push ebx
                        push lpiwant
                        mov edi,esi
                        add edi,0xd4
                        mov esi,lpiwant
                        movsb
                        movsb
                        movsb
                        mov eax,0x00404b03
                        call eax
                        mov eax,0x004133da
                        pop esi
                        pop edi
                        jmp eax
        }

}

额 代码很笨拙多处硬编码...意思大概就是这个了,修改mov     edx, dword ptr [esp+1C]附近代码,跳入你自己的DLL代码中然后修改这[esp+1C]里面的值,再跳回去注意堆栈平衡,貌似叫inlinehook ?不知道 楼主加油吧.
2010-10-6 13:53
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
CreateProcess后挂起, 然后 WriteProcessMemory  ,再恢复
2010-10-10 16:55
0
雪    币: 38
活跃值: (48)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
[QUOTE=gubukelx;867395]已知某程序A,它所用到的参数其种一个如下
mov     edx, dword ptr [esp+1C]   由于这个[esp+1C]的值不符合我们的实际需要
现在我想将上面的
mov     edx, dword ptr [esp+1C]
修改成push 00140000
用OD是可以直...[/QUOTE]

你贴的不全 ----我无法写

动态修改 那就是 内存PATCH,即补丁

主要用 调试API设断点,捕获异常,修改欲改处,执行,写回被修改地方原来的代码

主要函数:CreateProcess,指定DEBUG_PROCESS or DEBUG_ONLY_THIS_PROCESS
WaitForDebugEvent
GetThreadContext
SetThreadContext
ReadProcessMemory
WriteProcessMemory
2010-10-10 17:10
0
雪    币: 27
活跃值: (671)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
9
没钱了 ,来骗点钱花花,(1)我感觉你要考虑是否有能够容纳代码的空间,(2)可能由于代码段一般都是只读的所以要改变一下节属性用 楼上所说的VirtualProtectEx,然后在指定位置写入你要的代码。  不知帮到你没有,要是感觉可以就给些kx花花 。
2010-10-11 12:43
0
游客
登录 | 注册 方可回帖
返回
//