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

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

1みみず★:2008/08/10(日) 23:28:15
あまりにもプログラミングの内容が増えすぎた。
よって隔離スレの中を更に隔離。

1036774さん:2008/12/09(火) 18:58:44 ID:CENbthlg0
mixiや楽天の「中の人」、インフラエンジニアを語る − @IT
http://www.atmarkit.co.jp/news/200812/08/infla.html

1037774さん:2008/12/09(火) 19:07:06 ID:CENbthlg0
>>1034
なんかGoogleたん、俺がやったら面白いなあと思っていることをやっている気がしなくは無いが、
良くx86のエミュレータを作るなあと。
独自のコンパイラを作っているのかねえ?

FirefoxのExtensionの作り方メモ良いねえ。
だけれども、SleipnirのUserAction見たいな風に簡単に追加できないのは痛いぜ。

1038774さん:2008/12/09(火) 19:20:48 ID:CENbthlg0
http://update.fenrir.co.jp/smartupdate/version.txt

1039774さん:2008/12/09(火) 19:39:34 ID:CENbthlg0
http://update.fenrir.co.jp//smartupdate/release_detail2.php?lang=1041&os=WindowsXP+Service+Pack+3&charset=unicode&build=2802402&type=archive

1040774さん:2008/12/09(火) 20:00:29 ID:CENbthlg0
タスクマネージャさん。


---------------------------
タスク マネージャの警告
---------------------------
警告: プロセスを終了すると、データが失われたり、システムが
不安定になったりするなどの、予期しない結果になることがあります。
プロセスを終了する前に、状態またはデータを保存するかどうかの
確認メッセージは表示されません。プロセスを終了しますか?
---------------------------
はい(Y) いいえ(N)
---------------------------

とか出しているCPU時間があったら、すぐさま終了してください。

1041774さん:2008/12/09(火) 20:04:59 ID:CENbthlg0
[SmartUpdater]
LastCheckTime="14729"

[SmartUpdaterVersionInfo]
ClientVersion="2802"
IsExistNewUpdate="true"
ServerVersion="2804"
ServerKind="4"
ServerNumber="1"
ServerBuildNo="0"
LastTimeShowedUpdateDialog="14729"

1042774さん:2008/12/09(火) 20:19:53 ID:CENbthlg0
さて、Sleipnirが起動を行うたびに、バージョンチェックを行えるようにしたい。
書き換えれば良いのは、
[SmartUpdater]
LastCheckTime=""
だけで良いと思う。

1043774さん:2008/12/09(火) 20:20:29 ID:CENbthlg0
OllyDbgでSleipnir.exeを、おや、後ろから人が来たようだ。

1044774さん:2008/12/09(火) 20:36:12 ID:CENbthlg0
http://www.sleipnir-wiki.jp/index.php?Tips#other_autostart
を使うにもタイミングが・・・

1045774さん:2008/12/09(火) 20:40:44 ID:CENbthlg0
まあ、取り敢えず書いてみよう。

1046774さん:2008/12/10(水) 18:24:55 ID:CENbthlg0
#define STRICT 1

#if !defined(UNICODE) && !defined(_UNICODE)
#error UNICODE版でしかコンパイル出来んぞい。
#endif

#include <iostream>
#include <cstdio>
#include <string>
#include <windows.h>
#include <lmcons.h>
#include <tchar.h>

using namespace std;

bool IsFileExist(wstring str){
FILE *file = _wfopen(str.c_str(), L"rb");
if(!file)
return false;
fclose(file);
return true;
}

//user.iniの入っているフォルダを頑張って探す
wstring GetSettingPath(){
WCHAR cur[MAX_PATH + 1];
GetCurrentDirectoryW(sizeof(cur) / sizeof(cur[0]) - 1, cur);

wstring currentPath(cur);

int UseAppData = 0, MultiUser = 1; //デフォルトらしい。:http://www.sleipnir-wiki.jp/index.php?Tips#w534cfdd
if(IsFileExist(currentPath + L"\\Sleipnir.Property")){ //存在するか
UseAppData = (int)GetPrivateProfileIntW(L"Setting", L"UseAppData", UseAppData, (currentPath + L"\\Sleipnir.Property").c_str());
MultiUser = (int)GetPrivateProfileIntW(L"Setting", L"MultiUser", MultiUser, (currentPath + L"\\Sleipnir.Property").c_str());
}

wstring base;
switch(UseAppData){
case 0:{ //Sleipnirインストールフォルダ以下
base = currentPath + L"\\..\\settings";

break;
}

case 1:{ //各ユーザーのApplication Dataフォルダ以下
base = L"%USERPROFILE%\\..";

break;
}

default:
return wstring(L"");
}
switch(MultiUser){
case 0:{ //All Users
base += L"\\All Users";
break;
}

case 1:{
WCHAR userName[UNLEN + 1];
DWORD size = sizeof(userName) / sizeof(userName[0]) - 1;
GetUserNameW(userName, &size);
base += L"\\";
base += userName;
break;
}

default:
return wstring(L"");
}
if(UseAppData == 1){
//TODO;
return wstring(L"");
}

return base;
}

int main(int argc, char **argv){
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS); //Sleipnirの起動処理よりも早く
wstring settingPath = GetSettingPath();
if(settingPath == L"") return -1;
wstring userIniPath = settingPath + L"\\setting\\user.ini";

if(IsFileExist(userIniPath))
WritePrivateProfileStringW(L"SmartUpdater", L"LastCheckTime", L"\"14727\"", userIniPath.c_str());
}

