首先用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,0x454
xor ebx,ebx
push ebx
mov eax,str
push 5 ;5=SW_SHOW
push eax
call 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,shellcode
call 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++的原因