找到存储注册码的存储到内存或者寄存器的代码,通过通过修改内存中程序的代码,如弹出messagebox之类
#include<Windows.h>
#include<iostream>
/*
找到存储注册码的存储到内存或者寄存器的代码
通过通过修改内存中程序的代码,如弹出messagebox之类
获取注册码
release编译关闭安全检查
*/
//获取需要调用的函数或数据新地址,源程序的加载基址与需要调用的函数或数据相对虚拟地址
int GetNewAddress(HMODULE hsrc, int sRva)
{
return (int)hsrc + sRva;
}
void shellcode2()
{
__asm
{
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
}
__asm
{
//分配栈空间
mov eax, [ebp - 0xc]
sub esp, 0x80
sub ebp, 0x40
}
int msgadr;
__asm
{
mov msgadr,eax
}
HMODULE hKernel = NULL;
// 1. 获取kernel32.dll的加载基址
DWORD imageBase = 0;
_asm
{
mov eax, fs: [0x30];
mov ebx, [eax + 8];//进程基址
mov imageBase, ebx;
mov eax, [eax + 0xc];//Ldr
mov eax, [eax + 0x1C];// Ldr.LoadXXX链表
mov eax, [eax]; // 第二个节点
mov eax, [eax]; // 第三个节点:kernel32
mov eax, [eax + 0x8];// 加载基址
mov hKernel, eax;
}
typedef void* (WINAPI* FnGetProcAddress)(HMODULE, LPCSTR);
FnGetProcAddress pFnGetProcAddress;
// 2. 遍历导出表, 获取GetProcAddress的地址
IMAGE_OPTIONAL_HEADER* pOptionHeader = &((IMAGE_