1047774さん:2008/12/10(水) 18:26:03 ID:CENbthlg0
書いたんだけれども、意味がないことが発覚orz...........
TODOはアプリケーションデータへのパスに書き換えるだけ。
まあ、もう意味が無いことが分かったのでもう良いや。

1048774さん:2008/12/10(水) 18:42:34 ID:CENbthlg0
mootoh.log - Native Client
http://blog.deadbeaf.org/2008/12/09/google-native-client/

1049774さん:2008/12/10(水) 18:45:14 ID:CENbthlg0
find/grep/xargsコマンドを使いこなす 業務で楽するためのUNIXテクニック集「検索」編:CodeZine
http://codezine.jp/article/detail/3279

1050774さん:2008/12/10(水) 19:05:39 ID:CENbthlg0
そうだ!
アセンブリ言語も言語も勉強したんだし、Sleipnir.exeを直接書き換えてコードを直接埋め込めば良いじゃん!
俺頭良い!

アセンブリコードを書く練習にもなるし、一石二鳥!
よし頑張る。

1051774さん:2008/12/10(水) 19:06:25 ID:CENbthlg0
ああ、
だけれども辞めておこう。
ちょっと色々と、ゴフンゴフン。

1052774さん:2008/12/10(水) 19:21:53 ID:CENbthlg0
Linux のアセンブラー: GAS と NASM を比較する
http://www.ibm.com/developerworks/jp/linux/library/l-gas-nasm.html
------
今更ながらこのサイトが良いサイトだと気がついた。

1053774さん:2008/12/10(水) 19:58:33 ID:CENbthlg0
Welcome to JOI
http://www.ioi-jp.org/joiTrial/
-----
出たい!出たい!出たい!出たい!出たい!出たい!出たい!出たい!

1054774さん:2008/12/10(水) 20:42:41 ID:CENbthlg0
PEファイルについての、詳細な資料が見つからない。
だから自分で作るぜ。

1055774さん:2008/12/10(水) 22:09:17 ID:CENbthlg0
Windows の神髄 目次 - プログラミング徹底解説
http://keicode.com/windows/index.php

1056774さん:2008/12/10(水) 22:09:35 ID:CENbthlg0
>>1054
とか言って、作ってない。
まあ出来たしいいや。

1057774さん:2008/12/10(水) 23:29:23 ID:CENbthlg0
あの・・・
アセンブリ言語ってこんなに疲れるんですか?
-----
section .text
global _start
_start:
;GetBaseAddressの呼び出し
push dword [esp] ;RetAdをプッシュ
call GetBaseAddress
add esp, 4

cmp eax, 0
je error

;OreGetProcAddressの呼び出し
push psGetProcAddress
push eax
call OreGetProcAddress
add esp, 8

cmp eax, 0
je error

;終わり
xor eax, eax
ret
error:
mov eax, 1
ret

psGetProcAddress:
db "GetProcAddress", 0

;第一引数 DLLのベースポインタ
;第二引数 手に入れる関数の名前
;返却 見つかったらそのアドレス、無いならば0
OreGetProcAddress:
;スタックフレームる
;[ebp] : NumberOfNames
;[ebp - 4] : AddressOfFunctions
;[ebp - 8] : AddressOfNames
;[ebp - 0Ch] : AddressOfNameOrdinals
;[ebp - 10h] : baseAddress
push ebp
mov ebp, esp
sub esp, 14h

;IMAGE_NT_HEADERS32構造体へのアドレスを取得(edi)
mov ecx, dword [ebp + 8] ;第一引数
mov edi, dword [ecx + 3Ch] ;IMAGE_NT_HEADERS32
add edi, ecx ;ベースポインタを足す

;IMAGE_NT_HEADERS32::IMAGE_OPTIONAL_HEADER32::DataDirectoryのアドレス取得(eax)&
;エクスポートテーブル(IMAGE_EXPORT_DIRECTORY)のアドレス取得(edi)
xor eax, eax
mov ax, word [edi + 14h] ;SizeOfOptionalHeader
lea eax, [edi + eax + 18h] ;IMAGE_NT_HEADERS32全体の大きさを足す
sub eax, 80h ;DataDirectory分引く 80h == sizeof(IMAGE_DATA_DIRECTORY) * 16
mov edi, dword [eax] ;エクスポートテーブルのアドレス取得
add edi, ecx

;ここまでで
;ecx : DLLのベースポインタ, edi : エクスポートテーブル(IMAGE_EXPORT_DIRECTORY)のアドレス

;NumberOfNames格納
mov eax, dword [edi + 18h]
mov [ebp], eax

;AddressOfFunctions格納
mov eax, dword [edi + 1Ch]
add eax, ecx
mov dword [ebp - 4], eax

;AddressOfNames格納
mov eax, dword [edi + 20h]
add eax, ecx
mov dword [ebp - 8], eax

;AddressOfNameOrdinals格納
mov eax, dword[edi + 24h]
add eax, ecx
mov dword [ebp - 0Ch], eax

;ベースアドレス退避
mov dword [ebp - 10h], ecx

;API名の検索
mov esi, dword [ebp - 8]
mov edx, esi
mov edi, dword [esi]
add edi, ecx
xor ecx, ecx
mov ebx, dword [ebp + 0Ch]


OreGetP_loop:
mov esi, ebx

OreGetP_check:
;API名が一致か?
cmpsb
jne OreGetP_next

cmp byte [edi], 0 ;終端か?
jne OreGetP_check
cmp byte [esi], 0 ;終端か?
jne OreGetP_check
jmp OreGetP_found

OreGetP_next:
inc ecx
cmp ecx, dword [ebp]
jge OreGetP_notfound

