[
板情報
|
カテゴリランキング
]
したらばTOP
■掲示板に戻る■
全部
1-100
最新50
|
メール
|
1-
101-
201-
301-
401-
501-
601-
701-
801-
901-
1001-
1101-
1201-
1301-
1401-
1501-
1601-
1701-
1801-
1901-
2001-
2101-
2201-
2301-
2401-
2501-
2601-
2701-
2801-
2901-
3001-
3101-
3201-
3301-
3401-
3501-
3601-
3701-
3801-
3901-
4001-
4101-
4201-
4301-
4401-
4501-
4601-
4701-
4801-
4901-
5001-
5101-
5201-
5301-
5401-
この機能を使うにはJavaScriptを有効にしてください
|
管理人の独り言(プログラミング関連)
1136
:
774さん
:2008/12/21(日) 17:51:35 ID:CENbthlg0
Sleipnirにコードを注入して、そこからスレッドを走らせるコードを書いたら全然うまくいかなかったわけだが、今漸く理由が分かった。
まず、VC++でDebugでビルドすると、関数ポインタが指している場所が、本体にジャンプする命令であるからである。
だからその周辺をコピーしてもコピーしていない場所にジャンプすることになってしまうので、落ちると。
次にコードを実行してからVirtualFreeExするのが早すぎることだ。
これでは、コピーされていても、コードを実行する前にメモリが開放されて実行できない。
まあ、それだけのことだった。
#include <iostream>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <string>
#include <algorithm>
#include <functional>
#include <cstdio>
#include <cstdlib>
#include <climits>
#include <ctime>
#include <windows.h>
#if defined(UNICODE) || defined(_UNICODE)
#error UNICODE無理。
#endif
struct Stop{
~Stop(){
//#ifdef _DEBUG
std::cout << "Enterで終了します" << std::endl;
std::getline(std::cin, std::string());
//#endif
}
};
void __declspec(naked) WINAPI TestProc(void *p){
__asm{
mov eax, 0
ret 4
}
}
int main(int argc, char **argv){
Stop stop;
{
Stop stop;
}
//EnumWindows(Proc, 0);
std::cout << "-----------------------------" << std::endl;
std::cout << "argc = " << argc << std::endl;
for(int i = 0; i < argc; ++i){
std::cout << "第" << i << "引数:" << argv[i] << std::endl;
}
std::cout << "-----------------------------" << std::endl;
if(argc < 2){
#ifdef _DEBUG
argv[1] = new char[9];
sprintf(argv[1], "%x", (unsigned int)FindWindowA("SleipnirMainWindow", NULL));
//delete・・・
#else
std::cerr << "引数が足りません><" << std::endl;
return -1;
#endif
}
HWND hWnd = (HWND)std::strtoul(argv[1], NULL, 16);
DWORD PID;
GetWindowThreadProcessId(hWnd, &PID);
std::cout << "HWND of Sleipnir is " << hWnd << std::endl;
std::cout << "PID of Sleipnir is " << PID << std::endl;
HANDLE hProcess = OpenProcess(
PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_READ | PROCESS_VM_WRITE | PROCESS_QUERY_INFORMATION,
FALSE,
PID
);
if(hProcess){
LPVOID p = VirtualAllocEx(hProcess, NULL, 0x00010000, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
BYTE dummy[8];
WriteProcessMemory(hProcess, p, TestProc, 0x00000100, (SIZE_T *)dummy);
HANDLE hThread = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)p, NULL, 0, (LPDWORD)dummy);
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProcess, p, 0x00010000, MEM_DECOMMIT);
CloseHandle(hThread);
CloseHandle(hProcess);
}else{
std::cerr << "OpenProcess Error" << std::endl;
}
}
新着レスの表示
名前:
E-mail
(省略可)
:
※書き込む際の注意事項は
こちら
※画像アップローダーは
こちら
(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板