我不知道要怎么描术这个问题,也许是描术不准确导致很多高手的回答让我一知半解,但为了工作,我又不得不厚着脸皮再问这个问题,且这个问题需要配合几张图来说明,图是从OD里面抓的
但发现在这里不可以放图进来,只能用文字来说明
第一,调试A程序到0040E1D2处
0040E1D2 |. 8B5424 1C mov edx, dword ptr [esp+1C]
0040E1D6 |. 52 push edx ; /pAddr
0040E1D7 |. 66:894424 0A mov word ptr [esp+A], ax ; |
0040E1DC |. FF15 B8E54300 call dword ptr [<&WS2_32.#11>] ; \inet_addr
我们看到mov edx,dword ptr[esp+1C]所指向的是堆栈段如下图
Stack ss:[0012EBC4]=0012F018, (ASCII "192.168.1.180")
edx=00000038
我们点一下转入下面一个窗口跟踪
0012F018 31 39 32 2E 31 36 38 2E 31 2E 31 38 30 00 30 00 192.168.1.180.0.
0012F028 0D 00 00 00 0F 00 00 00 D6 F6 BA 26 AC F1 12 00 .......嘱?.
0012F038 33 CF 43 00 01 00 00 00 CE D7 41 00 01 00 00 00 3螩....巫A....
在这里,大家都知道,我们可以通过直接修改下面的192.168.1.180
改成192.168.1.1
是的,在OD里面是可以这样改的,但我的问题还没有提出,我要做的是,我想用win32汇编来写一个程序,主要功能如下,一,我们打开这个进程用CreateProcess
然后我再用VirtualAllocEx在在目标进程中申请一段内存,假如申请到的是00140000这个段,同时我们在自己的程序一开始定义了一个常量,如szIP db '192.168.1.1',0,当申请到内存后,我们将上面的常赋给目标进程,同时修改上面
0040E1D2 |. 8B5424 1C mov edx, dword ptr [esp+1C]
0040E1D6 |. 52 push edx ; /pAddr
这两句为
push 00140000
这样一来
函数inet_addr所需的一个参数就满足了我们的要求
写内存用WriteProcessMemory函数,可是不成功,
再此,我想请教告位高手,要完成上面的工作,我需要怎做,不一定用我的办法
为方便高手指出不足,我特意将自己的代码贴在下面
.586
.model flat,stdcall
option casemap:none
;====Include文件=================
include include\windows.inc
include include\kernel32.inc
include include\user32.inc
include include\gdi32.inc
;====Lib文件=====================
includelib lib\kernel32.lib
includelib lib\user32.lib
includelib lib\gdi32.lib
;===========EQU数据======================================
M_BaseAddress equ 0040E1D2h ;要读写的地址(mov edx,dword ptr [esp+1C])
;===========已初始化的数据===============================
.data
;===========未初始化的数据===============================
.data?
stStartUp STARTUPINFO <> ;启动结构体
stProcInfo PROCESS_INFORMATION <> ;接收进程启动后的信息
szBuffer db 5 dup (?) ;目的地址
dwTemp dd ? ;接收临里数据
lphMemory dd ? ;内存句柄
;===========常量定义=====================================
.const
szExecFileName db 'xyza.exe',0
szErrExec db 'Sory The File Name is Bad',0
szAppname db 'Memory',0
szMemoryError db 'Alloc Memory Failed',0
dbPatched db 68h,00h,00h,14h,00h ;要写入目标的内容(push 00140000)
szIP db '192.168.1.200',0 ;定义IP地址
;===========代码段=======================================
.code
start:
invoke GetStartupInfo,addr stStartUp
invoke CreateProcess,offset szExecFileName,NULL,NULL,NULL,NULL,\
NORMAL_PRIORITY_CLASS or CREATE_SUSPENDED,NULL,NULL,offset stStartUp,offset stProcInfo
;参数说明
;lpApplicationName 要创建的应用程序名
;lpCommandLine 通过命令行获取
;pProcessAttributes 指向一个SECURITY_ATTRIBUTES结构体
;lpThreadAttributes 同上
;bInheritHandles 指示新进程是否从调用进程处继承了句柄
;dwCreationFlags 创建标志
;lpEnvironment 是否需要指向新的环境
;lpCurrentDirectory 指向一个路径
;lpStartupInfo 启动结构体
;lpProcessInformation 接收进程序信息
.if eax ;判断eax==1(是否创建成功)
invoke VirtualAllocEx,stProcInfo.hProcess,NULL,1024,MEM_COMMIT,PAGE_EXECUTE_READWRITE
;参数说明
;hProcess 要申请内存的目标句柄
;lpAddress 保留页面的内存地址;一般用NULL自动分配
;dwSize 欲分配的内存大小以字节单位;注意实际分配的内存大小是页内存大小的整数倍
;flAllocationType 分配的内存类型
;flProtect 分配到的内存的功能
;--------------------------------------------
.if eax ;判断eax==1(是否分配到内存)
mov lphMemory,eax ;保存内存句柄
lea eax,szIP
mov lphMemory,eax
;invoke MessageBox,NULL,lphMemory,offset szAppname,MB_OK
.else
invoke MessageBox,NULL,addr szMemoryError,addr szAppname,MB_OK
.endif
invoke WriteProcessMemory,stProcInfo.hProcess,M_BaseAddress,offset dbPatched,5,offset dwTemp
;参数说明
;hProcess 目标进程的句柄
;lpBaseAddress 要写入目标进程的起始地址Target
;lpBuffer 存放要写入数据的地址
;nSize 要读取数据的大小
;lpNumberOfBytesRead 实际读取的大小
;--------------------------------------------
invoke ResumeThread,stProcInfo.hThread
.else
invoke CloseHandle,stProcInfo.hProcess
invoke CloseHandle,stProcInfo.hThread
invoke MessageBox,NULL,addr szErrExec,addr szAppname,MB_OK
.endif
invoke ExitProcess,NULL
end start
在网上看有人告诉我用VirtualProtect可我不知道为什么,在次,真诚的希望能得到帮助和支持,谢谢,再谢谢
若有会的,可以和我电话联系。
[课程]FART 脱壳王!加量不加价!FART作者讲授!