home ホーム search 検索 -  login ログイン  | reload edit datainfo version cmd icon diff delete  | help ヘルプ

日記/2010/07/15/文字列をスタック上にPUSHするコードの自動生成, NASM用

日記/2010/07/15/文字列をスタック上にPUSHするコードの自動生成, NASM用

日記 / 2010 / 07 / 15 / 文字列をスタック上にPUSHするコードの自動生成, NASM用
id: 712 所有者: msakamoto-sf    作成日: 2010-07-15 20:12:58
カテゴリ: Assembler C言語 hacks 

初期化・未初期化データセクションに配置せず、実行コードのセクションに持たせる、つまり実行コード内でstack領域に展開するコードを自動生成する。

pushstack.c:

#include <stdio.h>
#include <string.h>
 
int main(int argc, char *argv[])
{
    int len, d;
    int i, j, k;
    char *src;
    char cbuf[4];
    char *offset_label = "OFFSET";
    
    if (2 > argc) {
        fprintf(stderr, "usage: %s push_string <offset_label>\n", argv[0]);
        return 1;
    }
    
    src = argv[1];
    len = strlen(src);
    if (3 == argc) {
        offset_label = argv[2];
    }
    printf("; '%s', 0 (%d = 0x%X bytes)\n", src, len + 1, len + 1);
    printf("%%define %s ebp - 0000h\n", offset_label);
    d = len / 4;
    if (len % 4) {
        d++;
    }
    
    for (i = 0, j = 0, k = 0; i < d; i++) {
        cbuf[0] = src[j++];
        cbuf[1] = (j > len) ? 0 : src[j++];
        cbuf[2] = (j > len) ? 0 : src[j++];
        cbuf[3] = (j > len) ? 0 : src[j++];
        printf("mov eax, 0%02X%02X%02X%02Xh\n", 
            cbuf[3], cbuf[2], cbuf[1], cbuf[0]);
        printf("mov dword[%s + 0%Xh], eax\n", offset_label, k);
        k += 4;
    }
    return 0;
}

使い方:

> pushstack abcdef STR1
; 'abcdef', 0 (7 = 0x7 bytes)
%define STR1 ebp - 0000h
mov eax, 064636261h
mov dword[STR1 + 00h], eax
mov eax, 000006665h
mov dword[STR1 + 04h], eax

出力をぺたりとnasmソースにはりつけ、STR1のマクロでEBPのoffsetを適当に調整してあげればOK。
UnicodeやMBCSには未対応。
"xor eax, eax"も入れてきちんとゼロクリアした方が良いかな?
後はお好みに応じて適当に改造して下さい。


プレーンテキスト形式でダウンロード
現在のバージョン : 1
更新者: msakamoto-sf
更新日: 2010-07-15 20:22:01
md5:ec4ae25b3bc8e14d11b422125b0605fd
sha1:a9a8cdcf5c4246fe2ed66720df4d639c609a421d
コメント
コメントを投稿するにはログインして下さい。