能力值:
( LV2,RANK:10 )
|
-
-
2 楼
if ( !strcmp("liuqiangni", "crackerme") )
{
MessageBoxA(0, "恭喜你,破解成功!", "提示", 0);
return 1;
}
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
|
能力值:
( LV13,RANK:260 )
|
-
-
4 楼
不知道lz 啥意思,不能修改文件...这句话,那验证部分你设计 那么样,怎么达到,
再说,直接将 crackmei 数据修改为liuqiangni ,再在 test 加入 tm.dll 即可..
lz 的意思 使用代码 实现 还是啥...
|
能力值:
( LV8,RANK:130 )
|
-
-
5 楼
所以我说这个题目不是个简单的题目啊,按我的要求,是用内存补丁实现,那么你用别的方法当然困难了,文件我没有加壳,你直接改文件那我这个题目不是白出了,新手都OK吧! 所以不要把这题想得太简单了.按我的要求做做,你就明白了! 大家努力! 这个题目是个很现实的问题!
越是简单的问题,越能看出你的本事! 我很相信这句话!
提示: 1.内存补丁. 2,需要自己编程来实现一些东西(DLL 内部的一些东西不明白的同学还是快补补吧!)
|
能力值:
( LV8,RANK:130 )
|
-
-
6 楼
注意: 题目是要把 Tm.dll 注入到TestA.exe中 ,也就是先运行TestA.exe,然后注入Tm.dll,我不管你用什么方法,只要不直接修改我的程序都可以(当然内存里面修改是可以的).你可以假设我这个2个程序都加上了你脱不掉的强壳.
|
能力值:
( LV3,RANK:20 )
|
-
-
7 楼
哥,你就直接说明你的用意吧,我怕你勉强摆迷魂阵,会把你弄晕的
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
看不懂楼主的意思到底是啥
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
要求: 1.
我给的附件里面有2个文件,一个TestA.exe ,一个Tm.dll 都没有壳. 所以,不能用修改文件来达到破解的目的!
2. 把Tm.dll 注入到TestA.exe 里面,要求 目标文件(TestA.exe)不关闭.
**************************************************************************
纵观楼主的俩要求,也没要求DLL到底是弹出失败,还是正确,要是这样的话,直接修改TestA.exe的标题名不就达到要求了。
|
能力值:
( LV13,RANK:260 )
|
-
-
10 楼
你是想 动态获取 加载基址子,该偏移+基址的 数据.如果是这样.
那就 hook loadlibrary ,获得base + vra 在写数据....lz题目既然出来了,就明确一下啊...
|
能力值:
( LV8,RANK:130 )
|
-
-
11 楼
我的意思还不明白么,很容易理解的呀. 注入保证程序不关闭,就是要让程序执行我DLL 的DllMain()初始化的时候不要执行我的关闭函数,或者你改掉跳转也行,只不过不要直接修改资源就OK
|
能力值:
( LV8,RANK:130 )
|
-
-
12 楼
其实你的理解是对的,我的意思是大家自己写个1.dll ,来LoadLibrary("Tm");然后修改Tm.dll 里面的跳转,达到目的.(其中必然要用到基址和重定位,这个好解决). 然后我们把 1.dll 注入目标程序里面. 但是这里面有个很大的问题: 就是我们虽然注入了,也加载了我们的Tm.dll 但是LoadLibrary() 执行的时候任然会先执行DllMain的初始化,所以验证任然是不成功的,然后才会执行我们的修改!
|
能力值:
( LV4,RANK:50 )
|
-
-
13 楼
hook SendMessage 不让调用wm_close就行了
|
能力值:
( LV8,RANK:130 )
|
-
-
14 楼
感谢大家的热心.现在缩小范围: 必须自己另外编写一个DLL,让这个DLL去加载我的Tm.dll,然后补丁之.再把自己写的DLL注入到目标程序,达到目标程序不关闭的作用! 大家可否做到..
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
直接拦截进入关键函数段之前的任意一个API不就可以补丁之了。
|
能力值:
( LV2,RANK:10 )
|
-
-
16 楼
.版本 2
.判断开始 (进程是否存在 (“dnf.exe”))
写到文件 (取System32目录 () + “\test.dll”, #辅助dll)
a = _装载DLL (“test.dll”)
b = _取库函数地址 (a, “RunDllHostCallBack”)
写内存字节集 (取进程ID (“dnf.exe”), a + 十六到十 (“E2C9”), 还原为字节集 (“E8093CFFFF”))
写内存字节集 (取进程ID (“dnf.exe”), a + 十六到十 (“CA70”), 还原为字节集(“909090909090”))
写内存字节集 (取进程ID (“dnf.exe”), a + 十六到十 (“C16A”), 还原为字节集 “909090909090”))
调用子程序2 (b, 0, 0, 0, , , , , , , , , )
信息框 (“破解成功!”, 0, )
.默认
信息框 (“dnf不存在!”, 0, )
这是破解一个DNF外挂时的dll补丁源码 (外挂的dll是加壳的)我们是给原dll补丁 然后再注入DNF.EXE
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
附件上传错了,说下自己的思路,得下周才能上传附件了.
按lz说的,关键是loadlibrary加载dll,会在函数返回之前调用dll的dllmain函数,而lz给出的dll关键就是在dllmain函数中打补丁,所以自己首先想到就是在dll已经加载到内存中,而没有有调用dllmain之前下钩子打补丁(od在调试dll的时候,也用到类似这种方法).
|
能力值:
( LV8,RANK:130 )
|
-
-
18 楼
关键是这个补丁怎么打,期待你的特别的回答!
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
#define PATCH_OFFSET 0x7070
#define TARGET_OFFSET 0x1187
#define TARGET_CODE1 0x8B0855FF
#define TARGET_CODE2 0x5E5F5BE6
#define JMP_CODE 0xE9
HMODULE g_hNtdll = NULL;
char g_szBuf[MAXBYTE] = {0};
char *g_pTmDll = "Tm.dll";
char *g_pStr = "crackerme";
void __declspec( naked ) FilterFun()
{
__asm
{
pushad
push MAXBYTE
push offset g_szBuf
push dword ptr [ebp+0xC] // Module base
mov eax, GetModuleFileNameA
call eax
test eax, eax
je RETURN
mov eax, StrStrA
push g_pTmDll
push offset g_szBuf
call eax
test eax, eax
je RETURN
// patch
mov edi, PATCH_OFFSET
add edi, dword ptr [ebp+0xc]
mov eax, StrCpyA
push g_pStr
push edi
call eax
RETURN:
popad
call dword ptr [ebp+8]
mov esi, esp
pop ebx
pop edi
pop esi
pop ebp
retn 10
}
}
void Hook()
{
HMODULE hNtdll = GetModuleHandle( "ntdll.dll" );
if( hNtdll == NULL ) return ;
g_hNtdll = hNtdll;
DWORD dwOldProtect = 0;
LPVOID lpTargetAdr = (LPVOID)( DWORD( hNtdll )+TARGET_OFFSET );
VirtualProtect( lpTargetAdr, 8, PAGE_EXECUTE_READWRITE, &dwOldProtect );
if( *((DWORD *)lpTargetAdr) == TARGET_CODE1 &&
*((DWORD *)lpTargetAdr+1) == TARGET_CODE2 )
{
// *
DWORD dwMCode = (DWORD)FilterFun-(DWORD)lpTargetAdr-5;
*((BYTE *)lpTargetAdr) = JMP_CODE;
*((DWORD *)((DWORD)lpTargetAdr+1)) = dwMCode;
}
VirtualProtect( (LPVOID)lpTargetAdr, 8, dwOldProtect, &dwOldProtect );
}
void UnHook()
{
HMODULE hNtdll = GetModuleHandle( "ntdll.dll" );
if( hNtdll == NULL ) return ;
g_hNtdll = hNtdll;
LPVOID lpTargetAdr = (LPVOID)( DWORD( hNtdll )+TARGET_OFFSET );
DWORD dwOldProtect = 0;
VirtualProtect( lpTargetAdr, 8, PAGE_EXECUTE_READWRITE, &dwOldProtect );
*((DWORD *)lpTargetAdr) = TARGET_CODE1;
*((DWORD *)lpTargetAdr+1) = TARGET_CODE2;
VirtualProtect( (LPVOID)lpTargetAdr, 8, dwOldProtect, &dwOldProtect );
}
void PatchProcess(HANDLE hProcess)
{
/* -Patch- */
Hook();
LoadLibrary( "Tm.dll" );
UnHook();
}
|
|
|