首先用C/C++语言实现弹出cmd
#include "stdio.h"
#include "windows.h"int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);WinExec("cmd.exe",SW_SHOW);return 0;}
用到winExec函数
将winExec执行的操作转成汇编,然后在弹出cmd窗口
#include "stdio.h"
#include "windows.h"{printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";//WinExec("cmd.exe",SW_SHOW);__asm{sub esp,0x454xor ebx,ebxpush ebxmov eax,strpush 5 ;5=SW_SHOWpush eaxcall dword ptr [WinExec]mov esp,0x450}return 0;}
找到汇编语言的机器码
复制到一个文本编辑器中,依次找出来
修改程序:
#include "stdio.h"
#include "windows.h"char shellcode[]="\x81\xEC\x54\x04\x00\x00\x33\xDB\x53\x8B\x45\xF4\x6A\x05\x50\xFF\x15\x14\xA2\x42\x00\xBC\x50\x04\x00\x00";
int main(int argc, char* argv[])
{printf("begin\n");HINSTANCE libHandle;char *dll="kernel32.dll";libHandle=LoadLibrary(dll);char *str="cmd.exe";__asm{lea eax,shellcodecall eax}return 0;
}
注意:
- 如何引用字符串
char *str="cmd.exe";
......
mov eax,str
- 如何引用字符数据
char shellcode[]="\x81\xEC\x54\x04\x00\x00\x33\xDB\x53\x8B\x45\xF4\x6A\x05\x50\xFF\x15\x14\xA2\x42\x00\xBC\x50\x04\x00\x00";
.....
lea eax,shellcode
- 用机器码的时候,不知道为什么有时候弹不出来,用汇编弹出之后再用机器码可以弹出,但是程序是没错的,不知道是不是VC++的原因