首页
社区
课程
招聘
写了个RecImport的插件有问题,哪位兄弟看看,到底问题出在哪了?
发表于: 2005-2-4 18:41 4295

写了个RecImport的插件有问题,哪位兄弟看看,到底问题出在哪了?

2005-2-4 18:41
4295
//This is plugin for the telock0.98b1
//for my comarade:),I try to recovery by hands ,but so many funcions need to be recovered ,so
//I decided to write a plugin

#include <windows.h>

#define DLLEXPORT extern "C" __declspec( dllexport )

// Exported function to use (prototypes)
////////////////////////////////////////////////////////////////////////////////////////////
DLLEXPORT DWORD Trace(DWORD hFileMap, DWORD dwSizeMap, DWORD dwTimeOut, DWORD dwToTrace,
                                          DWORD dwExactCall);

// Global variables
////////////////////////////////////////////////////////////////////////////////////////////
// None

// Initialize all you need
BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
                                         )
{
    return TRUE;
}

// Exported function to use
//
// Parameters:
// -----------
// <hFileMap>    : HANDLE of the mapped file
// <dwSizeMap>   : Size of that mapped file
// <dwTimeOut>   : TimeOut of ImpREC in Options
// <dwToTrace>   : Pointer to trace (in VA)
// <dwExactCall> : EIP of the exact call (in VA)
//
// Returned value:
// ---------------
// Use a value greater or equal to 200. It will be shown by ImpREC if no output were created

DLLEXPORT DWORD Trace(DWORD hFileMap, DWORD dwSizeMap, DWORD dwTimeOut, DWORD dwToTrace,
                                          DWORD dwExactCall)
{
        // Map the view of the file
        DWORD* dwPtrOutput = (DWORD*)MapViewOfFile((HANDLE)hFileMap, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
        if (!dwPtrOutput)
        {
                // Can't map view
                return (201);
        }
        // Check the size of the map file
        if (dwSizeMap < 4)
        {
                // Invalid map size
                UnmapViewOfFile((LPCVOID)dwPtrOutput);
                CloseHandle((HANDLE)hFileMap);
                return (203);
        }

        if (IsBadReadPtr((VOID*)dwToTrace, 4))
        {
                // Bad pointer!
                UnmapViewOfFile((LPCVOID)dwPtrOutput);
                CloseHandle((HANDLE)hFileMap);
                return (204);
        }

        DWORD tmp=*(DWORD *)dwToTrace;
        BYTE *to_trace=(BYTE *)tmp;
        /////////////////////////////////////////////////////////////////////////////
        //                        Api Wrapper Scheme One
        /////////////////////////////////////////////////////////////////////////////
        //  B8 xxxxxxxx               mov eax,xxxxxxxx
        //  40                        inc eax
        //  FF30                      push dword ptr [eax]
        //  C3                        retn
        /////////////////////////////////////////////////////////////////////////////
        while(!IsBadReadPtr((VOID*)to_trace, 4))
        {
                if(to_trace[0]==0xB8&&to_trace[5]==0x40&&to_trace[6]==0xFF&&to_trace[7]==0x30&&to_trace[8]==0xC3)
                {
                        DWORD address=*((DWORD *)(to_trace+1));
                        ++address;
                        if (!IsBadReadPtr((VOID*)address, 4))
                        {
                                // Get the value in XXXXXX and write it to the mapped file
                                *dwPtrOutput = *((DWORD *)address);

                                // OK
                                UnmapViewOfFile((LPCVOID)dwPtrOutput);
                                CloseHandle((HANDLE)hFileMap);
                                return (200);
                        }

                }
                to_trace++;
        }
        UnmapViewOfFile((LPCVOID)dwPtrOutput);
        CloseHandle((HANDLE)hFileMap);
        return (205);

}

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 107
活跃值: (54)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
头晕
120速度
汗颜
2005-2-4 19:46
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
3
dwPtrOutput = *((DWORD *)address);

这句在人家的内存空间里你读什么味啊
2005-2-4 19:54
0
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这个我还真不懂,学习,学习。这插件是干嘛的
2005-2-4 20:14
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
最初由 forgot 发布
dwPtrOutput = *((DWORD *)address);

这句在人家的内存空间里你读什么味啊


我也尝试过dwPtrOutput = address;可还是失败了
我现在想知道赋给dwPtrOutput的值到底是什么?
A.导入函数在内存中的实际地址,例如:7ffxxxxx
B.存放导入函数在内存中的实际地址空间偏移,例如:177003 7ffxxxxx
  将177003赋给dwPtrOutput
C.函数名字符串所在的地址偏移
D.其它
2005-2-5 00:17
0
雪    币: 6075
活跃值: (2236)
能力值: (RANK:1060 )
在线值:
发帖
回帖
粉丝
6
如果你把内存映像dump/映射了的话,可以转换一下

(DWORD)*(DWORD *)(MapBase+address)
我忘了怎么写c了,大概就这样吧
2005-2-5 11:59
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
dwToTrace 是什么?

  DWORD tmp=*(DWORD *)dwToTrace;
  BYTE *to_trace=(BYTE *)tmp;
这里怎么point 两次啊。
2005-2-6 12:35
0
游客
登录 | 注册 方可回帖
返回
//