2

問題: 私は、プログラム ローダー/DLL インジェクターである学校 (私の選択) のプロジェクトに取り組んでいます。最初にここで見つけたアイデアを、自分のニーズに合わせて変更し、DLL の ASM 部分を拡張 ASM に変換しました。 Visual Studio の代わりに GCC でコンパイルされます。コンソール ウィンドウでピンボール スコアの出力を行うのではなく、ユーザーからの入力を受け取り、それをファイルに書き込む、私が作成したプログラムを読み込んでいます。ローダーは、以前はファイル宛てだったユーザー入力をメッセージボックスにリダイレクトする関数を含む DLL を挿入し、独自の文字列をファイルに書き込みます。

それは私のマシンで動作しますが、私の教授は自分のマシンで作業をコンパイルする必要があるため、プラットフォームの切り替えについて懸念があります。そのため、現在、 CALL <some address>その文字列をファイルに書き込む命令を含むアドレス 0x004014A6 が含まれている可能性があります (実際のコードは次のとおりです: ofile << user_input;) 別のマシンでコンパイルしたときにそれに近いものは含まれませんが、文字列をファイルに書き込むその関数への呼び出しはまだあります。

私がやりたいことは、アドレスをハードコーディングするのではなく、そのアドレスがどうなるかを動的に決定することです。アドレスを取得するために呼び出される関数で GetProcAddress を使用してこれを行うことができると思いますCALL <that function>。アドレスを取得し、そこから作業します。

ただし、それを行う方法が正確にはわかりません。

主な質問: メモリ アドレスの範囲をスキャンし、その内容を配列の要素と比較するにはどうすればよいですか?

別の言い方をすれば、メモリ内の任意のアドレスでバイトを読み取り、それを予想されるシーケンスと比較する関数を DLL に含めたいと考えています。特定のプロセス内でメモリアドレスの内容を任意に読み取るにはどうすればよいですか?

疑惑: 元のプログラムが実行される開始アドレスと終了アドレスを知る必要があります。開始アドレスと終了アドレスの間の範囲を取得するにはどうすればよいですか? (これはここでの本当のハードルのようです。プロセスの開始アドレスと終了アドレスを取得する方法だけを知っていれば、おそらく残りを取得できます。)

4

2 に答える 2

0

プログラムのバージョンがターゲットをすぐに変更する予定でない限り、VA(仮想アドレス)= RVA(相対仮想アドレス)+モジュールベースロードアドレス(で取得可能GetModuleHandle)を使用して、失敗しないアドレスを取得できます異なるシステムの下で。バージョンが変更された場合は、署名スキャナーを確認してください。ただし、スキャン対象のパターンはビルドごとに根本​​的に変わる可能性があるため、これらは絶対確実ではありません。必要な範囲データは、ターゲットアプリのPEから取得できます。これを使用して、読み取り特権を.codeセクションに一時的に適用し、効率的にループすることができます(使用するのはそれほど効率的ではありませんでしたReadProcessMemory)。これが小さなsigscannerlibで、さらに下には単純なsigスキャナーのソースへのリンクもあります。http://www.blizzhackers.cc/viewtopic.php?f=182&t=478228&sid=55fc9a949aa0beb2ca2fb09e933210de

于 2011-04-30T05:21:14.350 に答える
0

Python を使用している場合は、ptrace が役立つ可能性があります。クロスプラットフォームで、pip からインストールできます。ここで取得したUNIXのコード スニップを次に示します。

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 に答える