我的逆向工具库 libKTLtdx

不占用debugger。你可以同时在一个进程使用debugger,配合本软件一齐使用。无须中断暂停进程。我是配合windbg+ida一起使用的。

原本用于调试通达信,因为通达信做了anti-debugging。一用调试器就结束进程。所以我就不用调试器。想知道通达信anti-debugging做了多少工作,have a try。

逆向通达信Level-2 续十一 (无帐号登陆itrend研究版)

逆向通达信Level-2 续十 (trace脱壳)

逆向通达信Level-2 续九 (无帐号打开itrend研究版)

逆向通达信Level-2 续八 (BackTrace, Trace任意TdxW.exe内部函数, Breakin) 

逆向通达信Level-2 续七 (调试WebView)

逆向通达信Level-2 续六 (调试pad控件)

逆向通达信Level-2 续五 (调试HWND窗口)

逆向通达信Level-2 续四 (调试level2数据接口)

逆向通达信Level-2 续三 (KTL python控制台动态调试)

通达信金融终端解锁Level-2功能 续二 (非法调试 I say NO)

通达信金融终端解锁Level-2功能 续(202307)

解锁通达信金融终端Level-2功能

后来用于逆向分析PC微信客户端,证明有一定通用性。

逆向WeChat(八, xlog日志文件)

现在公开一个基础版本。这版本是比较原始的版本,基于javascript交互,由于chrome架构下v8引擎的工作方式,所以有局限性。v8在renderer进程。目标调试进程在browser进程。并且v8不允许直接访问内存地址,即使用单进程模式。

github地址: https://github.com/bbqz007/libKTLtdx

该版本使用通达信的libcef。只适合2023年以后的通达信软件。如果目标进程是其它软件,但使用了libcef,会冲突。

 

 

如何使用,首先就是要注入目标进程,或者你在进程自己加载。

提供简单的注入方法。

先列出你的目标进程。

 复制进程id,然后调用ktl.debug.inject()。

 

三个基础功能。所有功能都基于这三基础。KTL javascript 可以进行win32编程。而且无须编译的JIT win32编程。

caller用于调用.text段代码。caller串行在主UI线程。caller2并行在线程池。

access用于访问内存。

 

caller通过符号调用代码

caller直接指定地址调用代码

caller一共提供4种调用约定,winapi, capi, fastapi, thisapi,分别对应c代码的__stdcall, __cdelc, __fastcall, __thiscall。这4个函数绑定一个入口地址并返回一个函数。参数没有严格类型限制,每个参数占一个4字节。需要你明白参数是如何排位的。1,2,4字节都占一个4字节。

access内存访问,提供python的unpack跟pack,类似的函数,通过fmt来松散访问,不要严格的结构体。

我将内存访问封装成 asRaw(addr)  对象。可以用fmt函数迅捷以各种格式访问这个地址的内存。offset()函数偏移地址。如 pe = asRaw(dos_addr).offset(e_lfanew)就得到PE_addr的访问子。

由于chrome多进程v8的关系带来的局限性。我们的js代码只能访问的是v8层的ArrayBuffer。所以只能先将目标进程地址的内容加载到ArrayBuffer。同样只能一次过将ArrayBuffer写到目标进程地址。

(browser or target) phyc memory <> (renderer or v8engine) ArrayBuffer。   

这也是为什么,上面三个基础功能都是async的。

由于javascrpit没有析构函数,所有为方便进行win32编程时当在函数结束时正确释放zalloc的内存,关闭句柄等,提供下面代码套间模板。

	let ret = {}
	let scope_free = [];
	let scope_dtor = [];
	let need_throw = null;
	try {
		await
		(async function() {
			// TO DO:
		})();
	} catch (e) {
		need_throw = e;
	}
	scope_free.map(p=>{
		ktl.async_caller2.await_cmd({c:'free',a:[p]});
	});
	scope_dtor.map(f=>{f()});
	if (need_throw)
		throw need_throw;
	return ret;

  

 

两个基本工具包,struct跟debug。完全由 javascript plus 上面三个基础功能进行win32编程实现。

struct工具包,实现类似python的struct。主要用来解析或编码ArrayBuffer。格式化解析,字符串解析,hex串解析。

ktl.struct.pack(fmt, ...arg) -> ArrayBuffer;
ktl.struct.unpack(fmt, arrayBuffer) -> Array;
ktl.struct.calcsize(fmt);
ktl.struct.tohex (arrayBuffer) -> string;
ktl.struct.fromhex (hexstring) -> ArrayBuffer;
ktl.struct.dec_gbk (arrayBuffer) -> string;
ktl.struct.dec_utf8 (arrayBuffer) -> string;
ktl.struct.dec_unicode (arrayBuffer) -> string;
ktl.struct.enc_utf8 (string) -> ArrayBuffer;
ktl.struct.enc_unicode (string) -> ArrayBuffer;
ktl.struct.hex (integer|arrayBuffer) -> string;

下面两个函数可以作为代码例子,如何使用ktl.struct。

ktl.struct.custom.read_dos_header(addr) -> object;
ktl.struct.custom.unpack__MEMORY_BASIC_INFORMATION32(arrayBuffer) -> object;

 

 

 

debug工具包。

ktl.debug.info.addr (addr);
ktl.debug.info.process ();
ktl.debug.disassemble (addr, count);
ktl.debug.assemble (assembly, baseaddr);
ktl.debug.lm ();
ktl.debug.tasklist (name);
ktl.debug.vprot (addr, size, protection);
ktl.debug.dlopen (fullpath) -> addr;

ktl.debug.dlsym (dllname, symbol) -> addr;
ktl.debug.inject (pid);

 

ktl.debug.info.addr()。

提供地址检测,属于哪个模块,所在内存段的属性,只读?读写?可执行?

ktl.debug.disassemble(), ktl.debug.assemble()。 

提供汇编代码编译,反编译。用js直接进行win32编程,用keystone跟capstone实现。

ktl.debug.vprot()。

提供vprot,类似mprotect。vprot,就是virtual address protection修改,动态patch汇编代码,只读段内容等所必须前置操作。

将上面的指令配合来使用,示例一段patch。

 

控制台

默认处在KTL javacript控制台,以单行代码执行的方式。

非async函数的执行结果,更新到$$a。

async函数的执行结果,更新到$$_。

如果要进行多行代码编辑时,ctrl+`或alt+`切换成coding编辑模式。

posted on 2025-03-23 01:28  bbqz007  阅读(437)  评论(0)    收藏  举报