add edx, 4
mov esi, edx
mov edi, dword [esi]
add edi, dword [ebp - 10h]
jmp OreGetP_loop

OreGetP_found:
mov ebx, esi
inc ebx
shl ecx, 1
mov esi, dword [ebp - 0Ch]
add esi, ecx
xor eax, eax
mov ax, word [esi]
shl eax, 2
mov esi, [ebp - 4]
add esi, eax
mov edi, dword [esi]
add edi, dword [ebp - 10h]
mov eax, edi

leave
ret

OreGetP_notfound:
xor eax, eax
leave
ret

;第一引数 適当なアドレス
;返却 PEヘッダとかが見つかったらそのアドレス、無いならば0
GetBaseAddress:
;リミッター
mov ecx, 10h
;Kernel32へのRetAd
mov eax, dword [esp + 4]
;マスク
and eax, 0FFFF0000h
GetK_roop:
;リミッターのチェック
test ecx, ecx ;cmp ecx, 0
je GetK_notfound
;MZシグネチャのチェック
cmp word[eax], 'MZ'
je GetK_check_PE
GetK_next:
;次へ
sub eax, 10000h
dec ecx
jmp GetK_roop
GetK_check_PE:
;PEのチェック
mov edi, [eax + 3Ch] ;IMAGE_DOS_HEADER::e_lfanew : File address of new exe header
add edi, eax
cmp dword [edi], 00004550h ;'PE\0\0'
je GetK_end
jmp GetK_next
GetK_notfound:
xor eax, eax
GetK_end:
ret

1058774さん:2008/12/10(水) 23:30:19 ID:CENbthlg0
GetProcAddressをアセンブリで実装する馬鹿がここに居ますよwwww
まあ、殆どが某サイトからのパクリなんですが。

1059774さん:2008/12/11(木) 00:02:36 ID:CENbthlg0
.textセクションだけで動くので、他のexeに仕込むのも簡単だね!
これでウィルスが作れる><

1060774さん:2008/12/11(木) 00:28:03 ID:CENbthlg0
何かするときにGetProcAddressで関数を読み込むのが面倒だな。
まあ、仕方ない。
それがアセンブリ言語。

1061774さん:2008/12/11(木) 00:42:23 ID:CENbthlg0
Acidテストが通ったからって、正しく表示できるとは限らない。

1062774さん:2008/12/11(木) 00:45:05 ID:CENbthlg0
ジョイントかなんかしらんが、そこらへんは間にセパレータを挟むとかそういうので判断しているのかな。

1063774さん:2008/12/11(木) 00:50:33 ID:CENbthlg0
Sleipnirも然り、Lunascapeも然りなんだけれども、まだブラウザとしては完成してない。
少なくとも、クッキーとパスワードは共有できるようにしろ。

1064774さん:2008/12/11(木) 00:58:21 ID:CENbthlg0
ClassFinderXPで覗いてみたら、凄いにはLunascapeの開発の人じゃなくてBCGToolBaraの中の人だと思った。

1065774さん:2008/12/11(木) 01:01:14 ID:CENbthlg0
つまりLunascapeすげえええええええ、って思っていたところは見当違いだったっていうことだ。

1066774さん:2008/12/11(木) 18:32:37 ID:CENbthlg0
JOI登録した!

1067774さん:2008/12/11(木) 18:32:55 ID:CENbthlg0
これで、予選に参加できるお

1068774さん:2008/12/11(木) 18:57:45 ID:CENbthlg0
ProcessIdの一覧は取得出来たのだが、そのプロセスのパスを取得する方法が分からない。

1069774さん:2008/12/11(木) 19:25:11 ID:CENbthlg0
ああ、面倒くさい。
もう辞めた。
まあ、方針としては、Sleipnirのプロセスハンドルを手に入れてWaitForSingleObjectで終了まで待って、終わったら、色々と解析して(ry
-----
#define STRICT 1

#if !defined(UNICODE) && !defined(_UNICODE)
#error UNICODE版でしかコンパイル出来んぞい。
#endif

#pragma comment(lib, "psapi.lib")

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <windows.h>
#include <lmcons.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <tchar.h>

using namespace std;

bool IsFileExist(wstring str){
FILE *file = _wfopen(str.c_str(), L"rb");
if(!file)
return false;
fclose(file);
return true;
}

//user.iniの入っているフォルダを頑張って探す
wstring GetSettingPath(){
WCHAR cur[MAX_PATH + 1];
GetCurrentDirectoryW(sizeof(cur) / sizeof(cur[0]) - 1, cur);

wstring currentPath(cur);

int UseAppData = 0, MultiUser = 1; //デフォルトらしい。:http://www.sleipnir-wiki.jp/index.php?Tips#w534cfdd
if(IsFileExist(currentPath + L"\\Sleipnir.Property")){ //存在するか
UseAppData = (int)GetPrivateProfileIntW(L"Setting", L"UseAppData", UseAppData, (currentPath + L"\\Sleipnir.Property").c_str());
MultiUser = (int)GetPrivateProfileIntW(L"Setting", L"MultiUser", MultiUser, (currentPath + L"\\Sleipnir.Property").c_str());
}

wstring base;
switch(UseAppData){
case 0:{ //Sleipnirインストールフォルダ以下
base = currentPath + L"\\..\\settings";

break;
}

case 1:{ //各ユーザーのApplication Dataフォルダ以下
base = L"%USERPROFILE%\\..";

break;
}

default:
return wstring(L"");
}
switch(MultiUser){
case 0:{ //All Users
base += L"\\All Users";
break;
}

case 1:{
WCHAR userName[UNLEN + 1];
DWORD size = sizeof(userName) / sizeof(userName[0]) - 1;
GetUserNameW(userName, &size);
base += L"\\";
base += userName;
break;
}

default:
return wstring(L"");
}
if(UseAppData == 1){
//TODO;
return wstring(L"");
}

return base;
}

int main(int argc, char **argv){
HANDLE hEnum = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hEnum == INVALID_HANDLE_VALUE) return -1;
PROCESSENTRY32 pe;
pe.dwSize = sizeof(pe);

Process32First(hEnum, &pe);
HANDLE hSleipnir = NULL;
do{
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pe.th32ProcessID);
if(hProcess){
HMODULE hMod;
DWORD needed;
EnumProcessModules(hProcess, &hMod, sizeof(hMod), &needed);
WCHAR path[MAX_PATH + 1];
GetModuleFileNameEx(hProcess, hMod, path, sizeof(path) / sizeof(path[0]) - 1);
int i = 0;
i++;
}
}while(Process32Next(hEnum, &pe));
CloseHandle(hEnum);


