怎样动态修改程序代码
是这样的,想在运行的时候把arr数组中的数据插入到main()函数里面(arr数组里面为二进制代码),直接执行arr中的代码也可以,怎么弄?
char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'};
int main()
{
return 0;
}
[解决办法]
char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'};
int main()
{
typedef void(*funcptr)(void);
funcptr f=(funcptr)((void*)arr);
f();
return 0;
}
[解决办法]
机器码跟汇编有区别么, 这是作弊..
直接写 const char main[] = { ... }; 就可以了...
记得加上 const , 不然很多系统下 .data 是不可运行的, .const 一般都跟 .text 合并在一起的...
这个不是缓冲区溢出, Linux 下木有问题的说...
[解决办法]
linux 下可以将
#ifdef DEBUG
char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'}; int main() { return 0; }
#endif
在执行时加上./a.out -D -DEBUG 此处a.out为编译连接好了的可执行文件的名字
[解决办法]
#include<stdio.h>
extern "C" int __cdecl mainCRTStartup(void);
char arr[]={'\x55','\x8B','\xEC','\x83','\xEC','\x54','\x53','\x56','\x57','\x8D','\x7D','\xAC','\xB9','\x15','\x00','\x00','\x00','\xB8','\xCC','\xCC','\xCC','\xCC','\xF3','\xAB','\xC7','\x45','\xFC','\x01','\x00','\x00','\x00','\x68','\x84','\x2E','\x42','\x00','\xE8','\xE7','\x24','\x00','\x00','\x83','\xC4','\x04','\x8D','\x45','\xF4','\x50','\x68','\x80','\x2E','\x42','\x00','\xE8','\x56','\x25','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xFC','\x89','\x4D','\xF0','\x8B','\x55','\xF0','\x52','\x68','\x1C','\x20','\x42','\x00','\x8B','\x45','\xFC','\x83','\xC0','\x01','\x89','\x45','\xFC','\xE8','\xB6','\x24','\x00','\x00','\x83','\xC4','\x08','\x8B','\x4D','\xF4','\x2B','\x4D','\xFC','\xF7','\xD9','\x1B','\xC9','\x41','\x89','\x4D','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCC','\x8B','\x55','\xFC','\x89','\x55','\xEC','\x8B','\x45','\xEC','\x50','\x68','\x1C','\x20','\x42','\x00','\x8B','\x4D','\xFC','\x83','\xE9','\x01','\x89','\x4D','\xFC','\xE8','\x82','\x24','\x00','\x00','\x83','\xC4','\x08','\x33','\xD2','\x83','\x7D','\xFC','\x00','\x0F','\x94','\xC2','\x89','\x55','\xF8','\x8B','\x4D','\xF8','\x67','\xE3','\xCE'};
void function()
{
#pragma comment(linker, "/entry:function")
#pragma comment(linker, "/SECTION:.text,ERW")
#pragma comment(lib, "msvcrt.lib")
int mainCRTStartup();
void main();
__asm
{
MOV EAX, OFFSET main
MOV BYTE PTR[EAX], 0xB8 //MOV EAX, 0x
MOV DWORD PTR[EAX+1],offset arr //将arr的地址放在mov eax,0x的后面,形成代码mov eax,offset arr
MOV WORD PTR[EAX+5], 0xE0FF // JMP EAX:FFE0
}
mainCRTStartup();
__asm
{
ret
}
}
int main()
{
_asm
{
nop
nop
nop
nop
nop
nop
nop
}
return 0;
}
这样就可以不在main中写代码,直接在某一个函数中直接修改main的代码。
main函数处反汇编的结果是
0040101E 90 NOP
0040101F 90 NOP
00401020 /$ B8 10304000 MOV EAX,a.00403010
00401025
[解决办法]
. FFE0 JMP EAX
00401027
[解决办法]
. 33C0 XOR EAX,EAX
00401029 \. C3 RETN
0040102A 90 NOP
00403010处的的结果是
00403010 55 PUSH EBP
00403011 8BEC MOV EBP,ESP
00403013 83EC 54 SUB ESP,54
00403016 53 PUSH EBX
00403017 56 PUSH ESI
00403018 57 PUSH EDI
00403019 8D7D AC LEA EDI,DWORD PTR SS:[EBP-54]
0040301C B9 15000000 MOV ECX,15
00403021 B8 CCCCCCCC MOV EAX,CCCCCCCC
00403026 F3:AB REP STOS DWORD PTR ES:[EDI]
00403028 C745 FC 0100000>MOV DWORD PTR SS:[EBP-4],1
0040302F 68 842E4200 PUSH 422E84
00403034 E8 E7240000 CALL 00405520
00403039 83C4 04 ADD ESP,4
0040303C 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0040303F 50 PUSH EAX
00403040 68 802E4200 PUSH 422E80
00403045 E8 56250000 CALL 004055A0
0040304A 83C4 08 ADD ESP,8
0040304D 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
就是你填充的代码