いろいろおすすめ 2020/06/17

大清楚月ノ美兎









なろうブックマーク500ちょいの中からおすすめ順



熱い
たとえば俺が、チャンピオンから王女のヒモにジョブチェンジしたとして。
全肯定奴隷少女:1回10分1000リン
【書籍4月28日発売!】仲が悪すぎる幼馴染が、俺が5年以上ハマっているFPSゲームのフレンドだった件について。
時使い魔術師の転生無双 ~魔術学院の劣等生、実は最強の時間系魔術師でした~



勘違い

男主人公
嘆きの亡霊は引退したい 〜最弱ハンターは英雄の夢を見る〜【Web版】
さすがに武器を持ってお店に突っ込めば退学にしてくれるよね!ねえ!!
陰の実力者になりたくて!【web版】
不死者の弟子~邪神の不興を買って奈落に落とされた俺の英雄譚~

女主人公
シャバの「普通」は難しい
無欲の聖女は金にときめく
夜伽の国の月光姫



コメディ+TUEEEE
そのガーゴイルは地上でも危険です ~翼を失くした最強ガーゴイルの放浪記~ 



ホラーorダーク
転生ごときで逃げられるとでも、兄さん?
悪の組織の求人広告



ゲーム転生
アビス・コーリング〜元廃課金ゲーマーが最低最悪のソシャゲ異世界に召喚されたら〜【Web版】
吸血姫は薔薇色の夢をみる
野生のラスボスが現れた!



その他おすすめ
予言の経済学 ~巫女姫と転生商人の異世界災害対策~
田中のアトリエ ~年齢イコール彼女いない歴の錬金術師~
ある魔術師の手慰み迷宮行
異世界道楽に飽きたら




俺は好き
灰色の勇者は人外道を歩み続ける
堕落の王【Web版】


まだ短いけどおもしろいかも?
「ククク……。ヤツは四天王の中でも最弱」という風評被害のせいで追放された死属性四天王は静かに過ごしたい



えrg
HHG
景の海のアペイリア




うさちゃんねる跡地
primaryyuiko
REOL - No title
youtube list



アニメ
ワンパンマン
幼女戦記
さいきくすおのさいなん

魔法科高校の劣等生
コードギアス
OVERLORD
BLACK LAGOON
とある
ダーヴィンズゲーム
氷菓
ロクでなし魔術行使
ネトゲの嫁は
かぐや様
ストライクザブラッド
このすば
らぶらぼ
あかめがきる
だがしかし
ログホライズン

HARDCODED msvc++ 関数のサイズを調べる

#include "stdafx.h"

#define FUNC_GARBAGE \
	__asm _emit 0xEB \
	__asm _emit 0xEC \
	__asm _emit 0xED \
	__asm _emit 0xEF \

__declspec(naked) int __cdecl print_char()
{
	__asm
	{
		push ebp
		mov ebp,esp
		sub esp, __LOCAL_SIZE
		push ebx
		push edi
		push esi
	}
	
	char c;
	int ret;

	c = getchar();
	
	printf("%c\n", c);

	ret = 12456;

	__asm
	{
		mov eax, ret
		pop esi
		pop edi
		pop ebx
		mov esp,ebp
		pop ebp
		ret
	}

	FUNC_GARBAGE
}

int main()
{
	LPVOID lpvFunction = print_char;
	LPBYTE lpbStart, lpbEnd, lpbTemp;
	DWORD dw;
	BOOL fSuccess;

	// search garbage
	lpbStart = LPBYTE(lpvFunction);
	lpbEnd = lpbStart + 0x1000;
	fSuccess = FALSE;

	for (lpbTemp = lpbStart; lpbTemp < lpbEnd; lpbTemp++)
	{
		dw = *(LPDWORD)lpbTemp;
		if (dw == 0xEFEDECEB)
		{
			fSuccess = TRUE;
			break;
		}
	}

	if (fSuccess)
	{
		printf("start = %p, end = %p, size = %d\n", lpbStart, lpbTemp, lpbTemp - lpbStart);
	}

	int ret = print_char();
	printf("print_char ret : %d\n", ret);

	return 0;
}

簡易 x86で関数のサイズを調べる

