能力值:
( LV2,RANK:10 )
|
-
-
2 楼
找个dll,定位到这个函数提取特征,去目标程序搜索
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
他调用是libcurl库,直接编译到程序中
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
https://github.com/topics/libcurl 应该是嵌入这个库
|
能力值:
( LV2,RANK:10 )
|
-
-
5 楼
dll我也找了一个,然后如何找相对地址
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
基地址应该是这样,uint64_t base_addr = (uint64_t)GetModuleHandleA(NULL); 就是后面的对应函数的偏移量是多少
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
PathOfExile.exe+0x2125090
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
寻找方法有很多,简单说说,抛砖引玉。 1.使用idasdk flair中sig工具制作libcurl静态库的sig文件,使用ida加载sig,函数体比较短的函数特征可能会有冲突。 2.https://github.com/curl/curl/blob/master/lib/setopt.c#L3180 此函数有一分支retrun CURLE_BAD_FUNCTION_ARGUMENT; 这个宏其值是43,通过43慢慢找或用来佐证是此函数。 3.使用ida的lumina符号服务检索函数名,实测可以识别出大量CURL函数。 4.通过其内部调用的函数Curl_vsetopt进行交叉引用查找,前提是定位到Curl_vsetopt,定位方法同理。这个函数内部有一堆字符串("SESS" "FLUSH"之类)。
最后于 2023-7-12 19:36
被一笑人间万事编辑
,原因:
|
能力值:
( LV4,RANK:45 )
|
-
-
9 楼
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
git上两个开源的lumina服务器已经不适用最新的ida8.3了,协议改动了。
|
能力值:
( LV2,RANK:10 )
|
-
-
11 楼
感谢各位大神,现在这个地址貌似是对的,但是用delphi代码去验证是否对的时候,64位程序总是不停崩溃,网上查资料说是delphi和c++的fastcall函数调用方式不一致,需要对齐,但是不知道如何对齐,不知道是验证程序问题还是地址可能有错。这个问题属于衍生问题,当一起解决后,我会另外开贴单独补雪花,方才试了下,不能直接编辑雪花值,只能再开新帖后面。代码如下 var curl_easy_setoptCallNext: function(handle : int64; option : int64; params: int64) : Int64; register;
function curl_easy_setoptWrap(handle : int64; option : int64; params: int64) : Int64; register; begin Result := curl_easy_setoptCallNext(handle, option, params); Writelog('my.log', 'call option='+inttostr(option); end;
function curl_easy_setoptCallBack : Int64; register; asm MOV EdX,ECX //网上拷贝的对齐方法,可能是错的 JMP curl_easy_setoptWrap end;
var p1: Pointer; p1 := Pointer(GetModuleHandleA(nil)+$2125090); HookCode(p1, @curl_easy_setoptCallBack, @curl_easy_setoptCallNext);
|
能力值:
( LV2,RANK:10 )
|
-
-
12 楼
我先结贴,然后贴个c的代码,大神帮忙看下这个定义对不对, pascal的我另外开贴,先搞c的 #include <stdint.h> #include "minhook/include/MinHook.h"
typedef uint16_t(__fastcall* curl_easy_setopt_direct_t)(uint64_t handle, uint8_t option, uint64_t param); curl_easy_setopt_direct_t curl_easy_setopt_direct = NULL;
HMODULE g_hmod = NULL; uint64_t curl_dedupe_addr = 0;
uint16_t __fastcall curl_easy_setopt_hooked(uint64_t handle, uint8_t option, uint64_t params) { return curl_easy_setopt_direct(handle, option,params); }
void initialize() { // set up function hooks uint64_t base_addr = (uint64_t)GetModuleHandleA(NULL); curl_dedupe_addr = base_addr + 0x2125090;
MH_Initialize(); MH_CreateHook((LPVOID)curl_dedupe_addr, &curl_easy_setopt_hooked, (LPVOID*)&curl_easy_setopt_direct); MH_EnableHook((LPVOID)curl_dedupe_addr);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReversed) { switch (fdwReason) { case DLL_PROCESS_ATTACH: g_hmod = hinstDLL; initialize();
break; case DLL_PROCESS_DETACH: MH_Uninitialize(); break; }
return TRUE; } 正确定义是
typedef uint64_t(__fastcall* curl_easy_setopt_direct_t)(uint64_t handle, uint64_t option, uint64_t param);?
|
|
|