wstring settingPath = GetSettingPath();
if(settingPath == L"") return -1;
wstring userIniPath = settingPath + L"\\setting\\user.ini";

if(IsFileExist(userIniPath))
WritePrivateProfileStringW(L"SmartUpdater", L"LastCheckTime", L"\"14727\"", userIniPath.c_str());
}

1070774さん:2008/12/11(木) 20:45:24 ID:CENbthlg0
同一フォルダ内のSleipnirが一つでも起動していると終了しないプログラム。
-----
#define STRICT 1

#if !defined(UNICODE) && !defined(_UNICODE)
#error UNICODE版でしかコンパイル出来んぞい。
#endif

#pragma comment(lib, "psapi.lib")

#include <iostream>
#include <cstdio>
#include <string>
#include <vector>
#include <windows.h>
#include <lmcons.h>
#include <tlhelp32.h>
#include <psapi.h>
#include <tchar.h>

using namespace std;

std::vector<DWORD> GetSleipnirProcessId(){
std::vector<DWORD> ret;

HANDLE hEnum = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if(hEnum != INVALID_HANDLE_VALUE){
PROCESSENTRY32W ps = {sizeof(ps)};

if(Process32FirstW(hEnum, &ps)){
WCHAR curpath[MAX_PATH + 1];
DWORD curProcessId = GetCurrentProcessId();
if(GetCurrentDirectoryW(sizeof(curpath) / sizeof(curpath[0]) - 1, curpath)){
CharLowerBuffW(curpath, lstrlenW(curpath));
do{
if(curProcessId != ps.th32ProcessID){
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ps.th32ProcessID);
if(hProcess){
DWORD dummy;
HMODULE hMod;
if(EnumProcessModules(hProcess, &hMod, sizeof(hMod), &dummy)){
WCHAR path[MAX_PATH + 1];
if(GetModuleFileNameExW(hProcess, hMod, path, sizeof(path) / sizeof(path[0]) - 1)){
unsigned int len = lstrlenW(path);
CharLowerBuffW(path, len);
if(curpath[0] == path[0]){
while(path[--len] != L'\\');
path[len] = L'\0';
if(path[len + 1] && path[len + 2] && path[len + 3] && path[len + 4] && path[len + 5] && path[len + 6] && path[len + 7] && path[len + 8] && path[len + 1] == L's' && path[len + 2] == L'l' && path[len + 3] == L'e' && path[len + 4] == L'i' && path[len + 5] == L'p' && path[len + 6] == L'n' && path[len + 7] == L'i' && path[len + 8] == 'r'){
if(lstrcmpW(path, curpath) == 0){
ret.push_back(ps.th32ProcessID);
}
}
}
}
}
}
CloseHandle(hProcess);
}
}while(Process32NextW(hEnum, &ps));
}
}
}
return ret;
}

int main(int argc, char **argv){
//SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
std::vector<DWORD> sleipnirs = GetSleipnirProcessId();
while(1){
unsigned int len = sleipnirs.size();
if(len == 0)
break;

HANDLE *p = (HANDLE *)std::malloc(len * sizeof(HANDLE));
for(unsigned int i = 0; i < len; ++i){
p[i] = OpenProcess(SYNCHRONIZE, FALSE, sleipnirs[i]);
}

WaitForMultipleObjects(len, p, TRUE, INFINITE);

for(unsigned int i = 0; i < len; ++i){
CloseHandle(p[i]);
}

std::free(p);
sleipnirs = GetSleipnirProcessId();
}

}

1071774さん:2008/12/11(木) 20:45:58 ID:CENbthlg0
lstrncmpがなかったからハードコートしてやったww

1072774さん:2008/12/11(木) 20:46:12 ID:CENbthlg0
ハードコード

1073774さん:2008/12/11(木) 21:12:12 ID:CENbthlg0
Native Clientの仕組みはどうなっているのか? - やねうらお−よっちゃんイカはしばらく買わずにiPhoneだけに注力する男
http://d.hatena.ne.jp/yaneurao/20081211#p1
Native Client必死こいて訳した1 - Yet Another Ranha
http://d.hatena.ne.jp/ranha/20081210/1228889363
jQuery を高速に使う CSS セレクタの書き方 - てっく煮ブログ
http://d.hatena.ne.jp/nitoyon/20081211/jquery_fast_css

1074774さん:2008/12/12(金) 19:02:42 ID:CENbthlg0
JOI 2006 予選 問題4
http://www.ioi-jp.org/joi/2005/2006-yo-prob_and_sol/2006-yo-t4.html
-----
こういう問題だけは出るな・・・

