45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:DEBUG API写简单的Loader的方法

DEBUG API写简单的Loader的方法

2016-09-01 14:47:41 来源:www.45fan.com 【

DEBUG API写简单的Loader的方法

一直想做一个类似KeyMaker的Loader,能解壳,能读寄存器,读指定内存值,通宵了一晚上基本搞定

下面是代码:

 

DEBUG API写简单的Loader的方法//MemoryReader.cpp:定义控制台应用程序的入口点。
DEBUG API写简单的Loader的方法
//
DEBUG API写简单的Loader的方法

DEBUG API写简单的Loader的方法#include"stdafx.h"
DEBUG API写简单的Loader的方法#include"windows.h"
DEBUG API写简单的Loader的方法#include"Commdlg.h"
DEBUG API写简单的Loader的方法#include"winnt.h"
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法BYTEINT3
=0xCC;
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
//写入前的
DEBUG API写简单的Loader的方法BYTEOld;
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
//页面属性
DEBUG API写简单的Loader的方法DWORDOldProtect;
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
//是否已写入INT3
DEBUG API写简单的Loader的方法boolHasINT3=false;
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
boolIsFirstINT3=true;
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法DWORDBreakPoint
=0x10074B8;
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法BYTEOrg[
8]={0x80,0x3E};
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
//判断是否解压完成
DEBUG API写简单的Loader的方法boolIsUnpacked(PROCESS_INFORMATIONpi)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法SuspendThread(pi.hThread);
DEBUG API写简单的Loader的方法CONTEXTcontext;
DEBUG API写简单的Loader的方法ZeroMemory(
&context,sizeof(CONTEXT));
DEBUG API写简单的Loader的方法context.ContextFlags
=CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS;
DEBUG API写简单的Loader的方法GetThreadContext(pi.hThread,
&context);
DEBUG API写简单的Loader的方法printf(
"ExeInfo:Eax:%x,Esp:%x,Eip:%x ",context.Eax,context.Esp,context.Eip);
DEBUG API写简单的Loader的方法ResumeThread(pi.hThread);
DEBUG API写简单的Loader的方法BYTEmem[
8];
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,
1,PAGE_READWRITE,&OldProtect);
DEBUG API写简单的Loader的方法ReadProcessMemory(pi.hProcess,(LPCVOID)BreakPoint,
&mem,8,NULL);
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,
1,OldProtect,&OldProtect);
DEBUG API写简单的Loader的方法printf(
"hexnumis:%x,%x,%x,%x ",mem[0],mem[1],mem[2],mem[3]);
DEBUG API写简单的Loader的方法
if(mem[0]^0xff==Org[0]&&mem[1]^0xff==Org[1])
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
//不能乱调用
DEBUG API写简单的Loader的方法Old=mem[0];
DEBUG API写简单的Loader的方法
returnTRUE;
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法returnfalse;
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
//写INT3
DEBUG API写简单的Loader的方法boolWriteINT3(PROCESS_INFORMATIONpi)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
//VirtualAllocEx(pi.hProcess,(LPVOID)0x0101259b,sizeof(INT3),MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE);
DEBUG API写简单的Loader的方法SuspendThread(pi.hThread);
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,
1,PAGE_READWRITE,&OldProtect);
DEBUG API写简单的Loader的方法
boolret=WriteProcessMemory(pi.hProcess,(LPVOID)BreakPoint,&INT3,sizeof(INT3),NULL);
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,
1,OldProtect,&OldProtect);
DEBUG API写简单的Loader的方法HasINT3
=ret;
DEBUG API写简单的Loader的方法ResumeThread(pi.hThread);
DEBUG API写简单的Loader的方法
returnret;
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
//改回去
DEBUG API写简单的Loader的方法boolCleanINT3(PROCESS_INFORMATIONpi)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
//SuspendThread(pi.hThread);
DEBUG API写简单的Loader的方法boolret=WriteProcessMemory(pi.hProcess,(LPVOID)BreakPoint,&Old,sizeof(Old),NULL);
DEBUG API写简单的Loader的方法
if(ret==false)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法printf(
"改回去失败! ");
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法CONTEXTcontext;
DEBUG API写简单的Loader的方法ZeroMemory(
&context,sizeof(CONTEXT));
DEBUG API写简单的Loader的方法context.ContextFlags
=CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS;
DEBUG API写简单的Loader的方法GetThreadContext(pi.hThread,
&context);
DEBUG API写简单的Loader的方法context.Eip
--;
DEBUG API写简单的Loader的方法SetThreadContext(pi.hThread,
&context);
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法printf(
"已经改回去了,Eax:%x ",context.Eax);
DEBUG API写简单的Loader的方法
returnret;
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法
intmain(intargc,char*argv[])
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
charf_name[256];
DEBUG API写简单的Loader的方法f_name[
0]=NULL;
DEBUG API写简单的Loader的方法OPENFILENAMEfilename;
DEBUG API写简单的Loader的方法ZeroMemory(
&filename,sizeof(OPENFILENAME));
DEBUG API写简单的Loader的方法filename.lStructSize
=sizeof(OPENFILENAME);
DEBUG API写简单的Loader的方法filename.hwndOwner
=NULL;
DEBUG API写简单的Loader的方法filename.lpstrFilter
="*.exe";
DEBUG API写简单的Loader的方法filename.lpstrFile
=f_name;
DEBUG API写简单的Loader的方法filename.nMaxFile
=256;
DEBUG API写简单的Loader的方法filename.lpstrInitialDir
=NULL;
DEBUG API写简单的Loader的方法filename.Flags
=OFN_EXPLORER|OFN_HIDEREADONLY;
DEBUG API写简单的Loader的方法
if(!GetOpenFileName(&filename))
DEBUG API写简单的Loader的方法
return0;
DEBUG API写简单的Loader的方法STARTUPINFOsi;
DEBUG API写简单的Loader的方法PROCESS_INFORMATIONpi;
DEBUG API写简单的Loader的方法ZeroMemory(
&si,sizeof(STARTUPINFO));
DEBUG API写简单的Loader的方法ZeroMemory(
&pi,sizeof(PROCESS_INFORMATION));
DEBUG API写简单的Loader的方法
boolret=CreateProcess(filename.lpstrFile,"",NULL,NULL,FALSE,DEBUG_PROCESS,NULL,NULL,&si,&pi);
DEBUG API写简单的Loader的方法
if(ret==false)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法MessageBox(NULL,
"创建进程失败!","",0);
DEBUG API写简单的Loader的方法
return-1;
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法DEBUG_EVENTdevent;
DEBUG API写简单的Loader的方法
intDllCount=0;
DEBUG API写简单的Loader的方法
while(TRUE)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
if(WaitForDebugEvent(&devent,1))
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
switch(devent.dwDebugEventCode)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
caseCREATE_PROCESS_DEBUG_EVENT:
DEBUG API写简单的Loader的方法printf(
"CREATE_PROCESS_DEBUG_EVENT... ");
DEBUG API写简单的Loader的方法
break;
DEBUG API写简单的Loader的方法
caseCREATE_THREAD_DEBUG_EVENT:
DEBUG API写简单的Loader的方法printf(
"CREATE_THREAD_DEBUG_EVENT... ");
DEBUG API写简单的Loader的方法
break;
DEBUG API写简单的Loader的方法
caseEXCEPTION_DEBUG_EVENT:
DEBUG API写简单的Loader的方法
//printf("EXCEPTION_DEBUG_EVENT... ");
DEBUG API写简单的Loader的方法switch(devent.u.Exception.ExceptionRecord.ExceptionCode)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
caseEXCEPTION_BREAKPOINT:
DEBUG API写简单的Loader的方法
if(HasINT3)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法SuspendThread(pi.hThread);
DEBUG API写简单的Loader的方法CONTEXTcontext;
DEBUG API写简单的Loader的方法ZeroMemory(
&context,sizeof(CONTEXT));
DEBUG API写简单的Loader的方法context.ContextFlags
=CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS;
DEBUG API写简单的Loader的方法GetThreadContext(pi.hThread,
&context);
DEBUG API写简单的Loader的方法printf(
"Eax:%x ,Esi:%x ,Eip:%x ,Ebp:%x ",context.Eax,context.Esi,context.Eip,context.Ebp);
DEBUG API写简单的Loader的方法
if(context.Eip==BreakPoint+1)
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法
if(!CleanINT3(pi))
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
{
DEBUG API写简单的Loader的方法printf(
"清除断点失败!");
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法printf(
"ProgramStoppedAtWhatWeWant ");
DEBUG API写简单的Loader的方法
charkey[256];
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,
1,PAGE_READWRITE,&OldProtect);
DEBUG API写简单的Loader的方法ReadProcessMemory(pi.hProcess,(LPCVOID)context.Esi,key,
sizeof(key),NULL);
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,
1,OldProtect,&OldProtect);
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法printf(
"读出来的东西是%s ",key);
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法ResumeThread(pi.hThread);
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法break;
DEBUG API写简单的Loader的方法
caseEXCEPTION_SINGLE_STEP:
DEBUG API写简单的Loader的方法printf(
"2EXCEPTION_SINGLE_STEP ");
DEBUG API写简单的Loader的方法
break;
DEBUG API写简单的Loader的方法
caseEXCEPTION_ACCESS_VIOLATION:
DEBUG API写简单的Loader的方法printf(
"读写地址出错 ");
DEBUG API写简单的Loader的方法printf(
"%d,%x ",devent.u.Exception.ExceptionRecord.ExceptionInformation[0],devent.u.Exception.ExceptionRecord.ExceptionAddress);
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法DEBUG API写简单的Loader的方法
/*charNop[3];
DEBUG API写简单的Loader的方法Nop[0]=0x90;
DEBUG API写简单的Loader的方法Nop[1]=0x90;
DEBUG API写简单的Loader的方法Nop[2]=0x90;
DEBUG API写简单的Loader的方法PVOIDpathAddress;
DEBUG API写简单的Loader的方法pathAddress=devent.u.Exception.ExceptionRecord.ExceptionAddress;
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,pathAddress,3,PAGE_READWRITE,&OldProtect);
DEBUG API写简单的Loader的方法WriteProcessMemory(pi.hProcess,pathAddress,Nop,3,NULL);
DEBUG API写简单的Loader的方法VirtualProtectEx(pi.hProcess,(LPVOID)BreakPoint,1,OldProtect,&OldProtect);
DEBUG API写简单的Loader的方法
DEBUG API写简单的Loader的方法ContinueDebugEvent(pi.dwProcessId,pi.dwThreadId,DBG_EXCEPTION_NOT_HANDLED);
*/

DEBUG API写简单的Loader的方法break;
DEBUG API写简单的Loader的方法
default:
DEBUG API写简单的Loader的方法
break;
DEBUG API写简单的Loader的方法}

DEBUG API写简单的Loader的方法break;
DEBUG API写简单的Loader的方法
caseLOAD_DLL_DEBUG_EVENT:
DEBUG API写简单的Loader的方法
//获取DLLNAME太复杂,暂时做不到
DEBUG API写简单的Loader的方法DllCount++;
DEBUG API写简单的Loader的方法printf(
"%d,ProgramLoadsaDllFromBaseImage:%x,ImageName:%x ",DllCount,devent.u.LoadDll.lpBaseOfDll,devent.u.LoadDll.lpImageName);
DEBUG API写简单的Loader的方法 

本文地址:http://www.45fan.com/dnjc/70798.html
Tags: 简单 DEBUG API
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部