議論/DLL/エントリポイント/06.callの実験バイナリ列


Top / 議論 / DLL / エントリポイント / 06.callの実験バイナリ列

このページは何か? (by ひげぽん)

 void hello()
 {
     printf("%s\n", __func__);
 }
  
 void goodbye()
 {
     printf("%s\n", __func__);
 }
  
 typedef unsigned char  byte;
 typedef unsigned short word;
 typedef unsigned int   dword;
  
  
 byte* make_code(void (**functions)(void), dword num, dword* size)
 {
     *size = 3 + 2 + 7 * num;
     byte* code = new byte[*size];
     code[0] = 0x55;
     code[1] = 0x89;
     code[2] = 0xE5;
     byte* start = &code[3];
     for (dword i = 0; i < num; i++)
     {
         start[i * 7] = 0xB8;
         *(dword*)(&start[i * 7 + 1]) = (dword)functions[i];
         start[i * 7 + 5] = 0xFF;
         start[i * 7 + 6] = 0xD0;
     }
     start[7 * num] = 0xC9;
     start[7 * num + 1] = 0xC3;
     return code;
 }
  
  
 int main(int argc, char *argv[])
 {
     void (*functions[2])(void);
     functions[0] = hello;
     functions[1] = goodbye;
  
     dword size;
     byte* code = make_code(functions, 2, &size);
     void (*f)(void) = (void (*)(void))code;
     (*f)();
  
     delete[] code;
     return 0;
 }
  

コメント

コメントはありません。 コメント/議論/DLL/エントリポイント/06.callの実験バイナリ列?

お名前:

MENU

now: 1

リンク


最新の20件
2018-05-03 2017-09-29 2017-04-25 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 1717, today: 1, yesterday: 1

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:48:02 (3769d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.025 sec.