3

true を返すように関数にパッチを適用しようとしてcat()いますが、関数を呼び出さないと何らかの理由でプログラムがクラッシュします。問題はパッチの適用方法ですか? 私は正しいアドレスに書いていると思います(関数のアドレスは004012e4です)。Windows XP 32 ビット システムでコード ブロック (gcc) を使用しています。

#include <iostream>
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;

int cat()
{
    cout<<"false"<<endl;
    return false;
}

int main()
{
    DWORD beef;
    int (*css)();
    css=cat;
    cout<<css<<endl;
    system("PAUSE");
    VirtualProtect(&css,49,PAGE_EXECUTE_READWRITE,&beef);
    asm("mov $0x40130f,%eax");//move address of the mov $0x0,eax instruction to eax
    asm("movl $0x1,(%eax)");//write at address changing B800 to B801 or return true

    return 0;
}
4

2 に答える 2

2

なぜ関数アドレスをハードコーディングするのですか? あなたはコードでそれを持っています、あなたはそれを印刷しています。それを印刷してから、印刷したものを含むようにコードを変更すると、関数を移動する危険があります。アセンブリ ステートメントを動的に生成しないのはなぜですか。

于 2012-12-06T15:22:46.807 に答える
0

これについては 100% ではありませんが、コード セグメントがデータ セレクターにマップされていないことは確かです。x86 CPU のデフォルトのデータ セレクタ セグメントが呼び出されdsますが、コードはセレクタ レジスタにありcsます。安全上の理由から (おそらく仮想メモリ空​​間の理由からも)、コードは通常、同じ空間にマップされていないと思います。

GCC asm には詳しくありませんが、次のような方法でうまくいくかもしれません。

asm("mov $0x40130f,%eax");
asm("push %%fs");
asm("mov %%cs,%%fs");   // Not sure you can address memory using cs:eax directly...
asm("movl $0x1,%%fs:(%eax)");
asm("pop %%fs");

私がアセンブラを書いてから長い時間が経ちましたが、おそらく私が何をしようとしているのかわかるでしょう。

于 2012-12-06T16:37:39.747 に答える