2

USBを介していくつかの外部デバイスと通信するためのObjective-Cライブラリを作成しています。特定のメソッドを呼び出すと、メソッド内または一部のCシステム関数(mallocまたはpthreadに関連)内のランダムな場所でクラッシュし、「解放されたオブジェクトのチェックサムが無効です」、「プールの自動解放ページ0x1102032が破損しています」、または、不明なセレクターエラー(セレクターは存在します)。

Guard Malloc機能を使用すると、EXEC_BAD_ACCESSエラーでこの行で停止します。

- (void)theMethod {

// some code

NSMutableData *payloads_pool = [NSMutableData dataWithLength:0x800];
NSUInteger payloads_pool_length = [payloads_pool length];

void *buffer = [payloads_pool mutableBytes];

memset(buffer, 0xCC, payloads_pool_length);

for (i = 0; i < 0x800; i += 0x40) {

    unsigned int *buf = [payloads_pool mutableBytes];

    (buf+i)[0] = 0x405;      <==== STOP ON THIS LINE
    (buf+i)[1] = 0x101;
    (buf+i)[2] = 0x8402B001;
    (buf+i)[3] = 0x8402EB01;
}

// some code
}
4

2 に答える 2

3

bufisであるため、バイトの代わりに符号なし整数を追加するunsigned int*際のポインター+ではなくbuf+i、メモリ内でシークしすぎていませんか?

于 2012-09-10T17:10:18.910 に答える
2

次に、のバイト数payloads_poolが少ないと思います。0x800

iクラッシュしたときの価値は何ですか?

for ループが 0 から にならないのはなぜpayloads_pool.lengthですか?

于 2012-09-10T17:04:25.900 に答える