1075774さん:2008/12/12(金) 19:04:12 ID:CENbthlg0
Win32::GuiTest で Windows の GUI アプリをハックしよう
http://perl-users.jp/articles/advent-calendar/2008/13.html
.htaccessで使える16の技:phpspot開発日誌
http://phpspot.org/blog/archives/2008/12/htaccess16.html

1076774さん:2008/12/12(金) 20:09:16 ID:CENbthlg0
>>1074
問題読んでいなかったらミスったwwwwwwwwww

1077774さん:2008/12/12(金) 20:16:30 ID:CENbthlg0
二つ横に移動させるときに一回動かして、チェックしてもう一回(ry
見たいなことをやれば良いんだ!

1078774さん:2008/12/12(金) 20:21:43 ID:CENbthlg0
でも改造するの面倒です。

1079774さん:2008/12/12(金) 20:22:08 ID:CENbthlg0
まあ、明後日の方向に向かって頑張ろう(意味不明

1080774さん:2008/12/12(金) 20:58:43 ID:CENbthlg0
Sleipnirの更新始まったな。
まあ、Sleipnir自体はまだ始まってないんだけれども。

1081774さん:2008/12/12(金) 21:50:18 ID:CENbthlg0
だみー
http://extensions.tabbrowser.jp/labs/yasuyuki/dummy.html
-----

1082774さん:2008/12/12(金) 22:10:57 ID:CENbthlg0
こんなスクリプト作っておけば楽でしょ。
-----
for(my $i = 1; $i <= 5; ++$i){
`test_test < $i > out$i.txt`
}

1083774さん:2008/12/12(金) 22:11:37 ID:CENbthlg0
後はリダイレクトの内側のファイル名を弄くれば良い。

1084774さん:2008/12/12(金) 22:17:57 ID:CENbthlg0
落とした資料ならばおkらしいので、STLの解説を落とした。

1085774さん:2008/12/12(金) 22:25:51 ID:CENbthlg0
取り敢えず、このコンテストが終わったら、本格的に勉強する。
流石に偏差値29.5は無いわwwww

1086774さん:2008/12/12(金) 22:41:01 ID:CENbthlg0
取り敢えず、本選出場が最低ラインの方向で。
まあ、いけるか分からんがwwwwwwwwwwwwwwwwww

1087774さん:2008/12/13(土) 18:53:02 ID:CENbthlg0
JOI2006予選 問題4@C++(-66) - 簡潔で覚えやすいタイトルを3秒で思いつく程度の能力
http://d.hatena.ne.jp/qnighy/20081024/1224856862
-----
今見ると、単純な再帰的なプログラムである。

1088774さん:2008/12/13(土) 19:26:40 ID:CENbthlg0
明日の問題で、変な問題が出ませんように。

1089774さん:2008/12/14(日) 12:00:07 ID:CENbthlg0
一時間も前からログインしている俺は変な人である。

1090774さん:2008/12/14(日) 12:01:59 ID:CENbthlg0
問題まだー

1091774さん:2008/12/14(日) 12:32:58 ID:CENbthlg0
コマンドプロンプトで上を押すと、以前実行したコマンドが入力される。
これは滅茶苦茶使えるwww

1092774さん:2008/12/14(日) 12:51:01 ID:CENbthlg0
という事で、コマンドプロンプト+Visual C+++perlでいく。

1093774さん:2008/12/14(日) 12:51:55 ID:CENbthlg0
ちゃんと、テスト用のデータは用意されているのかな?
無かったら困るしwww
まあ、自分で作れば良いのだが。

1094774さん:2008/12/14(日) 12:56:23 ID:CENbthlg0
そろそろか・・・

1095774さん:2008/12/14(日) 12:57:04 ID:CENbthlg0
後三分も無いぜ!

1096774さん:2008/12/14(日) 12:57:27 ID:CENbthlg0
では、そろそろ頑張ってきます
ノシ

1097774さん:2008/12/14(日) 12:58:59 ID:CENbthlg0
誰も見ていないだろうが・・・
頑張ろう俺!

1098774さん:2008/12/14(日) 16:00:27 ID:CENbthlg0
俺にはむずかしすぎたようです

1099774さん:2008/12/14(日) 19:40:26 ID:CENbthlg0
たぶんおちたとおもふ。
まあいいや。どうせおれのじつりょくなんて・・・

1100774さん:2008/12/14(日) 20:36:07 ID:CENbthlg0
GCアルゴリズム詳細解説 - livedoor Wiki(ウィキ)
http://wiki.livedoor.jp/author_nari/d/

1101774さん:2008/12/15(月) 19:02:45 ID:CENbthlg0
絶対、Sleipnirはタブが全部閉じたらSleipnirも終了するという仕様にするなよ!
するなら、するほうを隠し設定にするんだぞ!絶対標準にするなよ!

1102774さん:2008/12/15(月) 19:09:31 ID:CENbthlg0
Ruby使わないのにRuby入れた。

1103774さん:2008/12/15(月) 23:09:08 ID:CENbthlg0
アセンブリで、memset書いてみた。
-----
memset:
mov edi, dword [esp + 4]
mov ebx, dword [esp + 8]
mov ecx, dword [esp + 0Ch]
and ebx, 000000FFh
xor eax, eax
or eax, ebx
shl ebx, 8
or eax, ebx
mov ebx, eax
shl ebx, 10h
or eax, ebx
mov ebx, ecx
and ebx, 00000003h
shr ecx, 2
rep stosd
mov ecx, ebx
retp stosb
xor eax, eax
ret

1104774さん:2008/12/15(月) 23:25:41 ID:CENbthlg0
retpじゃなくてrepですね。

1105774さん:2008/12/16(火) 00:33:10 ID:CENbthlg0
IE6で閲覧すると。|CSS HappyLife
http://css-happylife.com/log/zakki/000736.shtml
-----
これはwwwwwwwwwwwww

1106774さん:2008/12/16(火) 00:41:15 ID:CENbthlg0
米 Yahoo! が SQL っぽく色んなデータを取ってこれるAPIを出した - てっく煮ブログ
http://d.hatena.ne.jp/nitoyon/20081215/yql_review

1107774さん:2008/12/16(火) 19:30:04 ID:CENbthlg0
突如多発したWebページ改ざん狙いは明らかに日本:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20081209/320992/

1108774さん:2008/12/16(火) 19:53:41 ID:CENbthlg0
jQueryを使うときに気をつけるべき8のポイント : tech.kayac.com - KAYAC engineers' blog
http://tech.kayac.com/archive/jquery-checkpoints.html
IPv6 とかよくわからない人間が IPv6 対応サイトを作る際の知っておくべき 8 つの注意点 - にぽたん研究所
http://blog.livedoor.jp/nipotan/archives/51195204.html
HTTP Status Code
http://status-code.com/

1109774さん:2008/12/16(火) 20:44:01 ID:CENbthlg0
IPv4で規制中に書き込むスレッド
http://ipv6.2ch.net/test/read.cgi/ipv6/1222776717/14-15n
IPv4で規制中に書き込むスレッド
http://ipv6.2ch.net/test/read.cgi/ipv6/1222776717/
----
同じスレですね。はい。
勉強になる。

1110774さん:2008/12/17(水) 18:31:25 ID:CENbthlg0
Get faster Gmail with a faster browser - Help Center
http://mail.google.com/support/bin/answer.py?&amp;answer=107906&amp;hl=en
-----
wwwwwwwwwwwwwwwwwwwwwwww

1111774さん:2008/12/17(水) 20:19:47 ID:CENbthlg0
うーん。
頑張って他のexeに.textセクションだけでも紛れさせれないか頑張っているのだが・・・

1112774さん:2008/12/17(水) 22:29:37 ID:CENbthlg0
std::priority_queue<pair<DWORD, IMAGE_SECTION_HEADER *>, vector<pair<DWORD, IMAGE_SECTION_HEADER *> >, std::greater<vector<pair<DWORD, IMAGE_SECTION_HEADER *> >::value_type > >
これは酷い型宣言。

1113774さん:2008/12/17(水) 22:31:22 ID:CENbthlg0
正確にはこうだな

std::priority_queue<std::pair<DWORD, IMAGE_SECTION_HEADER *>, std::vector<std::pair<DWORD, IMAGE_SECTION_HEADER *> >, std::greater<std::vector<std::pair<DWORD, IMAGE_SECTION_HEADER *> >::value_type > > q;

1114774さん:2008/12/17(水) 23:40:46 ID:CENbthlg0
しょぼーん。
頑張って書いたのに、意味なかった。
今までの四時間を返せ!

1115774さん:2008/12/17(水) 23:41:29 ID:CENbthlg0
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <functional>

#include <windows.h>
#include <tchar.h>

#if defined(UNICODE) || defined(_UNICODE)
#error UNICODE版はサポートしてないみたいです。
#endif
#if defined(_WIN64)
#error 64bit版はサポートしてないみたいです。
#endif

#define RVA(po, rva) \
((void *)(((BYTE *)(po)) + ((long)(rva))))

IMAGE_SECTION_HEADER *GetTextSection(IMAGE_SECTION_HEADER *section, WORD numOfSection){
for(int i = 0; i < numOfSection; ++i){
if(lstrcmpA((char *)section[i].Name, ".text") == 0){
return &section[i];
}
}
return NULL;
}

1116774さん:2008/12/17(水) 23:42:02 ID:CENbthlg0
void Unko(void *src, void *des, DWORD srcSize, DWORD desSize){
IMAGE_DOS_HEADER *pSrcDosHeader = (IMAGE_DOS_HEADER *)src;
IMAGE_DOS_HEADER *pDesDosHeader = (IMAGE_DOS_HEADER *)des;

if(pSrcDosHeader->e_magic == IMAGE_DOS_SIGNATURE && pDesDosHeader->e_magic == IMAGE_DOS_SIGNATURE){
IMAGE_NT_HEADERS32 *pSrcNtHeader = (IMAGE_NT_HEADERS32 *)RVA(src, pSrcDosHeader->e_lfanew);
IMAGE_NT_HEADERS32 *pDesNtHeader = (IMAGE_NT_HEADERS32 *)RVA(des, pDesDosHeader->e_lfanew);

if(pSrcNtHeader->Signature == IMAGE_NT_SIGNATURE && pDesNtHeader->Signature == IMAGE_NT_SIGNATURE){
WORD srcNumberOfSections = pSrcNtHeader->FileHeader.NumberOfSections;
WORD desNumberOfSections = pDesNtHeader->FileHeader.NumberOfSections;

IMAGE_SECTION_HEADER *pSrcSections = IMAGE_FIRST_SECTION(pSrcNtHeader);
IMAGE_SECTION_HEADER *pDesSections = IMAGE_FIRST_SECTION(pDesNtHeader);

IMAGE_SECTION_HEADER *pSrcTextSection = GetTextSection(pSrcSections, srcNumberOfSections);
IMAGE_SECTION_HEADER *pDesTextSection = GetTextSection(pDesSections, desNumberOfSections);

if(pSrcTextSection && pDesTextSection){
//ソースの.textセクションの大きさ
DWORD srcTextSectionSize = pSrcTextSection->SizeOfRawData;

//挿入先の.textセクションのファイル上の大きさ
DWORD desTextSectionSize = pDesTextSection->SizeOfRawData;
//挿入先の.textセクションのメモリ上の大きさ
DWORD desTextSectionVirtualSize = pDesTextSection->Misc.VirtualSize;

//挿入先のセクションのアラインメントの大きさ
DWORD desSectionAlignment = pDesNtHeader->OptionalHeader.SectionAlignment;
//挿入先のセクションのファイル上のアラインメントの大きさ
DWORD desFileAlignment = pDesNtHeader->OptionalHeader.FileAlignment;

//挿入後の.textセクションのファイル上の大きさ(もっと良い求め方があったが、忘れた。)幾らか足しているのはアセンブリ用(下の方のcode分)
DWORD desAfterTextSectionSize = ((srcTextSectionSize + desTextSectionSize) + desFileAlignment - 1 + 10 /*アセンブリ分*/) / desFileAlignment * desFileAlignment;
//.textセクションのファイル上の増加量
DWORD desTextSectionAddition = desAfterTextSectionSize - desTextSectionSize;
//挿入後の.textセクションのメモリ上の大きさ?良く分からん。
//DWORD desAfterTextSectionVirtualSize = (desAfterTextSectionSize + desSectionAlignment - 1) / desSectionAlignment * desSectionAlignment;
DWORD desAfterTextSectionVirtualSize = desTextSectionVirtualSize + desTextSectionAddition;

//挿入後のexeの大きさ
SIZE_T fileSize
= desSize //元のファイルの大きさ
+ desTextSectionAddition //増えた.textセクションの大きさ
;

void *p = VirtualAlloc(NULL, fileSize, MEM_COMMIT, PAGE_READWRITE);

1117774さん:2008/12/17(水) 23:42:25 ID:CENbthlg0
if(p){
#define DESTOP(po) (void *)((long)(po) - (long)(des) + (long)(p))
memcpy(p, des, desSize);
//TODO
//.textセクションの挿入&エントリポイントの変更&アセンブリ(バイナリ)の挿入&情報の修正

IMAGE_NT_HEADERS32 *pImageNtHeader = (IMAGE_NT_HEADERS32 *)DESTOP(pDesNtHeader);

IMAGE_SECTION_HEADER *pImageSections = (IMAGE_SECTION_HEADER *)DESTOP(pDesSections);
IMAGE_SECTION_HEADER *pTextSection = (IMAGE_SECTION_HEADER *)DESTOP(pDesTextSection);

//.textセクションより後ろにあるものを移動&値変更
{
//.textセクションの開始位置(RVA)
DWORD pTextSectionPointerToRawData = pTextSection->PointerToRawData;
std::priority_queue<std::pair<DWORD, IMAGE_SECTION_HEADER *>, std::vector<std::pair<DWORD, IMAGE_SECTION_HEADER *> >, std::greater<std::vector<std::pair<DWORD, IMAGE_SECTION_HEADER *> >::value_type > > q;
for(int i = 0; i < desNumberOfSections; ++i){
if(pImageSections[i].PointerToRawData > pTextSectionPointerToRawData){
q.push(std::pair<DWORD, IMAGE_SECTION_HEADER *>(pImageSections[i].PointerToRawData, &pImageSections[i]));
pImageSections[i].PointerToRawData += desTextSectionAddition;
}
}

while(!q.empty()){
std::pair<DWORD, IMAGE_SECTION_HEADER *> &top = q.top();
void *sp = RVA(p, top.first);
memmove(RVA(sp, desTextSectionAddition), sp, top.second->SizeOfRawData);

q.pop();
}
}

//.textセクションを弄くる
{
void *sp = RVA(p, pTextSection->PointerToRawData);
memmove(RVA(sp, desTextSectionAddition), sp, pTextSection->SizeOfRawData);
static const BYTE code[] = {
0xE8, 0x00, 0x00, 0x00, 0x00, //CALL rel32
0xE9, 0x00, 0x00, 0x00, 0x00, //JMP rel32
};

memcpy(sp, code, sizeof(code));
memcpy(RVA(sp, sizeof(code)), RVA(src, pSrcTextSection->PointerToRawData), pSrcTextSection->SizeOfRawData);

//挿入元のEXEのエントリポイントの.textでの相対位置
DWORD srcEntryPoint = pSrcNtHeader->OptionalHeader.AddressOfEntryPoint - pSrcNtHeader->OptionalHeader.BaseOfCode;
//挿入先のEXEのエントリポイントの.textでの相対位置
DWORD desEntryPoint = pDesNtHeader->OptionalHeader.AddressOfEntryPoint - pDesNtHeader->OptionalHeader.BaseOfCode;

pImageNtHeader->OptionalHeader.AddressOfEntryPoint = pImageNtHeader->OptionalHeader.BaseOfCode;
*((DWORD *)RVA(sp, 1)) = sizeof(code) - 5 + srcEntryPoint;
*((DWORD *)RVA(sp, 6)) = desTextSectionAddition + desEntryPoint - 10;
}

//.textセクションの大きさの修正
{
pTextSection->SizeOfRawData = desAfterTextSectionSize;
pTextSection->Misc.VirtualSize = desAfterTextSectionVirtualSize;
}

FILE *filew = fopen("out.exe", "wb");
fwrite(p, fileSize, 1, filew);
VirtualFree(p, fileSize, MEM_DECOMMIT);
}
}
}
}
}

1118774さん:2008/12/17(水) 23:42:35 ID:CENbthlg0

int main(int argc, char **argv){
if(argc < 4){
std::cerr << "引数が少ないみたいです。" << std::endl;
std::cerr << "コマンド S D T" << std::endl;
return -1;
}
HANDLE hSrc = CreateFileA(argv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE hDes = CreateFileA(argv[2], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if(hSrc != INVALID_HANDLE_VALUE && hDes != INVALID_HANDLE_VALUE){
LARGE_INTEGER srcSize, desSize;
if(GetFileSizeEx(hSrc, &srcSize) && GetFileSizeEx(hDes, &desSize)){
std::cout << "FROM:" << srcSize.QuadPart << "bytes" << std::endl;
std::cout << " TO :" << desSize.QuadPart << "bytes" << std::endl;

//でかすぎるのはここで一応切っておく。これより小さくても本当はやめるべきだが。
if(!srcSize.HighPart && !desSize.HighPart){
HANDLE hSrcMap = CreateFileMappingA(hSrc, NULL, PAGE_READONLY, 0, 0, NULL);
HANDLE hDesMap = CreateFileMappingA(hDes, NULL, PAGE_READONLY, 0, 0, NULL);
if(hSrcMap && hDesMap){
void *pSrc = MapViewOfFile(hSrcMap, FILE_MAP_READ, 0, 0, 0);
void *pDes = MapViewOfFile(hDesMap, FILE_MAP_READ, 0, 0, 0);
if(pSrc && pDes){
Unko(pSrc, pDes, srcSize.LowPart, desSize.LowPart);
}
if(pSrc)
UnmapViewOfFile(pSrc);
if(pDes)
UnmapViewOfFile(pDes);
}
if(hSrcMap)
CloseHandle(hSrcMap);
if(hDesMap)
CloseHandle(hDesMap);
}
}
}
if(hSrc != INVALID_HANDLE_VALUE)
CloseHandle(hSrc);
if(hDes != INVALID_HANDLE_VALUE)
CloseHandle(hDes);
}

1119774さん:2008/12/17(水) 23:48:21 ID:CENbthlg0
>>1115-1118
http://mimizu.karou.jp/static/exeinjection.cpp

1120774さん:2008/12/17(水) 23:55:27 ID:CENbthlg0
これくらいincludeしておけば、間違えなく安心。
#include <iostream>
#include <vector>
#include <deque>
#include <queue>
#include <map>
#include <string>
#include <algorithm>
#include <functional>

#include <cstdio>
#include <cstdlib>
#include <climits>
#include <ctime>

int main(int argc, char **argv){

}

1121774さん:2008/12/18(木) 02:43:49 ID:CENbthlg0
>また、第8回日本情報オリンピック予選の結果通知は、12月23日(火)を予定しています。
落ちてるだろうがwktk

1122774さん:2008/12/18(木) 18:50:04 ID:CENbthlg0
jQueryを良くする25のTIPS[to-R]
http://blog.webcreativepark.net/2008/12/17-225630.html

1123774さん:2008/12/19(金) 17:10:52 ID:CENbthlg0
メニューの項目上で右クリックを出来るようにするっていうのは難しいのか?

1124774さん:2008/12/19(金) 18:22:05 ID:CENbthlg0
C#って凄く簡単にGUI作れるね!

1125774さん:2008/12/19(金) 18:57:45 ID:CENbthlg0
随分と前からgccを入れていたのだが、ようやく使ってみた。
物凄く簡単じゃんww

1126774さん:2008/12/19(金) 18:58:59 ID:CENbthlg0
PATH通した。

1127774さん:2008/12/19(金) 19:01:40 ID:CENbthlg0
MinGM(gcc)だとファイル名を指定しないとa.exe(a.out)が出力されるのが粋だよな。

1128774さん:2008/12/19(金) 19:40:42 ID:CENbthlg0
Windows の基本的なコマンド集 - IT戦記
http://d.hatena.ne.jp/amachang/20081219/1229674783
-----
Unixのほうがいいんじゃね?

1129774さん:2008/12/19(金) 20:00:59 ID:CENbthlg0
PowerShellを入れている。

1130774さん:2008/12/19(金) 20:04:43 ID:CENbthlg0
バージョン情報が2006だし。
けっこう古いな。

1131774さん:2008/12/19(金) 20:10:41 ID:CENbthlg0
GNU make 日本語訳(Coop編) - 目次
http://www.ecoop.net/coop/translated/GNUMake3.77/make_toc.jp.html
-----
そろそろmakefileの勉強ですか?
遅いですね。

1132774さん:2008/12/19(金) 20:59:33 ID:CENbthlg0
一個Sleipnir用のプラグインを思いついたけれども、正規の方法じゃ無理だなあ。
まあ、ただ単に他のウィンドウのEditボックスの内容をURLとして開くようなそんな機能。

1133774さん:2008/12/20(土) 17:04:11 ID:CENbthlg0
Firefoxで最後のタブを閉じても終了しないようにするには
browser.tabs.closeWindowWithLastTab

false
にすれば良いみたい。

1134774さん:2008/12/20(土) 19:27:19 ID:CENbthlg0
今更ながら、Script+EXEでSleipnirは全て弄くれることをおもいだした。

1135774さん:2008/12/21(日) 13:39:36 ID:CENbthlg0
ハードリンクとジャンクションを作れるようにしてやった。


新着レスの表示


名前: E-mail(省略可)

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

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

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

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