したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

管理人の独り言(プログラミング関連)

1136774さん: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(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板