1.ハイジャックの原理を紹介
(1)技術をハイジャックすることによって、私たちは一連の操作をオフ禁止オープンQQを禁止するようにブロックされた文書作成などインターセプト特定のプロセス、、、などを達成することができます
(2)ポップ傍受は、ハイジャック技術の最も一般的な形式を達成することです。
2.ツールを使用します
(1)vs2017 // C言語プログラムは、他のバージョンを使用することができますが、2010年には推奨されていないと、次の他のIDEは私が使用していません
(2)DllInject.exe //現在のすべてのプロセスを表示して、DLLを注入することができます
テクノロジーと原則の3.
(1)関数名と機能エンティティ
関数名の性質はアドレスですが、関数名とエンティティのアドレスのアドレスは、同じアドレスの関数ではありません。
例えば:
。1つの ボイドショー(){ 2 MessageBoxA(NULL、" 私のテキスト"、" Iタイトル"、0 ); 3 }
ショー()関数では、ショー()関数名は(NULL、住所、ショー()関数のコードMessageBoxAである「私のテキスト、」「私は見出しています、」0 ;)つまり、機能エンティティは、アドレスを持っています。それでは、どのようにそれを証明できますか?
):(以下のようにvs2017分解デバッグソースコードで使用
1つの#include <stdio.hの> 2の#include <STDLIB.H> 3。の#include <はWindows.h> 4。 ボイドショー(){ 5。 MessageBoxA(NULL、" 私のテキスト"、" Iタイトル"、0 ); 6 } 。7 INT メイン(){ 8。 のprintf(" %P \ N- \ N- " 、ショー) 。9 表示(); 10 リターン 0 ; 11 }
1>ブレークポイントを設定
2>ファイル名を指定して実行
3>得られたショー()関数のアドレス(各実験の結果と同じではありません)
4>を開きデバッグウィンドウの逆アセンブル
5>が表示されます()は、矢印の位置に002B128F入力アドレス(及び代わり0x002B128または002B128F両方のことができるようになり、最初のIを使用)、Enterキーを押します
6>今最初のアドレスでのショー()関数にジャンプされます
_公演:
002B128F JMPショー(02B3C90h)
002B128Fからこの文の記述、アドレスがこの機能エンティティ02B3C90hのアドレスである、02B3C90hにジャンプします
7>表示機能エンティティ - のアドレス入力されたショー(02B3C90h)、Enterキーを押します
8>結論:関数名と関数の実体は同じアドレスではありません
(2)ハイジャックの原則を
関数名と機能エンティティは、それがこれです、同じアドレスではありません。
我々は02B3C90hからエンティティが0000を変更し、関数のアドレスを置くのであれば、エンティティによって実行される機能は同じではありませんではないでしょうか?
原則:物理アドレス変更機能、すなわち関数名の変更(同じ家、家の中の人が変更されました)
(3)関数ポインタ
それは関数名のアドレスであるので、我々は、ポインタを経由して動作させることができます。
基本フォーマット:
無効た(* p)()=関数名。
P()。
1の#include <stdio.hの> 2の#include <STDLIB.H> 3の#include <はWindows.h> 4 ボイドショー(){ 5 MessageBoxA(NULL、" 我是文本"、" 我是标题"、0 ); 6 } 7 8 ボイド行く(){ 9 のprintf(" %sの"、" プロセスの作成に失敗しました" )。 10 } 11 INT メイン(){ 12 / * のprintf( "%のp \ n個の\ n"、ショー)。 * / 14 15 ボイド(* P)()= 表示を、 16 P(); // 関数ポインタアドレスが異なるコードを実行するために、異なる機能ブロックに格納することができる 17。 P = 行く; 18である P(); 19 リターン 0 ; 20 }
(4)原則のハイジャック実現--- exeファイル生成
1の#include <stdio.hの> 2の#include <STDLIB.H> 3の#include <はWindows.h> 4 ボイドショー(){ 5 MessageBoxA(NULL、" 我是文本"、" 我是标题"、0 ); 6 } 7 8 ボイド行く(){ 9 のprintf(" %sにする\ n "、" 作成プロセスは失敗" )。 10 } 11 INT メイン(){ 12 ボイド(* P)()= 行きます。 13 printf(" ショー=%のP \ TGO =%P \ T&P =%Pを\ n "、ショー、P&P)。 14 一方、(1 ) 15 { 16 P(); 17 スリープ(1000年); 18 } 19 リターン 0 。 20 }
(5)原則--- dllファイル生成のハイジャックの実現(DLLを生成する方法を言うことだけでは、特定のコード次のステップを参照してください)
1>プロジェクトを選択し、プロパティを右クリックし、
2>に行くには、矢印をフォロー
3>を生成]をクリックして行くために矢印に従ってください - > [ソリューションのビルド]をクリックします
(6)原則ハイジャックの実現を
1>生成されたEXEファイルを開きます。
2>のdllファイルを書き込みます
まず、我々はポインタpのアドレスを見つける必要があるので、pはポインタである、2つのポインタアドレスを取得する必要があります
第二にexeファイルのプログラムが現在、私は(表示するように変更したい)(GOを実行している)機能
1 _declspec(DLLEXPORT)ボイドゴー(){ 2 空隙(** P)()= 0x008ffce8 。 3 * P = 0x001212a3 。 4 }
ソリューションのリビルド
3>を開きDllInject.exeはあなただけでexeファイルを開く見つけます
あなたの生成されたDLLファイルを探す> - - 4>注射しをクリックして> [OK]をクリックします - >あなたが書く関数の名前を入力します。
5>エフェクト(CMDコンソールは印刷されませんし、ポップアップダイアログボックス)