2

问题:我正在为学校(我的选择)开发一个项目,它是一个程序加载器/DLL 注入器,我最初在这里找到了这个想法,根据我的需要进行了修改,并将 DLL 的 ASM 部分转换为扩展的 ASM这将使用 GCC 而不是 Visual Studio 进行编译。我没有在控制台窗口中打印弹球得分,而是加载了我编写的程序,该程序从用户那里获取输入并将其写入文件。加载程序注入一个 DLL,其中包含一个函数,该函数将用户输入(以前用于文件)重定向到消息框,并将我自己的字符串写入文件。

它可以在我的机器上运行,但是,我担心平台切换,因为我的教授必须在她的机器上编译工作,所以地址 0x004014A6 可能是当前包含将该 CALL <some address>字符串写入文件的指令(实际代码是ofile << user_input;:) 在另一台机器上编译时不会包含任何接近的内容,但仍会调用将字符串写入文件的函数。

我想要做的是动态确定该地址将是什么,而不是对地址进行硬编码。我想我可以通过在被调用以获取地址的函数上使用 GetProcAddress 来做到这一点,然后创建一个数组来保存表示的字节CALL <that function>,并在内存中我希望找到该调用的某个地方逐字节搜索,取地址,然后从那里工作。

不过,我不知道该怎么做。

主要问题:如何扫描一系列内存地址并将其内容与数组元素进行比较?

换句话说,我想在我的 DLL 中包含一个函数,该函数读取内存中任意地址的字节并将其与预期的序列进行比较。我怎样才能在某个进程中任意读取内存地址的内容?

怀疑:我需要知道执行原始程序的起始地址和结束地址。如何获得起始地址和结束地址之间的范围?(这似乎是真正的障碍。我可能只知道如何获取进程的开始和结束地址。)

4

2 回答 2

0

如果您使用的是 Python,也许 ptrace 会有所帮助。它是跨平台的,可以从 pip 安装。这是我在这里抓取的 unix 代码片段:http: //sixserv.org/2010/07/26/memory-debugging-or-a-universal-game-trainer-with-python-and-ptrace/

def search_memory_locations(pid, max_memory, search_value):
    child_pid = os.fork()
    if child_pid == 0: # search within forked process:
        locations = list()
        prev_locations = read_locations()

        dbg = PtraceDebugger()
        process = dbg.addProcess(pid, False)
        memory_mappings = readProcessMappings(process)

        print "\x1B[?25l", # deactivate cursor (^_^)
        for memory_mapping in memory_mappings:
            # only search in read/writable memory areas within range...
            if "rw" in memory_mapping.permissions and memory_mapping.end <= max_memory:
                for loc in range(memory_mapping.start, memory_mapping.end):
                    value = process.readBytes(loc, 1)
                    if value[0] == search_value:
                        print "search memory area[0x%08X-0x%08X] address[0x%08X] value[0x%02X (%03d)]   \r" % (memory_mapping.start, memory_mapping.end, loc, ord(value), ord(value)),

                        if prev_locations and len(prev_locations) > 0 and not loc in prev_locations:
                            continue # skip prev not found locations

                        locations.append(loc)
        print "\x1B[?25h", # activate cursor
        dbg.quit()
        write_locations(locations)
        sys.exit()

    return child_pid # don't really need this

如果您使用的是 C/C++,这是我之前从 ITH ( http://code.google.com/p/interactive-text-hooker/ ) 使用的特定于 Windows 的函数:

DWORD SearchPattern(DWORD base, DWORD base_length, LPVOID search, DWORD search_length) //KMP
{
    __asm
    {
        mov eax,search_length
alloc:
        push 0
        sub eax,1
        jnz alloc

        mov edi,search
        mov edx,search_length 
        mov ecx,1
        xor esi,esi
build_table:
        mov al,byte ptr [edi+esi]
        cmp al,byte ptr [edi+ecx]
        sete al
        test esi,esi
        jz pre
        test al,al
        jnz pre
        mov esi,[esp+esi*4-4]
        jmp build_table
pre:
        test al,al
        jz write_table
        inc esi
write_table:
        mov [esp+ecx*4],esi

        inc ecx
        cmp ecx,edx
        jb build_table

        mov esi,base
        xor edx,edx
        mov ecx,edx
matcher:
        mov al,byte ptr [edi+ecx]
        cmp al,byte ptr [esi+edx]
        sete al
        test ecx,ecx
        jz match
        test al,al
        jnz match
        mov ecx, [esp+ecx*4-4]
        jmp matcher
match:
        test al,al
        jz pre2
        inc ecx
        cmp ecx,search_length
        je finish
pre2:
        inc edx
        cmp edx,base_length //search_length
        jb matcher
        mov edx,search_length
        dec edx
finish:
        mov ecx,search_length
        sub edx,ecx
        lea eax,[edx+1]
        lea ecx,[ecx*4]
        add esp,ecx
    }
}
于 2013-08-20T19:18:50.090 回答
0

除非程序的版本是你的目标很快就会改变,否则你可以使用 VA(virtual address) = RVA(relative virtual address) + module Base load address(可以用GetModuleHandle) 得到一个不会失败的地址在不同的系统下。如果版本确实发生了变化,那么您正在查看签名扫描仪。然而,它们并非万无一失,因为您扫描的模式可能会从一个构建到下一个构建发生根本性的变化。所需的任何范围数据都可以从目标应用程序的 PE 中获取,然后可用于临时将读取权限应用于该.code部分,从而使您可以有效地循环遍历它(效率不高的是使用ReadProcessMemory)。这是一个小的 sigscanner 库,更下方也是一个简单 sig 扫描器的源链接:http://www.blizzhackers.cc/viewtopic.php?f=182&t=478228&sid=55fc9a949aa0beb2ca2fb09e933210de

于 2011-04-30T05:21:14.350 回答