-
-
未解决
[原创] 利用异常来固定某些验证算法的思路
-
发表于:
2019-1-31 22:41
2576
-
未解决 [原创] 利用异常来固定某些验证算法的思路
学习逆向和编程应该有1年的时间了,还记得刚开始学习时的自己真的太搞笑了!目前还是处于婴儿学步阶段哈哈! 平时自己爱研究破解一些市面上的验证 比如说某E 他其中有个JS算法 需要固定他生成的随机值(固定他有很多方法 但是呢不是很方便)我一直就想找一个通用的方法,直到我看到《加密与解密》HOOK篇其中的一个异常处理HOOK给了我灵感!
OD的CC断点和内存断点都是让程序产生异常,因为有调试器 他会将异常传递给调试器进行中断程序的执行。所以呢我也利用异常来找到合适的时候来跳过随机数生成!具体的作法就是将他要写入随机数的变量的内存属性页改为只读,当某一处对此处地址进行写入时就会产生异常,这时我们捕获到 更改EIP就可以跳到我们指定的地址!代码如下 只是举了一个简单的例子 !
#include "stdafx.h"
#include"atlstr.h"
DWORD g_dwAddBase ;//产生异常的地址
DWORD g_dwJmpBase ;//要跳转到的地址
DWORD g_dwPage;//保存原内存页属性
//参数是个结构体 很重要具体成员的作用自行查看微软MSDN
LONG WINAPI GetAbnormal(_EXCEPTION_POINTERS* ExceptionInfo )
{
MessageBox(NULL, "获取异常", NULL, MB_OK);
char szNewMsg[1024] = {};
LONG lRet = EXCEPTION_CONTINUE_SEARCH;//不处理异常时默认返回值
PEXCEPTION_RECORD pExceptionRecord = ExceptionInfo->ExceptionRecord;//获取异常信息
PCONTEXT pContextRecord = ExceptionInfo->ContextRecord;
int ret = 0;
ULONG_PTR* uEsp = 0;
CString strBase;
strBase.Format(_T("产生的异常地址为:%X"), (DWORD)pExceptionRecord->ExceptionAddress);
MessageBox(NULL, strBase, _T("捕获到异常"), MB_OK);
//判断所异常地址是否是计划中的
if ((DWORD)pExceptionRecord->ExceptionAddress==g_dwAddBase)
{
uEsp=(ULONG_PTR*)pContextRecord->Esp;//获取中断时ESP的值
pContextRecord->Eip = (ULONG_PTR) g_dwJmpBase;//将EIP设置为指定值
lRet = EXCEPTION_CONTINUE_EXECUTION;//返回值设置为继续执行
VirtualProtect((LPVOID)g_dwAddBase, 5, g_dwPage, NULL);//恢复原来的属性
}
return lRet;
}
BOOL AbnoRmalHook()
{
//安装VEH
return (BOOL)AddVectoredExceptionHandler(1, GetAbnormal);
}
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
VirtualProtect((LPVOID)g_dwAddBase, 5, PAGE_READONLY, &g_dwPage);
if (AbnoRmalHook())
{
MessageBox(NULL,"执行成功",NULL,MB_OK);
}
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}

看雪大神太多了 请不要笑我!感谢
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课