首页
社区
课程
招聘
庆祝编程版块开张,发个简单的loader
发表于: 2005-6-6 21:48 10285

庆祝编程版块开张,发个简单的loader

2005-6-6 21:48
10285

这是前两天写的一个小工具,用来替换SoftICE的Loader的功能,因为它在我的系统上总是不好用,郁闷,类似PELord的Break Enter的功能,原理是在入口点插入int3断点,从而实现入口处在SoftICE中断下。当然前提是你要先在SoftIC
E中设置断点bpint 3. 有bug的话给我写信,目前不支持dll的导入,以后可能会考虑加上。

#include<stdio.h>
#include<windows.h>
#include<winuser.h>

#pragma comment(lib,"user32.lib")

DWORD EntryPoint(LPVOID ImageBase)     //获得文件入口点的虚拟地址
{
        PIMAGE_DOS_HEADER pDH=NULL;
        PIMAGE_NT_HEADERS pNtH=NULL;
        PIMAGE_OPTIONAL_HEADER pOH=NULL;
        if(!ImageBase)
                return NULL;
        pDH=(PIMAGE_DOS_HEADER)ImageBase;
        if(pDH->e_magic!=IMAGE_DOS_SIGNATURE)
                return NULL;
        pNtH=(PIMAGE_NT_HEADERS)((DWORD)pDH+pDH->e_lfanew);
        if(pNtH->Signature!=IMAGE_NT_SIGNATURE)
                return NULL;
        pOH=&pNtH->OptionalHeader;
        return pOH->AddressOfEntryPoint+pOH->ImageBase;
}

int main(int argc, char *argv[])
{
    BYTE  dbInt3=0xCC;       
        DWORD OldProtect;
        BYTE  Ori;
        DWORD ReadByte;
        DWORD Entry;
        HANDLE hfile, hMap, p_MapFile;
        char szBuffer[100]={0};
        if(argc<=1)
        {
                printf("Useage: SIloader <FileName> \nINT 3 Breakpoint Tool for SoftICE, Code by Marxixing@tom.com at 06/04/2005\n");
                return -1;
        }
        if((hfile = CreateFile(argv[1], GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,\
                                   OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL))==INVALID_HANDLE_VALUE)
        {
                printf("Can not open file, error code %d\n",GetLastError());
                ExitProcess(NULL);
        }
       
        if ((hMap = CreateFileMapping(hfile, NULL, PAGE_READWRITE, 0, 0, NULL))==NULL)
        {
                printf("Can not create file mapping!\n");
                CloseHandle(hfile);
        }
       
        if ((p_MapFile = MapViewOfFile(hMap, FILE_MAP_WRITE, 0, 0, 0))==NULL)
        {
                printf("Can not map file!\n");
                CloseHandle(hMap);
        }
       
        Entry=EntryPoint(p_MapFile);

        UnmapViewOfFile(p_MapFile);
        CloseHandle(hMap);
        CloseHandle(hfile);
       
        STARTUPINFO stStartUp;
        PROCESS_INFORMATION stProcInfo;
        GetStartupInfo(&stStartUp);
        if(!CreateProcess(argv[1],NULL,NULL,NULL,NULL,CREATE_SUSPENDED,\
                                NULL,NULL,&stStartUp,&stProcInfo))   //进程创建时处于挂起状态
        {
                printf("CreateProcess fail! error code %d\n",GetLastError());
                  ExitProcess(NULL);
        }
       
        if(ReadProcessMemory(stProcInfo.hProcess,(LPVOID)Entry,&Ori,1,&ReadByte)==NULL)  //读取入口点原来的内容
    {
                printf("ReadProcessMemory Function fail, error code %d\n",GetLastError());
                TerminateProcess(stProcInfo.hProcess,-1);
        }
        if(WriteProcessMemory(stProcInfo.hProcess,(LPVOID)Entry,&dbInt3,1,NULL)==NULL)   //写入int3断点
    {
                printf("WriteProcessMemory Function fail, error code %d\n",GetLastError());
                TerminateProcess(stProcInfo.hProcess,-1);
        }

        wsprintf(szBuffer,"%c**[SIloader]*********%c\n%c  Type \"EB EIP %X\"   %c\n%c*********************%c\n",201,187,186,Ori,186,200,188);
        OutputDebugString(szBuffer);    //向调试器发出修改当前指令的信息

        if(ResumeThread(stProcInfo.hThread)==-1)      //恢复进程的运行,会中断在SoftICE中
        {
                printf("ResumeThread Function fail, error code %d\n",GetLastError());
                TerminateProcess(stProcInfo.hProcess,-1);
        }
       
        CloseHandle(&stProcInfo.dwThreadId);
        CloseHandle(&stProcInfo.dwProcessId);

        return 1;
}

实际中发现了一些问题,修正一下。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (7)
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
2
好。支持!比手工改来改去方便
2005-6-6 22:06
0
雪    币: 97697
活跃值: (200829)
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
3
是不错
2005-6-6 22:08
0
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
4
不错。有源码学起来容易多了

收下了
2005-6-6 22:09
0
雪    币: 1223
活跃值: (469)
能力值: (RANK:460 )
在线值:
发帖
回帖
粉丝
5
不错
2005-6-7 09:10
0
雪    币: 389
活跃值: (912)
能力值: ( LV9,RANK:770 )
在线值:
发帖
回帖
粉丝
6
楼主,参考什么书籍的。
2005-6-7 21:12
0
雪    币: 224
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
不错!支持楼主这样的大牛多写好文章!
2005-12-26 21:25
0
雪    币: 227
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
弱弱的问下,使用这段代码读取子进程中的一个dll中某函数(偶测试用messagebox)的起始几个字节好象一直失败,后来把ReadProcessMemory的第一个参数改成GetCurrentProcess()后可以正确读到数据,但是还是写入失败,返回WriteProcessMemory Function fail, error code 487
弱弱的问下,这个可能是什么问题哦?
(ps:子进程是个测试程序,只有一个messagebox函数弹出个对话框,想把messagebox函数的前面两个字节改成0xeb,0x8e以实现中断在这个函数入口的目的)
2007-1-25 13:25
0
游客
登录 | 注册 方可回帖
返回
//