怎样动态修改程序代码
是这样的,想在运行的时候把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;
}
#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;
}
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]
就是你填充的代码