#include "stdafx.h"

#include <map>
#include <vector>

#include <detours.h>
#pragma comment(lib, "detours.lib")

BOOL is_jcc_instruction(PBYTE pb)
{
	if (!pb)
		return FALSE;

	if (0x70 <= pb[0] && pb[0] <= 0x7F)
	{
		// jo, jno, jb, jnb, jz, jnz, jbe, ja, js, jns, jp, jnp, jl, jnl, jle, jnle
		return TRUE;
	}
	else if (pb[0] == 0xE3)
	{
		// jcxz
		return TRUE;
	}
	else if (pb[0] == 0xE9 || pb[0] == 0xEA || pb[0] == 0xEB)
	{
		// jmp long, jmp special, jmp short
		return TRUE;
	}
	else if (pb[0] == 0x0F && (0x80 <= pb[1] && pb[1] <= 0x8F))
	{
		// two bytes jump
		return TRUE;
	}

	return FALSE;
}

BOOL is_jmp_instruction(PBYTE pb)
{
	if (!pb)
		return FALSE;

	if (pb[0] == 0xE9 || pb[0] == 0xEA || pb[0] == 0xEB)
	{
		// jmp long, jmp special, jmp short
		return TRUE;
	}
	else if (pb[0] == 0xFF && pb[1] == 0x25)
	{
		// jmp dword ptr []
		return TRUE;
	}

	return FALSE;
}

int main()
{
	HMODULE hModule;
	LPVOID lpvFunction;

	//hModule = GetModuleHandle(_T("KERNEL32"));
	hModule = GetModuleHandle(_T("KERNELBASE"));
	//hModule = GetModuleHandle(_T("ntdll"));
	if (hModule == NULL)
	{
		printf("baka\n");
		return 1;
	}

	lpvFunction = GetProcAddress(hModule, "CreateFileA");
	if (!lpvFunction)
	{
		printf("baka\n");
		return 1;
	}

	//
	BYTE bDst[256];
	PVOID pDstPool;
	PVOID pSrc, pSrcNext;
	PVOID pTarget;
	LONG lExtra;
	UINT uSize;
	std::vector<PVOID> vpTarget;
	std::map<PVOID, BOOL> mpTarget;

	pSrc = lpvFunction;
	pDstPool = &bDst[256];

	do
	{
		lExtra = 0;
		pTarget = NULL;

		// Returns : the address of the next instruction
		pSrcNext = DetourCopyInstruction(bDst, &pDstPool, pSrc, &pTarget, &lExtra);

		// Get instruction size
		uSize = PBYTE(pSrcNext) - PBYTE(pSrc);

		// Move to next instruction
		pSrc = pSrcNext;

		if (pTarget)
		{
			if (is_jcc_instruction(bDst))
			{
				// jump if condition is met
				printf("jump if condition is met - target = %p\n", pTarget);

				vpTarget.push_back(pTarget);
				mpTarget[pTarget] = TRUE;
			}
			else if (bDst[0] == 0xFF)
			{
				if (bDst[1] == 0x15)
				{
					// call dword ptr []
					printf("call dword ptr [] - target = %p\n", pTarget);
				}
				else if (bDst[1] == 0x25)
				{
					// jmp dword ptr []
					printf("jmp dword ptr [] - target = %p\n", pTarget);
				}
			}
		}

		// printf("size = %d\n", uSize);
		if (bDst[0] == 0xCC)
		{
			// int 3
			break;
		}
		else if (bDst[0] == 0xC2 || bDst[0] == 0xC3)
		{
			// ret X
			auto it = mpTarget.find(pSrcNext);
			if (it == mpTarget.end())
			{
				// not found jump toward next instruction
				break;
			}

			// found jump toward next instruction
		}
		else if (is_jmp_instruction(bDst))
		{
			// jmp or jmp dword ptr []
			auto it = mpTarget.find(pSrcNext);
			if (it == mpTarget.end())
			{
				// not found jump toward next instruction
				break;
			}

			// found jump toward next instruction
		}
	} while (TRUE);

	printf("start = %p, end = %p, size = %d\n", lpvFunction, pSrcNext, PBYTE(pSrcNext) - PBYTE(lpvFunction));

	return 0;
}